Установка и запуск КриптоАРМ Server#
В этой инструкции вы узнаете как установить и настроить сервис КриптоАРМ Server с использованием Docker.
Содержание:
- Требования к системе
- Технологический стек
- Установка 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. Создание рабочей директории#
Создайте и перейдите в рабочую директорию:
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:
4. Загрузка КриптоПро CSP#
- Скачайте актуальную версию КриптоПро CSP 5.0 для Linux (x64, deb) с официального сайта: https://cryptopro.ru/products/csp. Для загрузки требуется авторизация на сайте КриптоПро.
- 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-сервиса:
Настройка 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. Сборка контейнера#
Запустите сборку:
7. Запуск сервиса#
Запустите сервис:
Полезные команды#
Просмотр логов:
Остановка:
Обновление сервиса#
Для обновления версии необходимо загрузить актуальные конфигурационные файлы и пересобрать контейнер.
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
Сборка из исходников#
-
Клонируйте репозиторий:
-
Выполните пункты:
-
Запустите сборку:
Вход в сервис#
После запуска сервис становится доступен по адресу: http://SERVER:PORT
Пример: http://172.17.1.115:3037.
Swagger-документация по REST API: http://SERVER:PORT/docs
Пример: http://172.17.1.115:3037/docs.
Проверка работы сервиса#
Проверить работу сервиса можно следующими способами:
- Через Swagger интерфейс.
- С помощью утилиты 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 | Пароль от контейнера (если требуется) |
Пример ответа#
Диагностика сетевых подключений#
При проверке электронной подписи сервис может обращаться к внешним ресурсам:
- 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:
При необходимости можно также указать:
Перезапуск сервисов#
Перезапустите сервисы:
Просмотр логов прокси#
В логах будут отображаться все внешние соединения сервиса.
Диагностика через 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
Запуск сервисов#
Запустите/перезапустите сервисы:
Доступ к сервису#
После запуска:
-
API сервиса доступен через proxy:
http://SERVER:8080 -
web-интерфейс
mitmproxy:http://SERVER:8081
Через web-интерфейс можно анализировать все HTTP-запросы сервиса.