java中的pkcs11-tool生成的密钥未加载到pkcs11密钥库中

时间:2018-02-21 00:25:47

标签: java security pkcs#11 softhsm

当密钥由pkcs11-tool生成时,我在尝试从java pkcs11密钥库获取私钥时看到空指针异常。如果使用keytool生成密钥,这可以正常工作。我可以列出来自pkcs11-tool的密钥,但不能列出来自keytool的密钥。导入或生成除keytool之外的密钥的正确方法是什么,以便它们对java pkcs11密钥库可见?

生成密钥: pkcs11-tool --module /usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so -l --pin --keypairgen --key-type rsa:2048 --label jtest

从java加载并访问密钥(代码片段):

    String configName = "/tmp/pkcs11.cfg";
    Provider p = new SunPKCS11(configName);
    Security.addProvider(p);

    char[] pin = "<pin>".toCharArray();
    KeyStore keyStore = KeyStore.getInstance("PKCS11", p);
    keyStore.load(null, pin);
    PrivateKeyEntry privateKeyEntry =
                    (PrivateKeyEntry)keyStore.getEntry("jtest", null);
    PrivateKey privateKey = privateKeyEntry.getPrivateKey(); 

尝试获取上述私钥时查看异常。

1 个答案:

答案 0 :(得分:1)

Keytool在生成密钥条目时自动生成自签名证书,而PKCS#11允许创建没有相应证书的密钥对。

Java密钥库API只是忽略没有证书的密钥对条目。这就是为什么keytool -list ...在使用pkcs11-tool创建条目时不会显示该条目的原因。如果你看看Oracle PKCS#11 guide,特别是限制,它会说:

  

一旦私钥和证书已匹配(并且其证书链已构建),该信息将存储在私钥中,其中来自最终实体证书的CKA_LABEL值为KeyStore别名。

     

...

     

忽略不属于私钥条目或可信证书条目的任何私钥或证书对象。

因此,当您致电keyStore.getEntry("jtest", null);时,它找不到匹配的密钥条目,这会导致以下行中的NPE。