java.security.NoSuchAlgorithmException: PKCS11 KeyStore недоступен, попытка включить режим FIPS с помощью SUNPKCS11 в java 11

Я пытаюсь включить режим FIPS, используя SUNPKCS11 с NSS в Java 11. Я получил это исключение java.security.NoSuchAlgorithmException: PKCS11 KeyStore недоступно.

Когда я пытался включить FIPS в Java 8, он работал нормально, но при том же в Java 11 вызывалось исключение.

Инициализация SUNPKCS11 изменилась с Java 8 на Java 11.

В Java 8:

  Provider provider = Security.getProvider("SunPKCS11");      
  provider.configure(nssConfigFile);

Java 11:

  Provider provider = new sun.security.pkcs11.SunPKCS11(nssConfigFile);
  Security.addProvider(nssProvider);

После инициализации SUNPKCS11 с помощью файла конфигурации я пытаюсь получить поставщика из хранилища ключей, как показано ниже.
Еще одна вещь: когда я инициализировал SUNPKCS11, это Provider.id.info. установлено значение Ненастроенный и непригодный для использования поставщик PKCS11. Имеет ли это какое-то отношение?

KeyStore.getInstance("SUNPKCS11");

Тогда здесь у меня не было PKCS11 в хранилище ключей.

Содержание моего файла конфигурации выглядит следующим образом:

  name=nss-client   
  nssLibraryDirectory=X:\XXX\NSS\lib\   
  nssSecmodDirectory=X:\XXX\NSS\db\   
  nssModule=fips

Нужно ли мне что-то менять в содержимом файла конфигурации или это ошибка Java 11?

Пожалуйста, помогите мне ценными предложениями.


person N V    schedule 20.11.2018    source источник
comment
Вы видели поставщика SunPKCS11 в Java 9?   -  person Naman    schedule 20.11.2018
comment
да, но я не понял того, что вы пытаетесь упомянуть. Нужно ли мне передавать параметры конфигурации и строку вместо передачи файла или упоминания идентификатора слота?   -  person N V    schedule 20.11.2018
comment
Спасибо, помогло. Мне нужно назначить поставщика возврата из метода настройки.   -  person N V    schedule 28.11.2018


Ответы (1)


Хорошо - один из комментариев к исходному вопросу содержал решение. Итак, я заново документирую это здесь.

Похоже, что метод provider.configure(..) возвращает новый Provider, а не изменяет исходный provider. Имея это в виду, вы можете сделать это вместо этого:

Provider oldProvider = Security.getProvider("SunPKCS11");
Provider newProvider = oldProvider.configure("yubihsm.conf");
Security.addProvider(newProvider);

// Hooray!  This works now!
KeyStore ks = KeyStore.getInstance("pkcs11");
person Brian Lauber    schedule 11.09.2020
comment
это работает! благодаря. для openjdk 9 выше. это важно. - person Vijay; 08.03.2021