使用sunPKCS11提供程序生成密钥对时为CKR_USER_NOT_LOGGED_IN

时间:2018-12-04 10:48:46

标签: pkcs#11 hsm sunpkcs11

当尝试使用sun PKCS11提供程序生成rsa密钥对时,方法generateKeyPair()抛出ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_USER_NOT_LOGGED_IN

我的代码如下:

Provider prov = ... // initialize provider

KeyStore ks = KeyStore.getInstance("PKCS11", prov);
ks.load(null, "pass".toCharArray());

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", prov);
keyGen.initialize(2048);
KeyPair kp = keyGen.generateKeyPair();    // exception thrown here

我在提供程序初始化后立即尝试使用AuthProvider,如下所示:

AuthProvider aprov = (AuthProvider) prov;
aprov.login(null, callbacks -> {
    log.error("@@@ Inside callbacks {}", callbacks.length);
});
aprov.setCallbackHandler(callbacks -> {
    log.error("@@@ Inside setCallBackHandler {}", callbacks.length);
});

但是我看不到任何日志记录输出,因此意味着不执行lambda。

最终目标是生成RSA密钥对,并通过PKCS11将其存储在密钥库(HSM)中。

我尝试使用openjdk 8和oracle jdk8。另外,当从密钥库列出别名时,我得到一个空列表,但是我知道只有一个条目。添加-Djava.security.debug=sunpkcs11并没有改变。

1 个答案:

答案 0 :(得分:1)

我的问题是提供商配置中的插槽号错误。所选的插槽被标记为“加速器”,不支持从HSM文档中创建“私有对象”。

切换到另一个插槽后,便可以生成密钥并将其存储到密钥库中。