9. Приложение А Добавление промежуточных сертификатов в ключ CryptoPro
9.1. А.1 С использованием графического интерфейса
Для добавления промежуточных сертификатов в ключ CryptoPro следует:
Поместить контейнер ключа в папку пользователя, под которым далее будут исполняться команды, например
/var/opt/cprocsp/keys/<user>илиC:/Users/<user>/Local Settings/Application Data/Crypto Pro/.Создать запрос на сертификат с помощью Java утилиты keytool. Для подписи запроса ГОСТ алгоритмом в Java должно быть установлено CryptoPro JCP или JCSP (см. документацию на CryptoPro).
Пример команды для Java17 с установленным CryptoPro JCSP (где «cryptopro/» - имя каталога, в котором находятся jar файлы CryptoPro JCSP):
keytool -J-Dkeytool.compat=true -J-Duse.cert.stub=true -provider ru.CryptoPro.JCP.JCP -providerpath cryptopro/JCSP.jar:cryptopro/JCP.jar: cryptopro/JCPRequest.jar:cryptopro/JCPRevCheck.jar:cryptopro/asn1rt.jar:cryptopro/ASN1P.jar -certreq -alias client_01 -keysize 256 -sigalg GOST3411_2012_256withGOST3410_2012_256 -storetype HDImageStore -keystore NONE -storepass 1 -keypass 1234567890 -file client_01.csr -ext KeyUsage=keyEncipherment,keyAgreement -ext ExtendedkeyUsage=clientAuth
Для ключей длиной 256 указывается «-sigalg GOST3411_2012_256withGOST3410_2012_256», для ключей длиной 512 указывается «-sigalg GOST3411_2012_512withGOST3410_2012_512».
Если контейнер ключа имеет русские буквы в алиасе, утилита keytool не увидит его, тогда контейнер можно переименовать, изменив алиас обычным редактором в файле контейнера «name.key». При этом целостность ключа не нарушится.
Запрос на сертификат передать в соответствующий УЦ для выпуска сертификата. Например, тестовый УЦ CryptoPro выдает сертификат на Web-форме https://testgost2012.cryptopro.ru/certsrv/certrqxt.asp.
Полученный сертификат импортировать в контейнер ключа. Для этого в первую очередь подготовить файл в формате PKCS#7
(*.p7b). Данную операцию можно сделать через GUI утилиту CryptoPro Tools (cptools) либо через Windows GUI утилиту «certmgr». Сертификат устанавливается в персональное хранилище пользователя, далее экспортируется в файл PKCS#7(*.p7b). Подробнее на Рисунок - 9.1 - Рисунок - 9.5.
Рисунок - 9.1 Установка сертификата
Рисунок - 9.2 Установка сертификата в персональное хранилище пользователя
Рисунок - 9.3 Экспорт сертификата в CryptoPro Tools
Рисунок - 9.4 Экспорт сертификата в certmgr
Рисунок - 9.5 Выбор формата PKCS#7 (*.p7b) в certmgr
Импортировать файл
*.p7bв контейнер ключа командой (где «cryptopro/» - имя каталога, в котором находятся jar файлы CryptoPro JCSP):
keytool -J-Dkeytool.compat=true -J-Duse.cert.stub=true -provider ru.CryptoPro.JCP.JCP -providerpath cryptopro/JCSP.jar:cryptopro/JCP.jar: cryptopro/JCPRequest.jar:cryptopro/JCPRevCheck.jar:cryptopro/asn1rt.jar:cryptopro/ASN1P.jar -importcert -alias client_01 -storetype HDImageStore -keystore NONE -storepass 1 -keypass 1234567890 -file client_01.p7b
Аналогичным образом можно выгрузить несколько сертификатов (цепочку) в файл PKCS#7 (*.p7b), чтобы потом загрузить их в контейнер.
Сертификаты из контейнера ключа передаются другой стороне для проверки при установке TLS соединения, соответственно, если в доверенном хранилище второй стороны (сервера или клиента) не хватает промежуточных сертификатов для проверки подписи по цепочке, сертификаты могут быть переданы из контейнера ключа.
При этом в контейнер можно класть не всю цепочку, а только сертификаты, которых не хватает у второй стороны для построения всей цепочки.
Стороны посылают сертификаты для проверки только из контейнера своего ключа и проверяют подпись по цепочке для полученных от второй стороны сертификатов по сертификатам в своём хранилище доверенных. Проверить наличие цепочки в контейнере можно через утилиты CryptoPro (Рисунок - 9.6, Рисунок - 9.7).
Рисунок - 9.6 Проверка наличия нескольких сертификатов в контейнере
Рисунок - 9.7 Проверка наличия нескольких сертификатов в контейнере
Для промежуточных сертификатов сервер делает проверку атрибута BasicConstraints=ca:true,
если атрибут отсутствует, сервер отклонит соединение с ошибкой в логе: client SSL certificate verify error: (24:invalid CA certificate).
9.2. А.2 С использованием командной строки ОС Linux
Для установки сертификата используется две основные команды: openssl и keytool.
Первая команда предназначена для формирования файла сертификата, закодированного в Base64-формате.
Инструмент keytool используется от java, установленной вместе с Агентом ПОДД. Этот инструмент можно найти в директории
$JAVA_HOME/bin/keytool.
Особое внимание стоит обратить на директорию приложения CryptoPro, полный путь до которого понадобится при указании необходимых библиотек
для утилиты keytool в параметре -providerpath. Более подробный пример использования будет приведён ниже.
В случае запуска Агента ПОДД в docker, перед проверкой или добавлением цепочки сертификатов необходимо будет зайти в запущенный контейнер и в нем продолжить работу с сертификатом. Следующая команда может служить примером входа в контейнер Агента ПОДД:
docker exec -it einfahrt bash
Все последующие команды будут выполняться в домашней директории Агента ПОДД. Там же находится установленное в директории cryptopro/
приложение CryptoPro JCSP.
Этот путь используется для явного указания зависимостей крипто провайдера.
Для установки цепочки сертификатов:
Убедиться в наличии контейнера в директории
/var/opt/cprocsp/keys/{user}с именем пользователя, под которым выполняется проверка/изменение сертификата, где {user} – имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker).Если не известно имя или псевдоним/alias контейнера, то его можно узнать следующей командой:
less /var/opt/cprocsp/keys/{user}/{container}/name.key
где:
user– имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker),container– имя контейнера ключа cryptoPro.
Для проверки наличия цепочки сертификатов у контейнера, можно выполнить в домашней директории Агента ПОДД команду, приведенную ниже. Обратите внимание на путь расположения в параметре
–providerpath, его следует заменить на директорию расположения «Крипто ПРО», в нашем случаеcryptopro/. {alias} в команде следует заменить на имя контейнера, известное или полученное на предыдущем шаге.
$JAVA_HOME/bin/keytool \
-v -list \
-keystore NONE -storepass 1 -storetype HDImageStore \
-provider ru.CryptoPro.JCP.JCP \
-providerpath cryptopro/JCSP.jar:cryptopro/JCP.jar:cryptopro/JCPRevCheck.jar:cryptopro/asn1rt.jar:cryptopro/ASN1P.jar \
-alias {alias}
В самом начале выведенных данных необходимо найти строчку, начинающуюся с Certificate chain length.
Этот параметр может принимать значения от единицы и выше. Если в результате стоит число «1», то цепочка отсутствует и необходимо переходить к следующему пункту.
Пример:
Alias name: certificate
Creation date: 01.01.2022
Entry type: PrivateKeyEntry
Certificate chain length: 1
Если значение равно двум или выше, то в контейнере присутствуют сертификаты промежуточных удостоверяющих центров (УЦ).
Скачать необходимые сертификаты, используя информацию из предыдущего пункта. Для начала нужно найти строчки
accessLocation: URINameи выбрать первую ссылку с расширением .crt, с помощью которой можно скачать сертификат УЦ.
Пример:
accessMethod: caIssuers
accessLocation: URIName: http://url.ru/certificate.crt
Создать временную директорию для хранения сертификатов:
mkdir certs/
И скачать сертификат УЦ по ссылке: wget {полученный адрес} -O certs/center.crt
Чтобы получить сам сертификат из контейнера, можно воспользоваться командой, указав псевдоним контейнера в параметре -alias:
$JAVA_HOME/bin/keytool \
-exportcert \
-keystore NONE -storepass 1 -storetype HDImageStore \
-provider ru.CryptoPro.JCP.JCP \
-providerpath cryptopro/JCSP.jar:cryptopro/JCP.jar:cryptopro/JCPRevCheck.jar:cryptopro/asn1rt.jar:cryptopro/ASN1P.jar \
-file certs/local.cer \
-alias {alias}
Необходимо сформировать файл, который будет содержать информацию о сертификатах. Для этого поочередно выполнить следующие команды:
openssl x509 -inform der -in certs/local.cer -out certs/local.pem
openssl x509 -inform der -in certs/center.crt -out certs/center.pem
cat certs/local.pem certs/center.pem > certs/chain.pem
Для добавления сгенерированной цепочки выполнить следующую команду:
$JAVA_HOME/bin/keytool \
-importcert -keystore NONE -storepass 1 -storetype HDImageStore \
-provider ru.CryptoPro.JCP.JCP \
-providerpath cryptopro/JCSP.jar:cryptopro/JCP.jar:cryptopro/JCPRevCheck.jar:cryptopro/asn1rt.jar:cryptopro/ASN1P.jar \
-file certs/chain.pem \
-alias {alias}
Выполнить команду из пункта 2 и убедиться, что значение
Certificate chain lengthувеличилось на единицу, и контейнер содержит добавленные сертификаты.Повторить добавление сертификатов для всех промежуточных УЦ.