Шифрование Java 1.5 в OS X - AccessControlException - PullRequest
1 голос
/ 04 августа 2009

Я пытаюсь сделать проект Google App Engine на OS X (последний и самый лучший). Я использую классы из javax.crypto и вижу исключение AccessControlException, которое возникает при попытке инициализировать экземпляр класса Mac. Вот трассировка стека:

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 в последние годы), каков альтернативный подход?

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

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

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

великая база кодов "ваш / код / ​​база" { разрешение java.lang.RuntimePermission "loadLibrary.keychain"; разрешение java.io.FilePermission "/ Система / Библиотека / Java / Расширения / -", "Чтение"; разрешение java.io.FilePermission "/ Библиотека / Java / Расширения / -", "Чтение"; разрешение java.io.FilePermission "/System/Library/Frameworks/JavaVM.framework/-", "читать"; };

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

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

1 голос
/ 05 августа 2009

Найден обходной путь в группах Google :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...