Распространение и установка расширения для языка 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 с запуском команды его установки:

Оцените статью
ЭЦП64