Создание цепочек сертификатов с помощью csptest -minica
Опубликовано Андрей Русев on 2020-01-29 18:54

Консольная утилита csptest в режиме minica позволяет создавать ключи, связанные с этими ключами сертификаты, а также CRL. Все регулируемые параметры можно задать через аргументы командной строки. Утилита csptest не предназначена для использования в качестве удостоверяющего центра.

Рассмотрим работу с minica на примере. Создадим две цепочки сертификатов вида «корневой сертификат, его CRL, листовой сертификат», причём первая цепочка будет использовать отечественную криптографию, а вторая – зарубежную. Для простоты ограничимся командами для КриптоПро CSP 5.0 на *nix-подобной операционной системе – для Windows они будут аналогичными. С КриптоПро CSP 4.0 (minica доступен с версии 4.0.9969 Bayes) не будет возможности использовать провайдер "Crypto-Pro Enhanced RSA and AES CSP", а на *nix для контейнеров надо указывать полные имена в духе '\\.\HDIMAGE\minica_gost_root'. Полный список возможностей minica указан в справке.

/opt/cprocsp/bin/amd64/csptest -minica -help

Все команды далее требуют административных привилегий (работы под root), так как корневой сертификат кладётся в хранилище mRoot, а CRL-и в mCA. Это позволяет упростить изложение, но не является ограничением minica. Можно заменить хранилища в духе "-store uRoot" и получить аналогичный результат.

Создадим ключ и соответствующий ему корневой сертификат (-root) с нужным именем (-dn). Ключ будет создан с использованием провайдера, задаваемого типом (-provtype) и именем (-provider). Ключ будет сохранён в указанный контейнер на указанном носителе (-container) и защищён паролем (-password). Сертификат будет сохранён в Local Machine-хранилище «Root» (-store), а также в указанный файл (-fcert).

/opt/cprocsp/bin/amd64/csptest -minica -root -dn "CN=MiniCA GOST root cert" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "minica_gost_root" -password "1" -store mRoot -fcert /tmp/gost_root.cer

Создадим ключ и соответствующий ему листовой сертификат (-leaf). Параметры создаваемых объектов задаются аналогично прошлому случаю. Для создания листового сертификата требуется задать информацию о сертификате, который его подпишет. Явно укажем, где найти этот сертификат (-issuer и -istore) и какой пароль применить к связанному с ним контейнеру (-ipassword).

/opt/cprocsp/bin/amd64/csptest -minica -leaf -dn "CN=MiniCA GOST leaf cert" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "minica_gost_leaf" -password "2" -store mMy -fcert /tmp/gost_leaf.cer -issuer "CN=MiniCA GOST root cert" -ipassword "1" -istore mRoot

Создание пустого CRL (-crl) очень похоже на упрощённое создание листового сертификата, меняется лишь задание результирующего файла (-fcrl).

/opt/cprocsp/bin/amd64/csptest -minica -crl -store mCa -fcrl /tmp/gost.crl -issuer "CN=MiniCA GOST root cert" -ipassword "1" -istore mRoot

Убедимся, что цепочка листового сертификата успешно проверяется.

/opt/cprocsp/bin/amd64/cryptcp -copycert -errchain -f /tmp/gost_leaf.cer -df /tmp/tmp.cer

Создание цепочки с использованием зарубежной криптографии полностью аналогично.

/opt/cprocsp/bin/amd64/csptest -minica -root -dn "CN=MiniCA RSA root cert" -provtype 24 -provider "Crypto-Pro Enhanced RSA and AES CSP" -container "minica_rsa_root" -password "1" -store mRoot -fcert /tmp/rsa_root.cer

/opt/cprocsp/bin/amd64/csptest -minica -leaf -dn "CN=MiniCA RSA leaf cert" -provtype 24 -provider "Crypto-Pro Enhanced RSA and AES CSP" -container "minica_rsa_leaf" -password "2" -store mMy -fcert /tmp/rsa_leaf.cer -issuer "CN=MiniCA RSA root cert" -ipassword "1" -istore mRoot

/opt/cprocsp/bin/amd64/csptest -minica -crl -store mCa -fcrl /tmp/rsa.crl -issuer "CN=MiniCA RSA root cert" -ipassword "1" -istore mRoot

/opt/cprocsp/bin/amd64/cryptcp -copycert -errchain -f /tmp/rsa_leaf.cer -df /tmp/tmp_rsa.cer

Создание и обработка запросов на сертификат

Начиная с КриптоПро CSP 5.0.12998 в minica добавлена возможность создания запросов на сертификат и обработки таких запросов.

csptest -minica в режиме -request позволяет создать простейший запрос на листовой сертификат с желаемым именем (опция -dn), связанный с некоторым контейнером, и сохранить его в файл в формате DER (опция -frequest). Имя контейнера текущего пользователя можно явно указать с помощью опции -container. Если требуется не создавать контейнер, а использовать существующий, то можно использовать опцию -nokeygen. Большинство опций, влияющих на генерируемый сертификат (-certusage, -cdp и так далее), не влияет на создаваемый запрос. Запрос на сертификат создаётся без расширений, которые при необходимости можно добавить в запрос вручную (при этом подпись запроса станет невалидной, но в режиме -process это можно проигнорировать, указав флаг -nocheck).

/opt/cprocsp/bin/amd64/csptest -minica -request -dn "CN=MiniCA GOST leaf cert" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "minica_gost_leaf" -password "2" -exportable -frequest /tmp/gost_leaf.req

csptest -minica в режиме -process позволяет обработать запрос в формате DER (опция -frequest) на листовой сертификат, создав из него подписанный заданным издателем (опция -issuer) сертификат, который будет сохранён в файл в формате DER (опция -fcert). Запросы на сертификаты могут быть созданы как с помощью csptest -minica -request, так и с помощью другого ПО, например cryptcp -createrqst. Подпись под запросом проверяется на корректность, и в случае неуспешной проверки запрос не обрабатывается. Игнорировать неуспешную проверку подписи запроса можно с помощью опции -nocheck. Поскольку csptest -minica предназначена исключительно для тестового использования, то все поля из запроса, включая все расширения, копируются в сертификат без каких-либо проверок. С помощью различных опций (-certusage, -cdp и так далее) можно повлиять на генерируемый сертификат, но ради максимально широких возможностей для тестирования принята следующая логика: если какое-то расширение есть в запросе, то оно имеет приоритет над значениями из опций командной строки и именно оно будет скопировано из запроса в генерируемый сертификат.

Установка сертификата в хранилище и в контейнер, привязка сертификата к контейнеру не входят в функциональность csptest -minica -process и должны осуществляться отдельно, например, с помощью csptest, cptools, certmgr.

/opt/cprocsp/bin/amd64/csptest -minica -process -frequest /tmp/gost_leaf.req -fcert /tmp/gost_leaf.cer -issuer "CN=MiniCA GOST root cert" -ipassword "1" -istore mRoot

(35 плюсик(ов))
Класс!
Не очень :(