如何在applet中使用MSCAPI来加载密钥库

时间:2011-06-28 19:57:43

标签: java applet digital-signature cryptoapi

我有一个小程序,允许用户使用他们的个人证书签署文件。 applet已经签名,但是当它尝试加载他们的密钥库时,我得到一个与sunMSCAPI相关的访问被拒绝错误。这是由以下代码行引起的:

store = KeyStore.getInstance("Windows-MY");
store.load(null, null);

根据我对applet签名的理解,签名过程之后没有其他步骤我需要跳过(编辑策略文件等)。我尝试将所有applet功能包装在:

AccessController.doPrivileged(new PrivilegedAction() {
  public Object run() {
    etc...

但这没有帮助。我已经扎根并在各种论坛上发现了一些评论,即sunMSCAPI仅在JDK 6中可用...我已经得到了。我的想法已经不多了,任何帮助都会受到赞赏。

对于潜在的援助,这里是访问被拒绝错误的堆栈跟踪:

java.security.AccessControlException: access denied (java.security.SecurityPermission authProvider.SunMSCAPI)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at sun.security.mscapi.KeyStore.engineLoad(KeyStore.java:736)
    at sun.security.mscapi.KeyStore$MY.engineLoad(KeyStore.java:43)
    at java.security.KeyStore.load(Unknown Source)
    at com.bloop.signature.PKCS11.loadKeyStore(PKCS11.java:42)
    at com.bloop.signature.PKCS11.sign(PKCS11.java:29)
    at com.bloop.signature.applet.SignApplet.signDocument(SignApplet.java:103)
    at com.bloop.signature.applet.SignApplet.access$200(SignApplet.java:19)
    at com.bloop.signature.applet.SignApplet$1.run(SignApplet.java:64)
    at java.lang.Thread.run(Unknown Source)

1 个答案:

答案 0 :(得分:1)

我用来签署applet的密钥库似乎无效。我生成了一个新的,用它签名,清除了java缓存,一切都开始运行良好。

为了完整起见,这是我为生成新商店而运行的命令:

keytool -genkey -alias keyPair -keyalg RSA -validity 500 -keystore myKeyStore -keypass <password> -storepass <password> -dname "<CN,OU,O,L,ST,C details>"

如果其他人遇到过这个问题,希望以上有帮助。