OS X上的Java 1.5加密 - AccessControlException

时间:2009-08-04 19:56:48

标签: java google-app-engine macos cryptography

我正在尝试在OS X上进行Google App Engine项目(最新和最好)。我正在使用来自javax.crypto的类,当我尝试初始化Mac类的实例时,我看到抛出了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的最佳支持者),那么另一种方法是什么?

2 个答案:

答案 0 :(得分:1)

google groups找到了一个workround:

“要解决本地Mac SDK问题,您可以通过 --jvm_flag = -D - enable_all_permissions = true到您的dev_appserver。这将 导致错误消失,但不幸的是也会禁用大部分错误 在当地环境中进行安全检查。 “

答案 1 :(得分:1)

我有一个更完整的答案,但无法访问Apple的加密提供程序源,我们永远不会完全确定所有平台上需要什么权限。这就是我能够为雪豹工作的原因:

您需要将以下权限的密码授予任何代码库:

grand codebase“your / code / base”{     permission java.lang.RuntimePermission“loadLibrary.keychain”;     permission java.io.FilePermission“/ System / Library / Java / Extensions / - ”,“read”;     permission java.io.FilePermission“/ Library / Java / Extensions / - ”,“read”;     permission java.io.FilePermission“/System/Library/Frameworks/JavaVM.framework/-”,“read”; };

似乎有一些搜索libkeychain.jnilib文件,该文件在OSX 10.6.2 for Java 1.6上的Frameworks目录中找到之前访问前两个位置。其他版本的Java和其他版本的操作系统可能有其他或不同的搜索路径,因此解决每个平台的唯一方法是尝试,查看安全权限异常,授予文件权限,然后再试一次,直到它工作。乐趣。

一个重要的警告,如果您尝试将加密库加载到一个不属于此代码库的类加载器中,然后尝试将其再次加载到另一个类代码中,该类加载器是代码库的一部分,那么您将获得一个“本机库”加载到另一个类加载器“exception。