3

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

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

4

1 回答 1

2

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

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

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

...

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

因此,当您调用keyStore.getEntry("jtest", null);它时,找不到匹配的键条目,这会导致下一行出现 NPE。

于 2018-02-21T14:00:00.800 回答