9. Приложение А Добавление промежуточных сертификатов в ключ CryptoPro

9.1. А.1 С использованием графического интерфейса

Для добавления промежуточных сертификатов в ключ CryptoPro следует:

  1. Поместить контейнер ключа в папку пользователя, под которым далее будут исполняться команды, например /var/opt/cprocsp/keys/<user> или C:/Users/<user>/Local Settings/Application Data/Crypto Pro/.

  2. Создать запрос на сертификат с помощью 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». При этом целостность ключа не нарушится.

  1. Запрос на сертификат передать в соответствующий УЦ для выпуска сертификата. Например, тестовый УЦ CryptoPro выдает сертификат на Web-форме https://testgost2012.cryptopro.ru/certsrv/certrqxt.asp.

  2. Полученный сертификат импортировать в контейнер ключа. Для этого в первую очередь подготовить файл в формате PKCS#7 (*.p7b). Данную операцию можно сделать через GUI утилиту CryptoPro Tools (cptools) либо через Windows GUI утилиту «certmgr». Сертификат устанавливается в персональное хранилище пользователя, далее экспортируется в файл PKCS#7 (*.p7b). Подробнее на Рисунок - 9.1 - Рисунок - 9.5.

Установка сертификата

Рисунок - 9.1 Установка сертификата

Установка сертификата в персональное хранилище пользователя

Рисунок - 9.2 Установка сертификата в персональное хранилище пользователя

Экспорт сертификата в CryptoPro Tools

Рисунок - 9.3 Экспорт сертификата в CryptoPro Tools

Экспорт сертификата в certmgr

Рисунок - 9.4 Экспорт сертификата в certmgr

Выбор формата PKCS#7 (*.p7b) в certmgr

Рисунок - 9.5 Выбор формата PKCS#7 (*.p7b) в certmgr

  1. Импортировать файл *.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, установленной вместе с Агентом СМЭВ4. Этот инструмент можно найти в директории $JAVA_HOME/bin/keytool.

Особое внимание стоит обратить на директорию приложения CryptoPro, полный путь до которого понадобится при указании необходимых библиотек для утилиты keytool в параметре -providerpath. Более подробный пример использования будет приведён ниже.

В случае запуска Агента СМЭВ4 в docker, перед проверкой или добавлением цепочки сертификатов необходимо будет зайти в запущенный контейнер и в нем продолжить работу с сертификатом. Следующая команда может служить примером входа в контейнер Агента СМЭВ4:

docker exec -it einfahrt bash

Все последующие команды будут выполняться в домашней директории Агента СМЭВ4. Там же находится установленное в директории cryptopro/ приложение CryptoPro JCSP.

Этот путь используется для явного указания зависимостей крипто провайдера.

Для установки цепочки сертификатов:

  1. Убедиться в наличии контейнера в директории /var/opt/cprocsp/keys/{user} с именем пользователя, под которым выполняется проверка/изменение сертификата, где {user} – имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker).

  2. Если не известно имя или псевдоним/alias контейнера, то его можно узнать следующей командой:

less /var/opt/cprocsp/keys/{user}/{container}/name.key

где:

  • user – имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker),

  • container – имя контейнера ключа cryptoPro.

  1. Для проверки наличия цепочки сертификатов у контейнера, можно выполнить в домашней директории Агента СМЭВ4 команду, приведенную ниже. Обратите внимание на путь расположения в параметре –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

Если значение равно двум или выше, то в контейнере присутствуют сертификаты промежуточных удостоверяющих центров (УЦ).

  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}
  1. Необходимо сформировать файл, который будет содержать информацию о сертификатах. Для этого поочередно выполнить следующие команды:

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
  1. Для добавления сгенерированной цепочки выполнить следующую команду:

$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}
  1. Выполнить команду из пункта 2 и убедиться, что значение Certificate chain length увеличилось на единицу, и контейнер содержит добавленные сертификаты.

  2. Повторить добавление сертификатов для всех промежуточных УЦ.