当密钥由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();
尝试获取上述私钥时查看异常。
答案 0 :(得分:1)
Keytool在生成密钥条目时自动生成自签名证书,而PKCS#11允许创建没有相应证书的密钥对。
Java密钥库API只是忽略没有证书的密钥对条目。这就是为什么keytool -list ...
在使用pkcs11-tool
创建条目时不会显示该条目的原因。如果你看看Oracle PKCS#11 guide,特别是限制,它会说:
一旦私钥和证书已匹配(并且其证书链已构建),该信息将存储在私钥中,其中来自最终实体证书的CKA_LABEL值为KeyStore别名。
...
忽略不属于私钥条目或可信证书条目的任何私钥或证书对象。
因此,当您致电keyStore.getEntry("jtest", null);
时,它找不到匹配的密钥条目,这会导致以下行中的NPE。