2009-08-04 7 views
1

Ich versuche, ein Google App Engine-Projekt auf OS X (neueste und beste) zu tun. Ich verwende Klassen von javax.crypto und es wird eine AccessControlException ausgelöst, wenn ich versuche, eine Instanz der Mac-Klasse zu initialisieren. Hier ist der Stack-Trace:Java 1.5 Krypto auf OS X - AccessControlException

WARNING: Nested in java.lang.ExceptionInInitializerError: 
java.security.AccessControlException: access denied (java.lang.RuntimePermission loadLibrary.keychain) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) 
    at java.security.AccessController.checkPermission(AccessController.java:427) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:76) 
    at java.lang.SecurityManager.checkLink(SecurityManager.java:818) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:816) 
    at java.lang.System.loadLibrary(System.java:993) 
    at com.apple.crypto.provider.HmacCore.<clinit>(HmacCore.java:26) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:494) 
    at java.lang.Class.newInstance0(Class.java:350) 
    at java.lang.Class.newInstance(Class.java:303) 
    at java.security.Provider$Service.newInstance(Provider.java:1130) 
    at javax.crypto.Mac.a(DashoA12275) 
    at javax.crypto.Mac.init(DashoA12275) 

Irgendwelche Ideen auf

1 - was schief gelaufen ist und wie fix it

2 - wenn es nicht fixierbar ist (ich weiß, Apple hat nicht die beste Fan von Java gewesen in den letzten Jahren), was ist ein alternativer Ansatz?

Antwort

1

eine workround auf google groups Gefunden:

„um das lokale Problem Mac SDK zu umgehen, können Sie --jvm_flag pass = -D - enable_all_permissions = auf Ihre dev_appserver wahr Dies wird den Fehler verursachen zu. weggehen, wird aber leider auch die meisten der Sicherheit deaktivieren in Ihrer lokalen Umgebung zu überprüfen. "

1

ich habe eine vollständigere Antwort aber ohne Zugriff auf Apples Crypto Provider Quelle werden wir nie ganz sicher sein, was die Berechtigungen für erforderlich alle ihre Plattformen. Hier ist, was ich in der Lage war für Schneeleopard zum Laufen zu bringen:

Sie müssen gewähren, was Code-Basis des Krypto folgende Berechtigungen benötigt:

grand Code-Basis „Ihr/code/base“ { Erlaubnis java.lang .RuntimePermission "loadLibrary.keychain"; Berechtigung java.io.FilePermission "/ System/Library/Java/Extensions/-", "read"; Berechtigung java.io.FilePermission "/ Library/Java/Extensions/-", "read"; Berechtigung java.io.FilePermission "/System/Library/Frameworks/JavaVM.framework/-", "read"; };

Es scheint, dass eine Art Suche nach der Datei libkeychain.jnilib stattfindet, die die ersten beiden Speicherorte besucht, bevor sie im Frameworks-Verzeichnis unter OSX 10.6.2 für Java 1.6 gefunden wird. Andere Versionen von Java und anderen Versionen des Betriebssystems können zusätzliche oder andere Suchpfade haben, so dass die einzige Möglichkeit, es für jede Plattform zu lösen, versuchen, die Sicherheitsberechtigungsausnahme zu sehen, eine Dateiberechtigung zu erteilen und es erneut zu versuchen. Spaß.

Ein wichtiger Vorbehalt, wenn Sie versuchen, die Crypto-Bibliothek in einen Classloader zu laden, der nicht Teil dieser Codebase ist, versuchen Sie es erneut in einen anderen Classloader zu laden, dann erhalten Sie eine "native Bibliothek" bereits in einer anderen Classloader "Exception" geladen.