- /certificates — все установленные сертификаты пользователя
- /cosign — добавление еще одной подписи к документу
- /sign — подписание документов
- /unsign — получение исходного файла без подписей
- /verify — проверка подписанного документа
- Аналоги
- Без скачивания на диск
- Возможные проблемы
- Запуск контейнера
- Использование контейнера на удаленной машине
- Криптопро 4.0 в докер контейнере
- Лицензия
- Обработка ошибок
- Подписание документа
- Получение исходного файла из sig-файла
- Проблемы
- Проверка подписи
- Просмотр установленных сертификатов
- Распространение и установка расширения для языка php
- Установка корневых сертификатов
- Установка сертификатов пользователя для проверки и подписания
- Формат данных
- Через скачивание на диск
/certificates — все установленные сертификаты пользователя
Если сертификатов нет:
Если сертификаты есть:
{
"certificates": [
{
"privateKey": {
"providerName": "Crypto-Pro GOST R 34.10-2022 KC1 CSP",
"uniqueContainerName": "HDIMAGE\\eb5f6857.000\D160",
"containerName": "eb5f6857-a08a-4510-8a96-df2f75b6d65a"
},
"algorithm": {
"name": "ГОСТ Р 34.10-2022",
"val": "1.2.643.7.1.1.1.1"
},
"valid": {
"to": "24.05.2022 08:13:16",
"from": "24.02.2022 08:03:16"
},
"issuer": {
"E": "[email protected]",
"C": "RU",
"L": "Moscow",
"O": "CRYPTO-PRO LLC",
"CN": "CRYPTO-PRO Test Center 2",
"raw": "CN=CRYPTO-PRO Test Center 2, O=CRYPTO-PRO LLC, L=Moscow, C=RU, [email protected]"
},
"subject": {
"C": "RU",
"L": "Test",
"O": "Test",
"OU": "Test",
"CN": "Test",
"E": "[email protected]",
"raw": "[email protected], CN=Test, OU=Test, O=Test, L=Test, S=Test, C=RU"
},
"thumbprint": "982AA9E713A2F99B10DAA07DCDC94A4BC32A1027",
"serialNumber": "120032C3567443029CC358FCDF00000032C356",
"hasPrivateKey": true
}
],
"status": "ok"
}/cosign — добавление еще одной подписи к документу
Не реализовано, столкнулся с проблемой: не получается заставить работать функцию CPSignedData::CoSignCades().
/sign — подписание документов
Для выбора сертификата для подписания нужно указать один критерии поиска find_type:
sha1— по SHA1 сертификатаsubject— поsubjectподписанта
В query — параметры поиска, в pin — пин-код (если он установлен):
Вернется JSON — документ, в signedContent будет содержаться подписанный файл.
/unsign — получение исходного файла без подписей
Исходный файл вернется в поле content.
/verify — проверка подписанного документа
Подпишем файл и проверим его:
Если файл прошел проверку, вернется список подписантов signers.
Аналоги
Существует аналогичный пакет CryptoProCSP, он классный, но:
- давно не обновлялся, используется версия
PHP5.6 - для запуска пришлось подредактировать
Dockerfile
Без скачивания на диск
Примечание: по какой-то причине иногда «заедает», но при повторном запуске — срабатывает.
Возможные проблемы
В Dockerfile содержатся названия пакетов, например lsb-cprocsp-devel-4.0.9921-5.noarch.rpm, которые могут заменить новой версией. Следует поправить названия пакетов в Dockerfile.
Запуск контейнера
Запустим контейнер под именем cryptopro, к которому будем обращаться в примерах:
Использование контейнера на удаленной машине
В примерах выше команды выглядят так: cat … | docker … или curl … | docker …, то есть контейнер запущен на локальной машине. Если же докер контейнер запущен на удаленной машине, то команды нужно отправлять через ssh клиент. Например, команда подписания:
Опция -q отключает приветствие из файла /etc/banner (хотя оно все равно пишется в stderr). А /etc/motd при выполнении команды по ssh не выводится.
В качестве эксперимента можно отправить по ssh на свою же машину так:
Криптопро 4.0 в докер контейнере
Содержимое контейнера:
Лицензия
Установка серийного номера:
Просмотр:
Обработка ошибок
Успешные действия возвращают код 200 и «status»: «ok».
Действия с ошибками возвращают 4xx и 5xx коды и «status»: «fail», в полях errMsg содержится описание ошибки, в errCode — ее код.
Например, обращение с неправильным методом
выведет такую ошибку:
Подписание документа
Для примера установим этот тестовый сертификат:
Его SHA1 Hash равен dd45247ab9db600dca42cc36c1141262fa60e3fe (узнать: certmgr -list), который будем использовать как указатель нужного сертификата.
Теперь передадим на stdin файл, в качестве команды — последовательность действий, и на stdout получим подписанный файл:
Получилось довольно неудобно. Скрипт scripts/sign делает то же самое, теперь команда подписания будет выглядеть так:
Об ошибке можно узнать через стандартный $?.
Получение исходного файла из sig-файла
Возьмем файл из примера выше:
То же самое, но с использованием скрипта:
Проблемы
Если pin-код не подходит, то в терминал выводится:
И подписание останавливается.
Проверка подписи
Подпишем файл из примера выше и сохраним его на диск:
Тогда проверка подписанного файла будет выглядеть так:
То же самое, но с использованием скрипта:
Просмотр установленных сертификатов
Сертификаты пользователя:
Корневые сертификаты:
Распространение и установка расширения для языка php
Для работы с расширением требуется собрать библиотеку совместно с исходниками вашей версии PHP.
Установка корневых сертификатов
Для установки корневых сертификатов нужно на stdin скрипта /scripts/root передать файл с сертификатами. Если в файле несколько сертификатов, все они будут установлены.
Установка сертификатов пользователя для проверки и подписания
Необходимо специальным образом сформировать zip-архив bundle.zip и отправить его на stdin скрипта /scripts/my. Пример такого zip-файла:
Как получить сертификат КриптоПро.
Первый найденный файл в корне архива будет воспринят как сертификат, а первый найденный каталог — как связка файлов закрытого ключа. Пароль от контейнера, если есть, передается первым параметром командной строки.
В каталоге certificates/ содержатся различные комбинации тестового сертификата и закрытого ключа, с PIN кодом и без:
Примеры:
Формат данных
Для POST данные должны поступать в теле запроса в формате x-www-form-urlencoded.
Возвращаются данные в формате JSON.
Через скачивание на диск
Скачаем сертификат на диск с помощью curl и передадим полученный файл на stdin с запуском команды его установки:
