Ключи, сгенерированные pkcs11-инструментом в java, не загружаются в хранилище ключей pkcs11
Я вижу исключение нулевого указателя при попытке получить закрытый ключ из хранилища ключей java pkcs11, когда ключ генерируется инструментом pkcs11. Это прекрасно работает, если ключ генерируется с помощью keytool. Я могу также перечислить ключи из pkcs11-tool, но не из keytool. Как правильно импортировать или сгенерировать ключи, отличные от keytool, чтобы они были видны в хранилище ключей java pkcs11?
Генерация ключей: pkcs11-tool --module /usr/lib/x86_64-linux-gnu/softhsm/libsofthsm2.so -l --pin --keypairgen - тип ключа 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 ответ
Keytool автоматически генерирует самоподписанный сертификат, когда генерирует запись ключа, тогда как PKCS#11 позволяет создавать пару ключей без соответствующего сертификата.
API хранилища ключей Java просто игнорирует записи пары ключей без сертификата. Вот почему keytool -list ...
не показывает запись, когда она была создана с pkcs11-tool
, Если вы посмотрите на руководство по Oracle PKCS#11 и особенно на ограничения, оно говорит:
Как только закрытый ключ и сертификат сопоставлены (и его цепочка сертификатов построена), информация сохраняется в записи личного ключа со значением CKA_LABEL из сертификата конечного объекта в качестве псевдонима KeyStore.
...
Любой закрытый ключ или объект сертификата, не являющийся частью записи закрытого ключа или записи доверенного сертификата, игнорируется.
Поэтому, когда вы звоните keyStore.getEntry("jtest", null);
он не находит соответствующую ключевую запись, которая вызывает NPE в следующей строке.