Перейти к содержанию

Установка и запуск КриптоАРМ Server#

В этой инструкции вы узнаете как установить и настроить сервис КриптоАРМ Server с использованием Docker.

Содержание:


Требования к системе#

Характеристика Минимальное значение Дополнение
Информационная емкость ОЗУ 4 Гб
Информационная емкость HDD 50 Гб
Процессор x86_64 (или amd64)
Поддерживаемые ОС Ubuntu 18.04/20.04, Debian 11, Astra Linux SE 1.8 Орел Возможна работа на других Linux-дистрибутивах с поддержкой Docker
Дополнительно Требуется для контейнерного запуска

Технологический стек#

КриптоАРМ Server использует следующий стек технологий:

  • Node.js
  • NestJS
  • КриптоПро CSP 5.0
  • КриптоАРМ ГОСТ SDK
  • Docker

Установка Docker#

Для запуска проекта необходимо установить Docker и Docker Compose.

🔍 Подробная инструкция доступна в официальной документации: https://docs.docker.com/engine/install/.

📌 Минимально необходимые версии компонентов: Docker Engine: 19.03 или выше


Первый запуск сервиса#

1. Создание рабочей директории#

Создайте и перейдите в рабочую директорию:

mkdir cryptoarm-server && cd cryptoarm-server

2. Загрузка конфигурационных файлов#

curl -O https://git.digtlab.ru/trusted/cryptoarm/server/-/raw/main/docker/docker-compose.yml
curl -O https://git.digtlab.ru/trusted/cryptoarm/server/-/raw/main/docker/Dockerfile
curl -O https://git.digtlab.ru/trusted/cryptoarm/server/-/raw/main/.env

3. Подготовка каталога для КриптоПро#

Создайте каталог для установки КриптоПро CSP:

mkdir cryptopro

4. Загрузка КриптоПро CSP#

  1. Скачайте актуальную версию КриптоПро CSP 5.0 для Linux (x64, deb) с официального сайта: https://cryptopro.ru/products/csp. Для загрузки требуется авторизация на сайте КриптоПро.
  2. Cкопируйте файл linux-amd64_deb.tgz в каталог cryptoarm-server/cryptopro.

5. Настройка переменных окружения#

Лицензии#

Откройте файл .env и укажите лицензии КриптоПро CSP и КриптоАРМ Server:

CRYPTOPRO_LICENSE=XXXXXXXXXXXXXXXXXXXXXXXXX  
TRUSTED_LICENSE=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

Настройка сервиса штампов времени#

Опционально настройте переменные для настройки TSP-сервиса:

TSP_SERVICE_ADDRESS=http://qs.cryptopro.ru/tsp/tsp.srf

Настройка PDF-отчета#

Переменная Описание По умолчанию
REPORT_TITLE Заголовок PDF-отчета Отчет о проверке электронной подписи
DATA_STAMP_TITLE Заголовок штампа подписи Документ подписан электронной подписью
STAMP_COLOR Цвет штампа (HEX) #4c40d2
REPORT_INFO_MESSAGE Нижний колонтитул отчета {align:left}© {COMPANY_NAME} \|\| {align:right}Страница {pageNumber} из {totalPages}{WEBSITE_URL}

Поддерживаемые переменные#

Переменная Описание По умолчанию
{pageNumber} номер страницы -
{totalPages} общее количество страниц -
{COMPANY_NAME} название организации ООО Цифровые технологии
{WEBSITE_URL} адрес сайта www.cryptoarm.ru
{VARIABLE_NAME} любая переменная окружения -

Поддерживаемые директивы выравнивания#

Директива Описание
{align:left} выравнивание по левому краю
{align:center} выравнивание по центру
{align:right} выравнивание по правому краю
{align:justify} выравнивание по ширине

6. Сборка контейнера#

Запустите сборку:

docker compose build --pull

7. Запуск сервиса#

Запустите сервис:

docker compose up -d

Полезные команды#

Просмотр логов:

docker compose logs -f

Остановка:

docker compose stop

Обновление сервиса#

Для обновления версии необходимо загрузить актуальные конфигурационные файлы и пересобрать контейнер.

curl -O https://git.digtlab.ru/trusted/cryptoarm/server/-/raw/main/docker/docker-compose.yml
curl -O https://git.digtlab.ru/trusted/cryptoarm/server/-/raw/main/docker/Dockerfile
docker compose build --pull
docker compose up -d

Сборка из исходников#

  1. Клонируйте репозиторий:

    git clone https://git.digtlab.ru/trustednet/cryptoarm/server
    
  2. Выполните пункты:

  3. Запустите сборку:

    docker compose build
    

Вход в сервис#

После запуска сервис становится доступен по адресу: http://SERVER:PORT

Пример: http://172.17.1.115:3037.

