PKCS11Exception:CKR_KEY_FUNCTION_NOT_PERMITTED

时间:2012-01-16 22:32:38

标签: java cryptography

你知道,我有一个applet根据pkcs11令牌中的RSA私钥解密一些信息。
在巴西,现在有一些新证书包含一个2048位的私钥。还有常规1024位的旧型号 到现在为止,我的应用程序运行良好。我使用的是1024位证书,所以没有麻烦。但是现在我有一些新的证书要测试,它崩溃了标题错误:

  

PKCS11Exception:CKR_KEY_FUNCTION_NOT_PERMITTED

btw:它仍然适用于1024位。

at sun.applet.AppletPanel.run(未知来源)         在java.lang.Thread.run(未知来源)     引起:sun.security.pkcs11.wrapper.PKCS11Exception:CKR_KEY_FUNCTION_NOT_PERMITTED         at sun.security.pkcs11.wrapper.PKCS11.C_DecryptInit(Native Method)         at sun.security.pkcs11.P11RSACipher.initialize(P11RSACipher.java:260)         at sun.security.pkcs11.P11RSACipher.implInit(P11RSACipher.java:193)

我使用标准的java安全命名空间。我已经读过某些地方,Java在政策上有限制,与美国如何对待安全有关,我不知道...... 有没有关系?
我知道我必须使用bouncyCastle提供程序,但我只是想知道...

尽管如此,BC不能使用P11PrivateKey,因为它使用硬件进行签名或加密。

结论:

正如我发现的那样,感谢owlstead,在etoken属性中,关键不是为那个porpouse ...上帝......

不起作用的那个:

  
    

序列号:( ...)
    发给:(......)
    发布者:(......)
    有效期:( ...)
    有效期至:(...)
    预期用途:客户端身份验证,安全电子邮件
    键大小:2048位
    集装箱名称:( ...)
    模数:(...)
    主要规格: AT_KEYSIGNATURE

  

另一个,有效的那个:

  
    

序列号:( ...)
    发给:(......)
    发布者:(......)
    有效期:( ...)
    有效期至:(...)
    预期用途:安全电子邮件,客户端身份验证,智能卡登录
    密钥大小:1024位
    集装箱名称:( ...)
    模数:(...)
    主要规格: AT_KEYEXCHANGE
    默认密钥容器:
    辅助密钥容器:

  

我知道 AT_KEYEXCHANGE 本身并不意味着可以解密,但 AT_KEYSIGNATURE 意味着只能用于该porpouse。而且我已经测试过一个适用于签名......

2 个答案:

答案 0 :(得分:4)

它与Java密钥长度无关。对于所有这些值,Java可能甚至不知道密钥大小,因为密钥保留在硬件令牌上。将CKA_ENCRYPT属性设置为CK_BALSE的CK_BBOOL值的可能性更大。

来自PKCS#11 v2.20(cryptoki)

  

CKR_KEY_FUNCTION_NOT_PERMITTED:已尝试使用密钥   出于加密目的,密钥的属性未设置为   允许它做。例如,要使用密钥执行加密,   该密钥必须将其CKA_ENCRYPT属性设置为CK_TRUE(事实   密钥必须具有CKA_ENCRYPT属性意味着密钥   不能是私钥)。此返回值的优先级低于   CKR_KEY_TYPE_INCONSISTENT。

答案 1 :(得分:3)

您正在混合PKCS#11(CKR_XXX)和CryptoAPI(AT_XXX)。您可以使用pkcs11-tool或pkcs11-dump(google)列出您拥有的对象的属性。