Ключи, сгенерированные 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 в следующей строке.

Другие вопросы по тегам