2009-08-04 68 views
1

我想在OS X(最新和最好的)上做一个Google App Engine项目。我使用的是javax.crypto中的类,当我尝试初始化一个Mac类的实例时,我看到一个AccessControlException异常。这里的堆栈跟踪:在OS X上的Java 1.5加密 - 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 - 如果它不是可以解决的(我知道苹果一直没有Java的最佳支持者近年来),另一种方法是什么?

回答

1

发现了一个workround上google groups

“要解决当地的苹果SDK的问题,您可以通过 --jvm_flag = -D - enable_all_permissions =忠于你dev_appserver这将 导致错误。 “

1

我有一个更完整的答案,但没有访问苹果的加密提供程序源,我们永远不会完全确定需要什么权限。所有的平台。这是我能得到雪豹工作:

你需要有求必应代码库需要加密以下权限:

盛大的代码库“你的/代码/基地” { 许可的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目录中找到它之前访问前两个位置。其他版本的操作系统和其他版本的操作系统可能会有其他或不同的搜索路径,因此解决每个平台问题的唯一方法是尝试,查看安全权限异常,授予文件许可权,然后重试,直到它工作。乐趣。

一个重要的警告是,如果您尝试将加密库加载到一个不属于此代码库的类加载器中,则尝试再次将其加载到另一个属于代码库的类加载器中,那么您将得到一个“本机库已经加载到另一个类加载器“异常。