Цитата:правильный: забыть про cacerts в коде (есть там самоподписанный сертификат как сертификат УЦ без ссылки и чудненько), поставить сертификат еще раз в хранилище "Личные" со ссылкой на ключ (делается средствами КриптоПро), использовать хранилище "Личные" для получения ссылки.
Запустил "CryptoPro CSP" под админом, на закладке "Сервис" нажал кнопку "Просмотреть сертификаты в контейнере..." - "Обзор...", выбрал контейнер типа "Директория" (HDIMAGE) и получил ошибку "В контейнере закрытого ключа 'HDIMAGE\\*****' отсутствуют сертификаты", т.к. самоподписанный сертификат, который я создавал в "Крипто АРМ" был добавлен в контейнер типа "Реестр" (REGISTRY\\*****). Далее выбрал этот контейнер типа "Реестр", мне отобразился мой сертификат, нажал "Установить" и на вопрос
1_add_cert_to_Personal_store_with_link_to_Private_key.jpg
(21kb) загружен 1 раз(а).
ответил "Да", получив сообщение
2_cert_was_installed_to_Personal_store.jpg
(16kb) загружен 3 раз(а).
Далее открыл "...\Crypto-Pro\User Certificates" и в разделах "Личное - Сертификаты" и "Доверенные корневые центры сертификации - Сертификаты" увидел свой самоподписанный сертификат (он туда был добавлен ещё при создании в "КрипоАРМ").
Теперь, возвращаясь к своей проблеме, у меня не получается загрузить закрытый ключ и цепочки сертификатов из пользовательского контейнера. Проблема в коде класса из архива с JCP "...\jcp-2.0.40035\samples-sources\CAdES\configuration\Configuration.java", который вызывается в классе "...\jcp-2.0.40035\samples-sources\CAdES\PKCS7Example.java", а именно в методе "loadConfiguration":
Код: /**
* В зависимости от провайдера - JCP или JCSP - используем тип контейнера.
* JCSP (как и CSP) работает с типом HDIMAGE (или REGISTRY).
*/
return loadConfiguration(provider,
(provider.equalsIgnoreCase(JCP.PROVIDER_NAME) ? JCP.HD_STORE_NAME : JCSP_DEFAULT_STORE_TYPE),
null, null, container.getAlias(), container.getPassword(), chain);
provider: "JCP", т.е. storeType: "HDImageStore". Далее вызывается код с этими параметрами (для него storeFile и storePassword равны null):
Код: KeyStore keyStore = KeyStore.getInstance(storeType, provider);
keyStore.load(( storeFile == null ? null :
new FileInputStream(storeFile) ), storePassword);
Подозреваю, что т.к. контейнер закрытого ключа типа "REGISTRY", а не "HDIMAGE", то дальнейшее считывание закрытого ключа кодом
Код: privateKey = (PrivateKey) keyStore.getKey(alias, password);
возвращает null. Нужно как-то перенести закрытый ключ из контейнера "REGISTRY" в контейнер "HDIMAGE" или в коде как-то указать контейнер "REGISTRY"? Каким образом (лучше пример кода, пожалуйста)?
Кстати, не совсем понял, какие значения должны быть у параметров метода "loadConfiguration" класса "Configuration.java"
Код: * @param alias Идентификатор ключа.
* @param password Пароль ключа.
"Идентификатор ключа" - это cсылка на закрытый ключ, т.е. Имя контейнера? А какой "Пароль ключа" должен быть? Я вводил только пароль для контейнера, это он?
Добавлю, что работаю я с JCP (устанавливал изначально только его для проверки подписей, потом для создания самоподписанного сертификата и подписания файлов установил CryptoPro CSP), использую библиотеку CAdES. Для проверки подписи использовал следующий код (
ссылка) и сертификаты загружал в доверенное хранилище сертификатов JVM "...\AdoptOpenJDK\jdk-8.0.232.09-openj9\jre\lib\security\cacerts". Правильно понимаю, что для проверки подписей нужно будет загружать цепочки сертификатов в "cacerts", а для подписания файлов туда загружать сертификаты не потребуется (только в "Личное" и в "Доверенные корневые центры сертификации")?
Отредактировано пользователем 24 декабря 2021 г. 17:16:16(UTC)
| Причина: Не указана