Добавление цепочки сертификатов в Linux
Команда СМЭВ1.1 Подготовка
Для установки сертификата будет использовано две основные команды: openssl и keytool. Первая команда понадобится для формирования файла сертификата, закодированного в Base64-формате. Инструмент keytool же будет использоваться от предустановленной вместе с Агентом ПОДД JDK-драйвером, который необходим для управления сертификатами. Этот инструмент можно найти в директории $JAVA_HOME/bin/keytool.
Особое внимание стоит обратить на директорию приложения Крипто ПРО, полный путь которого понадобится при указании необходимых драйверов для утилиты keytool в параметре -providerpath. Более подробный пример использования будет приведен ниже.
Если Агент ПОДД установлен внутри Докер контейнера, то перед проверкой или добавлением цепочки сертификатов необходимо будет зайти в запущенный контейнер и в открывшейся директории продолжить работу с сертификатом. Следующая команда может служить примером входа в контейнер Агента:
docker exec –it einfahrt bash
1.2 Установка цепочки сертификатов
Все последующие команды будут выполняться в корне Агента ПОДД. Там же находится установленное приложение Крипто ПРО, наименование директории которой будет считаться cryptopro/. Этот путь используется для явного указания зависимостей провайдера.
1. Убедиться в наличии контейнера в директории /var/opt/cprocsp/keys/{user} с именем пользователя, под которым выполняется проверка сертификата.
2. Если не известно имя или псевдоним/alias контейнера, то его можно узнать следующей командой:
less /var/opt/cprocsp/keys/{user}/{container}/name.key
3. Для проверки наличия цепочки сертификатов у контейнера, можно выполнить из корня Агента ПОДД команду, приведенную ниже. Обратите внимание на путь расположения в параметре –providerpath, его следует заменить на директорию расположения Крипто ПРО, в нашем случае cryptopro/.
$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. Этот параметр может принимать все три значения от единицы до трех. Если в результате стоит число один, то цепочка отсутствует и можно переходить к следующему пункту. Если значение равно двум или даже трем, то это признак наличия в контейнере сертификата Удостоверяющего Центра (УЦ), если стоит цифра два или Головного УЦ (ГУЦ), если стоит цифра три.

4. Следующий этап заключается в скачивании необходимых сертификатов, используя информацию из предыдущего пункта. Для начала нужно найти строчки accessLocation: URIName и выбрать первую ссылку с расширением .crt, с помощью которой можно скачать сертификат УЦ.

Создадим временную директорию для хранения сертификатов:
mkdir certs/
И скачаем сертификат УЦ по ссылке:
wget {url.crt} -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}
5. Теперь необходимо сформировать файл, который будет содержать информацию о двух сертификатах. Для этого поочередно выполнить следующие команды:
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
6. Для добавление сгенерированной цепочки выполнить следующую команду:
$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}
7. Выполнить команду из пункта 2 и убедиться, что значение Certificate chain length равняется двойке и контейнер содержит два сертификата.