Swagger-документация по REST API: http://SERVER:PORT/docs

Пример: http://172.17.1.115:3037/docs.


Проверка работы сервиса#

Проверить работу сервиса можно следующими способами:

  1. Через Swagger интерфейс.
  2. С помощью утилиты curl.

Пример запроса проверки подписи:

curl -X 'POST' \
'http://172.17.1.115:3037/cms/verify' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"cms": "MIAGCSqGSIb3...==,MSMwIQYJKoZI...==",
"data": "dGVzdA==",
"enhancedType": "CAdES-X Long Type 1"
}'

Параметры запроса#

Параметр Описание
cms подпись в Base64
data подписанные данные (Base64)
enhancedType тип усовершенствования подписи

Поддерживаемые форматы:

  • CAdES-T
  • CAdES-X Long Type 1
  • CAdES-A

Пример ответа#

HTTP/1.1 201 Created
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Type: application/json; charset=utf-8
Content-Length: 136101
ETag: W/"213a5-+1/6qQ+hWCfJ0yGRz0/fQGpbTbk"
Date: Thu, 26 Sep 2024 12:40:04 GMT
Connection: keep-alive
Keep-Alive: timeout=5  
{
  "status": 200,
  "message":"ОК",
  "isValid": true,
  "isValidSign": true,
  "signs": [
    {
      "cadesTypeName": "CAdES-BES",
      "certificate": {
        "version": 3,
        "status": true,
        "subjectFriendlyName": "esia test3",
        "issuerFriendlyName": "CRYPTO-PRO Test Center 2",
        "subjectName": "CN=esia test3",
        "issuerName": "E=support@cryptopro.ru\r\nC=RU\r\nL=Moscow\r\nO=CRYPTO-PRO LLC\r\nCN=CRYPTO-PRO Test Center 2",
        "notAfter": "2024-10-26T16:25:37.000Z",
        "notBefore": "2024-08-26T16:15:37.000Z",
        "serialNumber": "120064ECE1352507757C00A08B00020064ECE1",
        "thumbprint": "29063cd83537dbbd0a221705859b8f6e5bec5ad0",
        "signatureAlgorithm": "1.2.643.7.1.1.3.2",
        "signatureDigestAlgorithm": "1.2.643.7.1.1.2.2",
        "publicKeyAlgorithm": "1.2.643.7.1.1.1.1"
      },
      "certificateData": "MIIDEz...",
      "issuerName": "E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2",
      "serialNumber": "120064ECE1352507757C00A08B00020064ECE1",
      "signatureAlgorithm": "1.2.643.7.1.1.3.2",
      "signatureDigestAlgorithm": "1.2.643.7.1.1.2.2",
      "certs": [
        {
          "status": true,
          "subjectFriendlyName": "esia test3",
          "issuerFriendlyName": "CRYPTO-PRO Test Center 2",
          "subjectName": "CN=esia test3",
          "issuerName": "E=support@cryptopro.ru\r\nC=RU\r\nL=Moscow\r\nO=CRYPTO-PRO LLC\r\nCN=CRYPTO-PRO Test Center 2",
          "notAfter": "2024-10-26T16:25:37.000Z",
          "notBefore": "2024-08-26T16:15:37.000Z",
          "serialNumber": "120064ECE1352507757C00A08B00020064ECE1",
          "thumbprint": "29063cd83537dbbd0a221705859b8f6e5bec5ad0",
          "signatureAlgorithm": "1.2.643.7.1.1.3.2",
          "signatureDigestAlgorithm": "1.2.643.7.1.1.2.2",
          "publicKeyAlgorithm": "1.2.643.7.1.1.1.1"
        }
      ],
      "isCertChainValid": true
    }
  ],
  "dataStamp": "JVBERi0xLjcKJ...=",
  "report": "JVBERi0xLjcKJ...="    
}

Атрибуты ответа#

Поле Тип Описание
status Integer HTTP статус ответа.
message String Сообщение об ошибке (заполняется, если status не является успешным).
isValid Boolean Общий результат проверки подписи (true/false).
isValidSign Boolean Результат математической корректности подписи (true/false).
signs Array Массив объектов с детальной информацией о сертификатах и подписях.
dataStamp String Подписанные данные с визуализацией штампов подписей в формате Base64 (для PDF документов).
report String PDF-отчет проверки в формате Base64.

Пример неуспешного ответа#

HTTP/1.1 400 Bad Request
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Type: application/json; charset=utf-8
Content-Length: 101
ETag: W/"65-ykHUL2wV5KLzsDntQL70C94heK8"
Date: Thu, 26 Sep 2024 12:42:04 GMT
Connection: keep-alive
Keep-Alive: timeout=5
{
    "message": "Запрошена проверка прикрепленной CMS подписи, но подпись не содержит исходного документа",
    "error": "Bad Request",
    "statusCode": 400
}

