当密钥由pkcs11 11-工具生成时,当我试图从java pkcs11密钥存储库获取私钥时,我看到了一个空指针异常。如果键是使用keytool生成的,这是很好的。我也可以列出pkcs11 11工具中的密钥,但不能从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(); 当试图获取上面的私钥时,请参阅异常。
发布于 2018-02-21 14:00:00
Keytool在生成密钥项时自动生成自签名证书,而PKCS#11允许在没有相应证书的情况下创建密钥对。
只是简单地忽略没有证书的密钥对条目。这就是为什么keytool -list ...在使用pkcs11-tool创建条目时不显示条目的原因。如果你看一看甲骨文PKCS#11指南,特别是这些限制,它说:
一旦匹配了私钥和证书(以及它的证书链),这些信息就存储在一个私钥条目中,其中包含来自end实体证书的CKA_LABEL值作为KeyStore别名。 ..。 不属于私钥项或受信任证书项的任何私钥或证书对象都将被忽略。
因此,当您调用keyStore.getEntry("jtest", null);时,它将找不到匹配的键项,这将导致下面一行中的NPE。
https://stackoverflow.com/questions/48896395
复制相似问题