2009-08-04 4 views
1

Я пытаюсь выполнить проект Google App Engine на OS X (последний и самый большой). Я использую классы из javax.crypto, и я вижу исключение AccessControlException, когда пытаюсь инициализировать экземпляр класса Mac. Вот трассировки стека:Java 1.5 crypto on 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) 

Любые идеи о

1 - то, что пошло не так и как это исправить

2 - если это не поправимо (я знаю, что Apple, не был лучшим сторонником Java в последние годы), каков альтернативный подход?

ответ

1

Нашли workround на google groups:

«Для того, чтобы работать вокруг локальной проблемы Mac SDK, вы можете передать --jvm_flag = -D - enable_all_permissions = верен своему dev_appserver Это вызвать ошибку в. уйти, но, к сожалению, также отключит большую часть проверки безопасности в вашей локальной среде ».

1

У меня есть более полный ответ, но без доступа к источнику источника криптографии Apple мы никогда не будем полностью уверены, какие разрешения необходимы для все их платформы. Вот что я смог работать на ирбис:

Вы должны будете предоставить все, что кодовый нуждается в криптографии следующих разрешений:

великой кодовой база «ваш/код/​​базовую» { разрешения java.lang .RuntimePermission "loadLibrary.keychain"; разрешение java.io.FilePermission "/ System/Library/Java/Extensions/-", "read"; разрешение java.io.FilePermission "/ Library/Java/Extensions/-", "read"; разрешение java.io.FilePermission "/System/Library/Frameworks/JavaVM.framework/-", "read"; };

Похоже, что существует какой-то поиск файла libkeychain.jnilib, который посещает первые два местоположения, прежде чем найти его в каталоге Frameworks OSX 10.6.2 для Java 1.6. Другие версии java и других версий ОС могут иметь дополнительные или разные пути поиска, поэтому единственный способ решить эту проблему для каждой платформы - попробовать, увидеть исключение разрешения безопасности, предоставить разрешение на файл, а затем повторить попытку, пока он не будет работать. Весело.

Один важный оговорка, если вы попытаетесь загрузить библиотеку крипто в один загрузчик классов, который не является частью этой кодовой базы, попробуйте загрузить его снова в другой загрузчик классов, который является частью кодовой базы, тогда вы получите «родную библиотеку» уже загружено в другое «загрузчик классов».