Установка сертификатов#

Для работы с подписью необходимо установить сертификаты.

Файлы сертификатов необходимо поместить в каталог: cryptoarm-server/certs.

Установка корневого сертификата#

Для установки корневого сертификата certs/crypto.root.test.cer выполните команду:

docker exec -it cryptoarm.server /opt/cprocsp/bin/amd64/certmgr -inst -all -store uroot -file /certs/crypto.root.test.cer
Корневой сертификат

Установка сертификата пользователя#

Для установки пользовательского сертификата certs/crypto.root.test.pfx выполните команду:

docker exec -it cryptoarm.server /opt/cprocsp/bin/amd64/certmgr -inst -all -store uMy -file /certs/crypto.root.test.pfx -pfx

Пользовательский сертификат


Настройка отчета#

Параметр REPORT_INFO_MESSAGE позволяет настроить текст в колонтитуле PDF-отчета.

Поддерживаются:

  • переменные {VARIABLE_NAME}
  • директивы выравнивания {align:direction}

Подробная информация приведена в файле:

`docs/VARIABLES_SUPPORT.md

В переменной окружения REPORT_INFO_MESSAGE можно настроить сообщение, которое будет отображаться в колонтитуле PDF-отчета. Поддерживается замена переменных в формате {VARIABLE_NAME} и выравнивание текста с помощью директив {align:direction}.

Подробная документация доступна в инструкции Настройка переменной REPORT_INFO_MESSAGE.


Подпись данных#

curl -X 'POST' \
  'http://172.17.1.115:3037/cms/sign' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "cert": "MIIDEjCCAr+gAwI...==",
    "data": "dGVzdA==",
    "password": "password"
}'

Параметры#

Параметр Описание
cert Сертификат в Base64
data Подписываемые данные в Base64
password Пароль от контейнера (если требуется)

Пример ответа#

{
  "cms": "MIAGCSqGSIb3DQEHAq...AAAAAAAA"
}

Диагностика сетевых подключений#

При проверке электронной подписи сервис может обращаться к внешним ресурсам:

  • OCSP — проверка статуса сертификата
  • CRL — списки отозванных сертификатов
  • TSP — сервисы штампов времени

Если эти ресурсы недоступны из сети сервера, проверка подписи может выполняться некорректно или завершаться ошибкой.

Для диагностики сетевых обращений можно использовать прокси-сервисы.

Диагностика через squid-proxy#

Squid позволяет увидеть, к каким внешним адресам обращается сервис.

Добавление proxy-сервиса#

Добавьте сервис squid-proxy в docker-compose.yml:

services:
  cryptoarm.server:
    build: .
    image: cryptoarm.server
    container_name: cryptoarm.server
    restart: always
    ports:
      - 3037:3037
    env_file:
      - .env
    volumes:
      - ./cert_storage:/var/opt/cprocsp/
      - ./certs:/certs

  squid-proxy:
    image: ubuntu/squid
    container_name: squid-proxy
    restart: always

Настройка прокси#

Пропишите адрес прокси в .env:

http_proxy=http://squid-proxy:3128

При необходимости можно также указать:

https_proxy=http://squid-proxy:3128

Перезапуск сервисов#

Перезапустите сервисы:

docker compose up -d

Просмотр логов прокси#

docker logs -f squid-proxy

В логах будут отображаться все внешние соединения сервиса.

Диагностика через mitmproxy#

mitmproxy позволяет анализировать HTTP-запросы более детально через web-интерфейс.

Добавление mitmproxy#

Добавьте сервис mitmweb в docker-compose.yml:

services:
  cryptoarm.server:
    build: .
    image: cryptoarm.server
    container_name: cryptoarm.server
    restart: always
    ports:
      - 3037:3037
    env_file:
      - .env
    volumes:
      - ./cert_storage:/var/opt/cprocsp/
      - ./certs:/certs

  mitmweb:
    image: mitmproxy/mitmproxy
    container_name: mitmweb
    ports:
      - 8081:8081   # web UI
      - 8080:8080   # proxy
    volumes:
      - ./logs:/logs
    command: >
      mitmweb
      --set web_password=admin
      --mode reverse:http://cryptoarm.server:3037
      --web-host 0.0.0.0

Запуск сервисов#

Запустите/перезапустите сервисы:

docker compose up -d

Доступ к сервису#

После запуска:

  • API сервиса доступен через proxy: http://SERVER:8080

  • web-интерфейс mitmproxy: http://SERVER:8081

Через web-интерфейс можно анализировать все HTTP-запросы сервиса.

Для повышения удобства работы и хранения данных веб-сайт TRUSTED.RU использует файлы COOKIE. Продолжая работу с веб-сайтом, Вы даете свое согласие на работу с этими файлами.