.. _annex_a: Приложение А Добавление промежуточных сертификатов в ключ CryptoPro ====================================================================== А.1 С использованием графического интерфейса -------------------------------------------- Для добавления промежуточных сертификатов в ключ CryptoPro следует: 1. Поместить контейнер ключа в папку пользователя, под которым далее будут исполняться команды, например ``/var/opt/cprocsp/keys/`` или ``C:/Users//Local Settings/Application Data/Crypto Pro/``. 2. Создать запрос на сертификат с помощью Java утилиты **keytool**. Для подписи запроса ГОСТ алгоритмом в Java должно быть установлено CryptoPro JCP или JCSP (см. документацию на CryptoPro). Пример команды для Java17 с установленным CryptoPro JCSP (где «cryptopro/» - имя каталога, в котором находятся jar файлы CryptoPro JCSP): .. code-block:: bash 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)``. Подробнее на :numref:`install_cert` - :numref:`format`. .. _install_cert: .. figure:: img/install_cert.png :align: center :alt: Установка сертификата Установка сертификата .. _install_personal: .. figure:: img/install_personal.png :align: center :alt: Установка сертификата в персональное хранилище пользователя Установка сертификата в персональное хранилище пользователя .. _export_tools: .. figure:: img/export_tools.png :align: center :alt: Экспорт сертификата в CryptoPro Tools Экспорт сертификата в CryptoPro Tools .. _export_certmgr: .. figure:: img/export_certmgr.png :align: center :alt: Экспорт сертификата в certmgr Экспорт сертификата в certmgr .. _format: .. figure:: img/format.png :align: center :alt: Выбор формата PKCS#7 (*.p7b) в certmgr Выбор формата PKCS#7 ``(*.p7b)`` в certmgr 5. Импортировать файл ``*.p7b`` в контейнер ключа командой (где «cryptopro/» - имя каталога, в котором находятся jar файлы CryptoPro JCSP): .. code-block:: bash 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 (:numref:`cert_check`, :numref:`cert_check_2`). .. _cert_check: .. figure:: img/cert_check.png :align: center :alt: Проверка наличия нескольких сертификатов в контейнере Проверка наличия нескольких сертификатов в контейнере .. _cert_check_2: .. figure:: img/cert_check_2.png :align: center :alt: Проверка наличия нескольких сертификатов в контейнере Проверка наличия нескольких сертификатов в контейнере Для промежуточных сертификатов сервер делает проверку атрибута ``BasicConstraints=ca:true``, если атрибут отсутствует, сервер отклонит соединение с ошибкой в логе: ``client SSL certificate verify error: (24:invalid CA certificate)``. А.2 С использованием командной строки ОС Linux ---------------------------------------------- Для установки сертификата используется две основные команды: ``openssl`` и ``keytool``. Первая команда предназначена для формирования файла сертификата, закодированного в Base64-формате. Инструмент **keytool** используется от java, установленной вместе с Агентом ПОДД. Этот инструмент можно найти в директории ``$JAVA_HOME/bin/keytool``. Особое внимание стоит обратить на директорию приложения CryptoPro, полный путь до которого понадобится при указании необходимых библиотек для утилиты **keytool** в параметре ``-providerpath``. Более подробный пример использования будет приведён ниже. В случае запуска Агента ПОДД в docker, перед проверкой или добавлением цепочки сертификатов необходимо будет зайти в запущенный контейнер и в нем продолжить работу с сертификатом. Следующая команда может служить примером входа в контейнер Агента ПОДД: .. code-block:: bash docker exec -it einfahrt bash Все последующие команды будут выполняться в домашней директории Агента ПОДД. Там же находится установленное в директории ``cryptopro/`` приложение **CryptoPro JCSP**. Этот путь используется для явного указания зависимостей крипто провайдера. Для установки цепочки сертификатов: 1. Убедиться в наличии контейнера в директории ``/var/opt/cprocsp/keys/{user}`` с именем пользователя, под которым выполняется проверка/изменение сертификата, где {user} – имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker). 2. Если не известно имя или псевдоним/alias контейнера, то его можно узнать следующей командой: .. code-block:: bash less /var/opt/cprocsp/keys/{user}/{container}/name.key где: - ``user`` – имя пользователя, под которым запускается агент (‘app’ в случае запуска в docker), - ``container`` – имя контейнера ключа cryptoPro. 3. Для проверки наличия цепочки сертификатов у контейнера, можно выполнить в домашней директории Агента ПОДД команду, приведенную ниже. Обратите внимание на путь расположения в параметре ``–providerpath``, его следует заменить на директорию расположения «Крипто ПРО», в нашем случае ``cryptopro/``. {alias} в команде следует заменить на имя контейнера, известное или полученное на предыдущем шаге. .. code-block:: bash $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», то цепочка отсутствует и необходимо переходить к следующему пункту. Пример: .. code-block:: bash Alias name: certificate Creation date: 01.01.2022 Entry type: PrivateKeyEntry Certificate chain length: 1 Если значение равно двум или выше, то в контейнере присутствуют сертификаты промежуточных удостоверяющих центров (УЦ). 4. Скачать необходимые сертификаты, используя информацию из предыдущего пункта. Для начала нужно найти строчки ``accessLocation: URIName`` и выбрать первую ссылку с расширением .crt, с помощью которой можно скачать сертификат УЦ. Пример: .. code-block:: bash accessMethod: caIssuers accessLocation: URIName: http://url.ru/certificate.crt Создать временную директорию для хранения сертификатов: .. code-block:: bash mkdir certs/ И скачать сертификат УЦ по ссылке: ``wget {полученный адрес} -O certs/center.crt`` Чтобы получить сам сертификат из контейнера, можно воспользоваться командой, указав псевдоним контейнера в параметре ``-alias``: .. code-block:: bash $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. Необходимо сформировать файл, который будет содержать информацию о сертификатах. Для этого поочередно выполнить следующие команды: .. code-block:: bash 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. Для добавления сгенерированной цепочки выполнить следующую команду: .. code-block:: bash $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`` увеличилось на единицу, и контейнер содержит добавленные сертификаты. 8. Повторить добавление сертификатов для всех промежуточных УЦ.