2009-08-04 22 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目錄中找到它之前訪問前兩個位置。其他版本的操作系統和其他版本的操作系統可能會有其他或不同的搜索路徑,因此解決每個平臺問題的唯一方法是嘗試,查看安全權限異常,授予文件許可權,然後重試,直到它工作。樂趣。

一個重要的警告是,如果您嘗試將加密庫加載到一個不屬於此代碼庫的類加載器中,則嘗試再次將其加載到另一個屬於代碼庫的類加載器中,那麼您將得到一個「本機庫已經加載到另一個類加載器「異常。