当由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 <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();


尝试获取上面的私钥时,请参阅异常。

最佳答案

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

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


  匹配私钥和证书(并建立其证书链)后,该信息将存储在私钥条目中,并将最终实体证书中的CKA_LABEL值作为KeyStore别名。
  
  ...
  
  不属于私钥条目或受信任证书条目的任何私钥或证书对象都将被忽略。


因此,当您调用keyStore.getEntry("jtest", null);时,找不到匹配的密钥条目,这将在下一行中引起NPE。

关于java - Java中的pkcs11-tool生成的 key 未加载到pkcs11 keystore 中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48896395/

10-15 20:46