Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Chemannnnn  
#1 Оставлено : 23 декабря 2021 г. 18:48:09(UTC)
Chemannnnn

Статус: Участник

Группы: Участники
Зарегистрирован: 29.11.2021(UTC)
Сообщений: 21

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 2 раз в 1 постах
Здравствуйте. Возникла проблема с созданием подписи.
Краткая история следующая: в КриптоАРМ создал самоподписанный сертификат и подписал им файл с данными. Затем успешно проверил подпись кодом из своего топика (ссылка), предварительно добавив ранее созданный самоподписанный сертификат в хранилище доверенных сертификатов "...\AdoptOpenJDK\jdk-8.0.232.09-openj9\jre\lib\security\cacerts".
Теперь пытаюсь подписать файл, используя этот сертификат, но уже не с помощью софта КриптоАРМ, а кодом Java. За основу взял пример из архива с JCP "...\jcp-2.0.40035\samples-sources\CAdES\PKCS7Example.java".
В этом примере есть вызов для получения закрытого ключа и цепочки сертификатов из пользовательского контейнера (в моём случае сертификат один, т.к. он самоподписанный):

Проблемы возникают непосредственно в коде метода Configuration.loadConfiguration, а именно:

Проблема в следующем - provider = "JCP", storeType = "HDImageStore", но (насколько удалось прочитать на форуме) "cacerts" это хранилище типа Java Key Store (JKS). А в коде используется "HDImageStore", т.е. требуется создать хранилище типа CertStore и поместить в него мой сертификат, чтобы в дальнейшем получать PrivateKey из него, верно?
Т.е. из "cacerts" эти данные нельзя получить?

P.S. Пробовал вызов:

но при вызове:

каждый раз получаю privateKey равное null
Offline two_oceans  
#2 Оставлено : 24 декабря 2021 г. 2:36:07(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Цитата:
Т.е. из "cacerts" эти данные нельзя получить?
Добрый день.

Да какие тут неясности с хранилищем... если будет отдельно сертификат УЦ и отдельно сертификат подписавшего, Вам и в голову не придет искать ссылку в cacerts.

Не то чтобы совсем нельзя, просто это несовместимо процентов на 90 с философией программ КриптоПро: не выпускать закрытый ключ за пределы криптопровайдера. Либо вытащенная ссылка/ключ окажется тыквой в полночь (то есть не реальный ключ, а какая-то замена, как номерок в раздевалке) либо не сможете передать обратно должным образом ("голый" ключ не принимается, пальто вместо номерка не подойдет).

Смотрите сами. В хранилище сертификатов УЦ cacerts обычно хранится просто сам сертификат, формат сертификата унифицирован международными стандартами, поэтому разницы какое хранилище особо нет, главное чтобы выдавало сертификат установленного формата. В самом сертификате нет ссылки на закрытый ключ, ссылка это атрибут добавляемый к сертификату в хранилище (обычно при добавлении). Другими словами, если Вы берете стандартную инструкцию по добавлению в cacerts без прописывания ссылки, то получите как раз описанную ситуацию - "получите null, распишитесь". Ну просто нет в cacerts ссылки на закрытый ключ, откуда ей взяться.

Из этого есть 2 выхода:
неправильный, когда впихиваете ссылку в cacerts по JKS, а потом она внезапно "по форме и размеру" не совпадает с КриптоПро;
правильный: забыть про cacerts в коде (есть там самоподписанный сертификат как сертификат УЦ без ссылки и чудненько), поставить сертификат еще раз в хранилище "Личные" со ссылкой на ключ (делается средствами КриптоПро), использовать хранилище "Личные" для получения ссылки.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Chemannnnn оставлено 24.12.2021(UTC)
Offline Chemannnnn  
#3 Оставлено : 24 декабря 2021 г. 16:14:22(UTC)
Chemannnnn

Статус: Участник

Группы: Участники
Зарегистрирован: 29.11.2021(UTC)
Сообщений: 21

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 2 раз в 1 постах
Цитата:
правильный: забыть про cacerts в коде (есть там самоподписанный сертификат как сертификат УЦ без ссылки и чудненько), поставить сертификат еще раз в хранилище "Личные" со ссылкой на ключ (делается средствами КриптоПро), использовать хранилище "Личные" для получения ссылки.

Запустил "CryptoPro CSP" под админом, на закладке "Сервис" нажал кнопку "Просмотреть сертификаты в контейнере..." - "Обзор...", выбрал контейнер типа "Директория" (HDIMAGE) и получил ошибку "В контейнере закрытого ключа 'HDIMAGE\\*****' отсутствуют сертификаты", т.к. самоподписанный сертификат, который я создавал в "Крипто АРМ" был добавлен в контейнер типа "Реестр" (REGISTRY\\*****). Далее выбрал этот контейнер типа "Реестр", мне отобразился мой сертификат, нажал "Установить" и на вопрос

ответил "Да", получив сообщение

Далее открыл "...\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":

provider: "JCP", т.е. storeType: "HDImageStore". Далее вызывается код с этими параметрами (для него storeFile и storePassword равны null):

Подозреваю, что т.к. контейнер закрытого ключа типа "REGISTRY", а не "HDIMAGE", то дальнейшее считывание закрытого ключа кодом

возвращает null. Нужно как-то перенести закрытый ключ из контейнера "REGISTRY" в контейнер "HDIMAGE" или в коде как-то указать контейнер "REGISTRY"? Каким образом (лучше пример кода, пожалуйста)?
Кстати, не совсем понял, какие значения должны быть у параметров метода "loadConfiguration" класса "Configuration.java"

"Идентификатор ключа" - это cсылка на закрытый ключ, т.е. Имя контейнера? А какой "Пароль ключа" должен быть? Я вводил только пароль для контейнера, это он?

Добавлю, что работаю я с JCP (устанавливал изначально только его для проверки подписей, потом для создания самоподписанного сертификата и подписания файлов установил CryptoPro CSP), использую библиотеку CAdES. Для проверки подписи использовал следующий код (ссылка) и сертификаты загружал в доверенное хранилище сертификатов JVM "...\AdoptOpenJDK\jdk-8.0.232.09-openj9\jre\lib\security\cacerts". Правильно понимаю, что для проверки подписей нужно будет загружать цепочки сертификатов в "cacerts", а для подписания файлов туда загружать сертификаты не потребуется (только в "Личное" и в "Доверенные корневые центры сертификации")?

Отредактировано пользователем 24 декабря 2021 г. 17:16:16(UTC)  | Причина: Не указана

Offline Chemannnnn  
#4 Оставлено : 27 декабря 2021 г. 18:25:44(UTC)
Chemannnnn

Статус: Участник

Группы: Участники
Зарегистрирован: 29.11.2021(UTC)
Сообщений: 21

Сказал(а) «Спасибо»: 10 раз
Поблагодарили: 2 раз в 1 постах
Отвечу сам себе... В панели управления JCP на закладке "Хранилища ключей и сертификатов" в HDImageStore создал контейнер закрытого ключа и там же будет храниться самоподписанный сертификат, как это описано в "Инструкции по использованию" для JCP.
Для успешной работы примера из архива с JCP "...\jcp-2.0.40035\samples-sources\CAdES\PKCS7Example.java" остаётся указать в классе "Container2001" алиас и пароль для ранее созданного контейнера закрытого ключа.
Для успешной проверки подписи добавил извлечённый из контейнера самоподписанный сертификат в хранилище доверенных сертификатов JRE "cacerts".
Реализовать это, используя хранилище "Личные" пока не получилось. Если есть примеры того как это реализовать, буду рад ознакомиться.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.