java.security.KeyStoreException: PKCS11 не найден

#java #keystore #pkcs#11 #cac

#java #хранилище ключей #pkcs #11 #cac

Вопрос:

Моя цель — считывать информацию с карты CAC и использовать pkcs11 ее для извлечения информации из нее и подписания моего документа. Я не смог найти подходящую dll для своего оборудования, поэтому я установил openSC ее на свой компьютер и использовал opensc-pkcs11.dll в следующем коде:

 String configName = "pkcs.cnf"; //my config file that points to opensc-pkcs11.dll
String PIN = "123456";
Provider p = new sun.security.pkcs11.SunPKCS11(configName);
Security.addProvider(p);
KeyStore keyStore = KeyStore.getInstance("PKCS11");
char[] pin = PIN.toCharArray();
keyStore.load(null, pin);
  

Но я получаю сообщение об ошибке в следующем месте

  KeyStore keyStore = KeyStore.getInstance("PKCS11");
  

с ошибкой stacktrace:

 java.security.KeyStoreException: PKCS11 not found
    at java.security.KeyStore.getInstance(Unknown Source)
    Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11-FooAccelerator
    at sun.security.jca.GetInstance.getService(Unknown Source)
    at sun.security.jca.GetInstance.getInstance(Unknown Source)
    at java.security.Security.getImpl(Unknown Source)
    ... 2 more
  

Помогите!

Комментарии:

1. Я считаю, что проблема в вашем. dll, проверьте, является ли это правильным файлом dll, на который вы ссылаетесь

2. Почему бы вам не использовать хранилище ключей keyStore = KeyStore.getInstance («PKCS11», p); чтобы получить хранилище ключей, это может помочь вам приблизиться к вашей проблеме

3. @mhasan, это тоже не сработало. Могу ли я загрузить dll из Интернета? Я использую карту CAC

Ответ №1:

Сначала создайте config.cfg , как показано ниже:

 name=name of your CAC card
slot=1
library=C:WindowsSystem32eps2003csp11.dll 
\This is the dll file for etoken like this when you are installing driver, a separate dll file would be generated for your CAC card.
  

Затем укажите путь к файлу конфигурации в программе, как показано ниже:

 Provider p = new sun.security.pkcs11.SunPKCS11(configFilepath);
Security.addProvider(p);
  

Комментарии:

1. Я заметил недавнее редактирование этого сообщения, которое кардинально меняет ваше намерение, пожалуйста, проверьте, является ли это вашим намерением или нет

2. slot вместо документированного slotListindex исправил это для меня, стоит упомянуть