Криптопро докер и Установка криптоПро CSP в windows docker

Криптопро докер и Установка криптоПро CSP в windows docker Электронная цифровая подпись

Open source


Рекомендация: подборка платных и бесплатных курсов 3D-моделирования – https://katalog-kursov.ru/

В этой статье я расскажу о том, как я решал задачу об интеграции в тестовом режиме с сервисами, которые работают с использованием алгоритмов, определенных ГОСТ Р 34.10-2001 (устарел) и ГОСТ Р 34.10-2012. Приведу примеры некоторых проблем, с которыми столкнулся при решении задачи, дам ссылки на готовое решение и покажу несколько примеров их использования.

Содержание
  1. Введение
  2. Причины
  3. 3 Браузер Спутник, плагин Госуслуг и плагин КриптоПро
  4. Установка КриптоПро для работы с корневыми и личными сертификатами
  5. Установка браузера Chromium или Спутник
  6. Установка расширения для плагина Госуслуг (ЕПГУ)
  7. Вход на сайт Госуслуги через Спутник
  8. Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in»
  9. Добавление сайта в список доверенных сайтов плагина
  10. Установка сервера ELMA RPA
  11. Установка сервера на Windows
  12. Установка сервера через Docker-контейнер на Linux
  13. Изменение стандартного порта для HTTP подключения
  14. Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере
  15. Принцип работы
  16. Установка лицензии
  17. Загрузка корневого сертификата
  18. Загрузка пользовательского сертификата
  19. Как запустить
  20. Рест сервер
  21. Как по быстрому выпустить тестовый сертификат:
  22. Авторизация
  23. Возможные проблемы:
  24. Env контейнера
  25. Корневые сертификаты
  26. Онлайн курс по Kubernetes
  27. Помогла статья? Подписывайся на telegram канал автора
  28. Поддержка ГОСТ-алгоритмов в PHP
  29. Проверка лицензии
  30. Настройка мониторинга Docker
  31. Создание Docker образа для связки CryptoPro и Nginx
  32. Описание Dockerfile (очевидные вещи опущены)
  33. Описание docker-entrypoint
  34. Полезные команды и информация
  35. Примеры использования OpenSSL + GOST-engine
  36. КриптоПро JCP
  37. Поддержка Рутокена
  38. Запуск контрольной панели
  39. Управление персональным сертификатом
  40. Создание
  41. Просмотр
  42. Удаление
  43. Размещение контейнеров
  44. Сохранение сертификата в файле
  45. Импорт персонального сертификата
  46. Статья про КриптоПро
  47. Поддержка ГОСТ-сертификатов в nginx
  48. Сборка OpenSSL, GOST-engine, cURL
  49. Ссылки
  50. КриптоПро ЭЦП Browser plug-in
  51. Установка
  52. Установка Zabbix Agent 2
  53. Подписание документа ЭЦП
  54. Использование образа в работе с языками программирования
  55. Сертификаты
  56. Список установленных сертификатов
  57. Добавление реального сертификата
  58. Добавление реального сертификата с привязкой к закрытому ключу и возможностью подписывать документы
  59. Способ с дискетой или флешкой
  60. С жесткого диска
  61. Проверка успешности установки закрытого ключа
  62. Добавление тестового сертификата
  63. Удаление сертификата
  64. Проверка сертификата
  65. Просмотр всех атрибутов сертификата
  66. Экспорт сертификатов на другую машину
  67. Проверка подписи ЭЦП
  68. Заключение
  69. Заключение
  70. Используемая литература

Введение

Ранее я уже делал заметку по поводу Zabbix Agent 2, где перечислил основные отличия от прошлого агента. Их там много, так что рекомендую ознакомиться, прежде чем продолжать. Со временем развитие будет получать именно 2-я версия, а старый агент будет просто поддерживаться в том виде, как он есть сейчас. Новый функционал в него уже не будут завозить.

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Несколько релизов назад у Zabbix был анонсирован новый агент, расширяющий свой функционал с помощью плагинов. Сегодня я рассмотрю, как с помощью Zabbix Agent 2 настроить мониторинг контейнеров Docker, используя базовый шаблон. Заодно и посмотрю, что из себя представляет новый агент.

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Причины

Для начала стоит сказать, что для продакшн-окружения существуют сертифицированные средства от компаний «Криптоком», «Крипто-Про», «Сигнал-КОМ» и других. Мне же нужно было реализовать взаимодействие в тестовом (девелоперском) окружении на Linux, покупать для этого лицензии не очень-то удобно, но что хуже, в открытом доступе отсутствуют документации по этому вопросу. По запросу «https гост» не так много решений. Среди них упоминается использование OpenSSL + Крипто CSP, я не помню деталей, но эта связка у меня не завелась с поддержкой ГОСТ Р 34.10-2012. Другим результатом, который часто встречался, было предложение использовать OpenSSL 1.0, в котором GOST-engine встроен внутрь, но такое решение тоже не содержало в себе поддержку GOST2012-GOST8912-GOST8912.

Рабочим решением оказалась сборка OpenSSL 1.1.0g + вынесенный в отдельно подключаемый динамический движок GOST-engine. В интернете часто встречается упоминание, что некая российская компания приложила усилия по его разработке, но в самом репозитории нет сведений об авторах продукта. Пользуясь случаем, выражаю авторам благодарность за движок в open source. На этой странице сказано, что до OpenSSL 1.1.0 использовался встроенный движок GOST, сейчас для GOST используется сторонний от OpenSSL продукт. Судя по конфигурации, скорее всего, это одна и та же библиотека.

Требуемый опыт работы: 1–3 года

Полная занятость, полный день

Криптопро докер и Установка криптоПро CSP в windows docker

Москва, Проспект Мира, Проспект Мира

Работодатель, вероятно, уже нашел нужного кандидата и больше не принимает отклики на эту вакансию

Поддержка Инфраструктуры Компании. Обеспечение бесперебойной работы оборудования, ИТ сервисов и пользователей. Администрирование серверов Windows Server 2012R2-2022 (AD…

Квалификация, соответствующая MCP и CCNP. Отличные знания Azure AD\Office365 и MS Exchange Server 2016-2019 (обязательно).

Проведение работ по обслуживанию ИТ- оборудования. Организация приёма-передачи документов. Проверка заполнения документации. Проведение диагностирования оборудования и оценка его технического…

Знание Microsoft Exсel, Word. Знание системного ПО, установка, настройка. Знание функции ВПР, сводные таблицы, фильтры. Знание номенклатуры печатающей техники и…

Работодатель сейчас онлайн

написание отчетов, настройка маршрутизации документов. – администрирование и сопровождение банковского ПО – «iBank», ДБО BS-Client, Correqts Corporate, ИСУБД «Новая Афина». –

высшее инженерно-техническое образование. – профильный стаж работы от 5 лет. Будет плюсом: – опыт работы со СКЗИ (КриптоПро, Валидата). –

Москва

, Октябрьское поле

и еще

1

Пуско-наладка телекоммуникационного оборудования в области VoIP-решений. Подготовка проектной документации в объёме ТЗ, ТП, РД, ИД, ЭД.

Опыт работы в качестве проектировщика и пуско-наладчика с системами IP-телефонии и унифицированных коммуникаций корпоративного класса Eltex, Сател, Агат…

Администрирование серверов (в основном – виртуальных) под управлением Linux. Администрирование прикладного и технологического ПО в Linux, СУБД, кластеров высокой надежности.

Опыт создания сред разработки, настройки CI/CD, пайплайнов и окружений (тэги для понимания стека: docker, docker-compose, k8s…

Анализ, выявление, формализация, уточнение потребностей заказчика. Анализ интерфейсов и формирование CAN-матриц на их основании. Анализ нормативов, правил и стандартов…

Высшее техническое образование. Английский язык на уровне чтения и написания технической документации. Навыки управления требованиями, знание ISO 15288 и ISO…

3 Браузер Спутник, плагин Госуслуг и плагин КриптоПро

Криптопро докер и Установка криптоПро CSP в windows docker Скачать документ

Установка КриптоПро для работы с корневыми и личными сертификатами Установка браузера Chromium или Спутник Установка расширения для плагина Госуслуг (ЕПГУ) Вход на сайт Госуслуги через Chromium Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in» Добавление сайта в список доверенных сайтов плагина

Установка КриптоПро для работы с корневыми и личными сертификатами

Для установки КриптоПро перейдите по ссылке.

Установка браузера Chromium или Спутник

Для установки браузера Спутник зайдите на сайт https://sputnik-lab.com/, выберите версию «RED OS Linux 7.1 (64bit)» и нажмите кнопку «Скачать».

Перейдите в каталог со скачанным файлом (в качестве примера /home/test):

Для установки выполните команду:

  • для РЕД ОС 7.1 или 7.2:
# yum install sputnik-browser-stable-5.6.6325.0-1.x86_64.rpm
  • для РЕД ОС 7.3 и старше:
# dnf install sputnik-browser-stable-5.6.6325.0-1.x86_64.rpm 

Для установки браузера Chromium перейдите по ссылке.

Установка расширения для плагина Госуслуг (ЕПГУ)

1. Выполните команду для установки дополнений:

  • для РЕД ОС 7.1 или 7.2:
# yum install ifcplugin-chromium.x86_64
  • для РЕД ОС 7.3 и старше:
# dnf install ifcplugin-chromium.x86_64 

2. Установите расширение для плагина Госуслуг (ЕПГУ), перейдя по ссылке, и нажмите кнопку «Установить».

Криптопро докер и Установка криптоПро CSP в windows docker

Вход на сайт Госуслуги через Спутник

1. В браузере Спутник перейдите по ссылке и нажмите кнопку «Вход».

Криптопро докер и Установка криптоПро CSP в windows docker

2. На открывшейся странице нажмите на «Вход» с помощью электронной подписи.

Криптопро докер и Установка криптоПро CSP в windows docker

3. Подключите токен с ключом к компьютеру и нажмите кнопку «Готово».

Криптопро докер и Установка криптоПро CSP в windows docker

4. Выберите сертификат ключа проверки электронной подписи, щёлкнув левой кнопкой мыши по строке с сертификатом.

Криптопро докер и Установка криптоПро CSP в windows docker

5. Введите ПИН-код пользователя и нажмите кнопку «Продолжить».

Криптопро докер и Установка криптоПро CSP в windows docker

Установка КриптоПро «CryptoPro Extension for CAdES Browser Plug-in»

1. Скачайте плагин, перейдя по ссылке.

2. Распакуйте скачанный архив:

$ tar -xvf cades_linux_amd64.tar.gz

3. Перейдите в папку с распакованным архивом и установите следующие пакеты:

  • для РЕД ОС 7.1 или 7.2:
# yum install ./cprocsp-pki*rpm
  • для РЕД ОС 7.3 и старше:
# dnf install ./cprocsp-pki*rpm

4. Установите плагин CryptoPro Extension for CAdES Browser Plug-in, перейдя по ссылке, и нажмите кнопку «Установить».

Криптопро докер и Установка криптоПро CSP в windows docker

Проверить работу плагина можно по ссылке.

Добавление сайта в список доверенных сайтов плагина

Для добавления сайта откройте меню плагина и выберите пункт «Настройка доверенных сайтов».

Криптопро докер и Установка криптоПро CSP в windows docker

Далее откроется страница, на которой можно произвести добавление сайтов:

Криптопро докер и Установка криптоПро CSP в windows docker

Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.

Установка сервера ELMA RPA

Требуется редакция ELMA RPA Standard или Enterprise.

Вы можете установить сервера ELMA RPA на ОС Windows или Linux.

Установка сервера на Windows

Для работы сервера ELMA RPA на Windows требуется:

  • : Windows 10 64-bit: Pro, Enterprise or Education (Build 16299 or later) или Windows Server 2016 / Windows Server 2019;
  • : Docker 19.03.1;
  • : 2 ядра, тактовая частота 3 GHz и выше (рекомендуется Intel Xeon);
  • : 4 Gb;
  • : не менее 10 Gb свободного пространства на системном диске.

Процесс установки состоит из нескольких шагов.

Шаг 2. Распакуйте архив elma_rpa_server_v1.0.9_linux_amd64_docker.tar в необходимую папку.

Шаг 3. Откройте PowerShell и перейдите в папку с распакованным архивом.

сервер 3

Шаг 4. Перейдите в папку dockers_images с помощью команды:

Шаг 5. Загрузите образы, находящиеся в папке dockers_images, в Docker с помощью команд:

сервер 5

Шаг 6. Вернитесь к родительской папке.

сервер 6

Шаг 7. Чтобы запустить сервер, выполните команду:

сервер 7

Установка сервера через Docker-контейнер на Linux

Для работы сервера ELMA RPA на Linux требуется:

  • : операционная система семейства 64-bit Linux;
  • : Docker 19.03.1;
  • : 2 ядра, тактовая частота 3 GHz и выше (рекомендуется Intel Xeon);
  • : 4 Gb;
  • : не менее 10 Gb свободного пространства на системном диске.

Процесс установки состоит из нескольких шагов.

Шаг 1. Скопируйте архив elma_rpa_server_v1.0.9_linux_amd64_docker.tar в папку, где размещается сервер ELMA RPA (корневая папка сервера).

186

Шаг 2. Распакуйте архив с помощью команды:

184

Шаг 3. Перейдите в папку rpa_server_docker.

185

Шаг 4. Запустите bash-скрипт load_docker_imgs с помощью команды:

Скрипт загрузит образы ELMA RPA Server в docker.

Шаг 5. Проверьте наличие загруженных образов с помощью команды:

187

Шаг 6. Чтобы запустить сервер, выполните команду:

188

Изменение стандартного порта для HTTP подключения

После установки Оркестратора необходимо проверить корректность его работы.

Если порт занят другим приложением, вы можете изменить его.

Для этого выполните следующие действия (на примере Linux):

  1. Отредактируйте файл .

182

  1. Отредактируйте файл .

181

Нашли опечатку? Выделите текст, нажмите ctrl + enter и оповестите нас

Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере

Принцип работы

  • Устанавливает КриптоПро из установщика cryptopro/install/linux-amd64_deb.tgz
  • Устанавливает лицензию КриптоПро
  • Загружает корневой сертификат есиа
  • Загружает пользовательский сертификат
  • Запускает рест сервер со swagger и методом создания подписей
Читайте также:  Электронная подпись (ЭЦП) для кадастрового инженера

Установка лицензии

Лицензия устанавливается из аргумента LICENSE, если не указана используется триал версия(работает 3 месяца).

Загрузка корневого сертификата

в зависимости от аргумента ESIA_ENVIRONMENT загружается сертификат нужного окружения есиа:

Корневые сертификаты есиа лежат в папке cryptopro/esia

Загрузка пользовательского сертификата

Необходимо специальным образом сформировать zip-архив certificate_bundle.zip и положить его в папку /cryptopro/certificates.
Пример такого zip-файла лежит в той же директории под названием certificate_bundle_example.zip
Содержимое zip файла:

├── certificate.cer - файл сертификата
└── le-09650.000 - каталог с файлами закрытого ключа
    ├── header.key
    ├── masks2.key
    ├── masks.key
    ├── name.key
    ├── primary2.key
    └── primary.key

Первый найденный файл в корне архива будет воспринят как сертификат, а первый найденный каталог – как связка файлов закрытого ключа. Пароль от контейнера, если есть, передается аргументом CERTIFICATE_PIN

Как запустить

  1. Скачать КриптоПро CSP 4.0 для Linux (x64, deb) и положить по пути install/linux-amd64_deb.tgz
  2. Подложить архив с сертификатом как /cryptopro/certificates/certificate_bundle.zip
  3. Создаем образ docker build --tag cryptopro-sign --build-arg CERTIFICATE_PIN=12345678 .
  4. Запускаем docker run -it --rm -p 3037:3037 --name cryptopro-sign cryptopro-sign

Рест сервер

  • POST /cryptopro/sign – подписать текст

Как по быстрому выпустить тестовый сертификат:

  • Запустить докер контейнер по инструкции выше
  • Заходим в запущенный контейнер docker exec -ti cryptopro-sign sh
  • Создаем запрос на сертификат cryptcp -creatrqst -dn 'cn=test' -cont '\\.\hdimage\test2' -pin 12345678 tmp/test.csr (попросит понажимать разные клавиши)
  • Выводим результат cat /tmp/test.csr
  • Заходим на http://www.cryptopro.ru/certsrv/certrqxt.asp и вставляем вывод
  • В следующем окне выбираем Base64-шифрование и Скачать сертификат
  • Качаем и сохраняем certnew.cer файл в проекте по пути cryptopro/certificates/certnew.cer
  • В отдельном терминале переносим файл в запущенный контейнер docker cp cryptopro/certificates/certnew.cer cryptopro-sign:tmp/test.cer
  • Возвращаемся в первый терминал и загружаем сертификат в КриптоПро cryptcp -instcert -cont '\\.\hdimage\test2' tmp/test.cer
  • Попросит ввести пароль. Вводим 12345678
  • Переносим на нашу машину приватные ключи docker cp cryptopro-sign:var/opt/cprocsp/keys/root/test2.000 cryptopro/certificates/test2.000
  • В папке проекта cryptopro/certificates создаем архив. В архив кладем папку test2.000 и файл certnew.cer
  • Архив называем certificate_bundle.zip, пересобираем докер образ и запускаем.

Черпал вдохновение и взял многие вещи из этого репозитория

Авторизация

Для использования в продакшене лучше, чтобы сервис был не доступен снаружи инфраструктуры, т.к тут через рест можно что угодно подписать зашитым сертификатом. Если все же инфраструктура открытая, то в сервис следует встроить проверку авторизации.

Возможные проблемы:

Если получаете код ошибки 0x80090010 при вызове метода sign – вероятно срок действия вашего сертификата истек. Попробуйте создать новый по инструкции.

Env контейнера

PORT - numer. Порт рест сервера. Дефолт: 3037
docker run -d --name crypto-nginx --privileged --security-opt seccomp=unconfined --tmpfs /run --tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 443:443 -t crypto

Получение тестового сертификата для сервера (test.ru заменить на имя сайта). При запросе пароля для криптоконтейнера ввести пустой пароль:

docker  -ti crypto-nginx /root/config.sh test.ru

[email protected] /crypto-proxy # docker exec -ti crypto-nginx /root/config.sh navyzet.ru
CryptCP 4.0 (c) , 2002-2015.
Command prompt Utility  file signature and encryption.
Creating request...
CPCSP: Signing with the use of GOST R 34.10-2001 keys is not allowed from January 1st, 2019. We highly recommend to move to the use of GOST R 34.10-2012 keys  advance. Continue with the GOST R 34.10-2001 key generation
(o) OK, (c) Cancel
o
Press keys...
[..........................................................................]

CryptoPro CSP: Set password on produced container .
Password:
Retype password:
Passwords are not equal
Password:
Retype password:
Sending request to CA...
Installing certificate...
Certificate is installed.
[ReturnCode: 0]
Certmgr 1.0 (c) ,  2007-2010.
program  managing certificates, CRLs and stores

Install:
=============================================================================
1-------
Issuer               [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject              CN=navyzet.ru
Serial               0x12002667752E825729E3CF803A000000266775
SHA1 Hash            0x9e8c54c44ad16152ab55a59275a3dd01ef31143f
SubjKeyID            80b4d87101a23e4050fb67a12f6ed72c424969c8
Signature Algorithm  ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm  ГОСТ Р 34.10-2001 (512 bits)
Not valid before     05/03/2018  15:15:32 UTC
Not valid after      05/06/2018  15:25:32 UTC
PrivateKey Link      No
CA cert URL          http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202.crt
OCSP URL             http://testca.cryptopro.ru/ocsp/ocsp.srf
CDP                  http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202.crl
Extended Key Usage   1.3.6.1.5.5.7.3.1
=============================================================================

[ErrorCode: 0x00000000]
Certmgr 1.0 (c) ,  2007-2010.
program  managing certificates, CRLs and stores

Exporting:
=============================================================================
1-------
Issuer               [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject              CN=navyzet.ru
Serial               0x12002667752E825729E3CF803A000000266775
SHA1 Hash            0x9e8c54c44ad16152ab55a59275a3dd01ef31143f
SubjKeyID            80b4d87101a23e4050fb67a12f6ed72c424969c8
Signature Algorithm  ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm  ГОСТ Р 34.10-2001 (512 bits)
Not valid before     05/03/2018  15:15:32 UTC
Not valid after      05/06/2018  15:25:32 UTC
PrivateKey Link      Yes
Container            HDIMAGEcontaine.000514
Provider Name        Crypto-Pro GOST R 34.10-2001 KC2 CSP
Provider Info        ProvType: 75, KeySpec: 1, Flags: 0x0
CA cert URL          http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202.crt
OCSP URL             http://testca.cryptopro.ru/ocsp/ocsp.srf
CDP                  http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202.crl
Extended Key Usage   1.3.6.1.5.5.7.3.1
=============================================================================
Export 

[ErrorCode: 0x00000000]
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libssl.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl)
openssl: /opt/cprocsp/cp-openssl/lib/amd64/libcrypto.so.1.0.0: no version information available (required by openssl)
  Reloading nginx configuration nginx

В качестве клиента я использовал Chromium с поддержкой алгоритмов ГОСТ.

Корневые сертификаты

Просмотр корневых сертификатов

certmgr   uroot

В более старых версиях вместо uroot следует использовать root:

certmgr   root

Добавление корневых сертификатов (под root) из файла cacer.p7b

 certmgr    uroot  cacer.p7b

Необходимо последовательно добавить все сертификаты

Онлайн курс по Kubernetes

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Если вы ответите “да” хотя бы на один вопрос, то это ваш курс:

  • устали тратить время на автоматизацию?
  • хотите единообразные окружения?;
  • хотите развиваться и использовать современные инструменты?
  • небезразлична надежность инфраструктуры?
  • приходится масштабировать инфраструктуру под растущие потребности бизнеса?
  • хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?

Сдавайте вступительный тест по ссылке и присоединяйтесь к новому набору!.

Помогла статья? Подписывайся на telegram канал автора

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

Поддержка ГОСТ-алгоритмов в PHP

PHP, конечно, позволяет делать вызовы системных команд, используя, например, exec. Но, глядя на то, как собирается PHP-FPM в Dockerfile, мне показалось, что можно легко собрать PHP с кастомными сборками OpenSSL и cURL. Как оказалось дальше, я ошибся, что это легко. Всё равно собрал.

По какой-то причине, я начал с PHP-FPM 7.1. Идея была в том, чтобы использовать multi-stage build. Для этого надо заменить в их Dockerfile инструкцию FROM на мою FROM rnix/openssl-gost AS openssl-gost, затем прописать копирования собранных openssl и curl до начала сборки самого php и, наконец, указать в опции сборки путь до этих библиотек –with-openssl-dir=/usr/local/ssl и –with-curl=/usr/local/curl заменив оригинальные.

Сюрпризы ждали отовсюду. Одним из значительных было то, что при сборки php 7.1 используется pkg-config, а явная установка libcurl4-openssl-dev, libssl-dev прописывали в pkg-config версии из пакетов. В результате собиралось не то, что нужно. Если убрать их установку, то /configure php падал, ссылаясь на отсутствие openssl в pkg-config. Пришлось дополнительно копировать из кастомных сборок openssl и curl их lib/pkgconfig /*. После десятков таких сюрпризов сборка начала проходить. Дальше выяснилось, что зависимости устанавливали openssl, тем самым перезатирая ранее скопированный бинарник моей кастомной сборки. Пришлось дополнительно копировать его в самом конце. Но это не всё.

В собранном php появились алгоритмы хешей openssl_get_md_methods(): GOST R 34.11-2012 with 256 bit hash, GOST R 34.11-2012 with 512 bit hash, GOST R 34.11-94. Это значило, что php подключил GOST-engine. А вот использование расширения curl в php почему-то говорило, что таких алгоритмов не знает, соединяясь с хостом по GOST-HTTPS. Я потратил несколько часов, пытаясь найти причину этого. Я смотрел исходники, как устроено расширение curl в php, как устроен сам curl, как они связываются с openssl. Я искал место, где могут определяться поддерживаемые алгоритмы или подключатся движки. Я искал по master-веткам, много гуглил, но ничего, что решило бы сразу проблему, не нашел. Тогда я вспомнил, что я собираю не последнюю версию PHP.

Я попробовал собрать PHP-FPM 7.2. Пришлось внести некоторые правки в мой скрипт корректировки оригинального Dockerfile PHP-FPM, но сборка начала проходить без большого количества сюрпризов. Главной новостью стало то, что теперь расширение curl внутри php умело общаться по ГОСТ-алгоритмам с хостами, но была одна неприятность. Каждый вызов php писал в stdout GOST engine already loaded. Очень неприятно. Я не сразу понял, кто это делает, но такую строчку нашел в исходниках GOST-engine. Я до сих пор не знаю, в какой части системы случилась ошибка: php, php-curl, curl, openssl. Но, видимо, в php 7.1 php-curl не подключал движок совсем, теперь в php 7.2 начал подключать его дважды. Так как все работало корректно, только был вывод, я решил его убрать правкой исходника инструкцией в Dockerfile:

sed -i 's|printf("GOST engine already loaded\\n");|goto end;|' gost_eng.c

Там строчкой ниже уже есть goto end;, поэтому ничего серьезного я не сделал. Зато, пересобрав весь зоопарк, все начало работать, как и хотелось.
Образ с PHP-FPM + OpenSSL + GOST + cURL запушен в Docker Hub.

Проверка лицензии

Проверить срок истечения лицензии можно командой (обратите внимание на строки Expires:):

 cpconfig  
Server license:
-U0030-01C97-HQ92Y-1EY1K
Expires:  months  days
 
Client license:
-U0030-01C97-HQ92Y-1EY1K
Expires:  months  days

Для установки другой лицензии выполните (под root):

 cpconfig   серийный_номер

Серийный номер следует вводить с соблюдением регистра символов.

Настройка мониторинга Docker

Первым делом зайдём в консоль Zabbix сервера и убедимся, что он корректно может забирать данные о Docker с наблюдаемого хоста. Для этого воспользуемся утилитой zabbix_get.

# zabbix_get -s 10.20.50.7 -k docker.info

docker.info в zabbix

Если получите ошибку:

ZBX_NOTSUPPORTED: Cannot fetch data: Get http://1.28/info: dial unix /var/run/docker.sock: connect: permission denied.

Возвращайтесь на хост с агентом и docker и проверяйте права доступа пользователя zabbix к сокету докера. Выше я показал, что надо сделать.

Если всё в порядке с доступом, то переходите в web интерфейс сервера мониторинга. Нам нужно добавить к наблюдаемому хосту с Docker соответствующий шаблон. Называется он Docker by Zabbix agent 2.

Настройка мониторинга Docker

Если у вас его нет, как это было у меня, то скачайте свежую версию шаблона. Вам нужно выбрать файл template_app_docker.yaml и сохранить его исходный код в какой-то файл, чтобы потом импортировать на сервер Zabbix. Не забудьте указать расширение yaml, иначе импорт не заработает.

Импорт шаблона template_app_docker

На этом собственно настройка мониторинга Docker завершена. Он уже заработал. В шаблоне есть правила автообнаружения образов и контейнеров, которые запускаются каждые 15 минут. Чтобы ускорить начало сбора данных, вы можете вручную их запустить.

Автообнаружение Docker контейнеров в Zabbix

После этого в элементах данных появятся контейнеры и связанные с ними айтемы. В Последних данных можно смотреть метрики по тэгу Application: Docker.

Просмотр статистики по Docker

В шаблоне присутствуют следующие триггеры:

  • Нет информации о статусе службы Docker.
  • Служба Docker не запущена.
  • Изменилась версия Docker.
  • В контейнере зафиксирована ошибка в статусе.
  • Контейнер остановлен с ошибкой в exitcode.

Так же в шаблоне есть следующие графики:

  • Количество контейнеров с различным статусом.
  • Размер дискового пространства, занимаемое различными сущностями (images, layers, conteiners, volumes).
  • Docker goroutines (не знаю, что это такое).
  • Количество Images.
  • Суммарное потребление оперативной памяти докером.
  • CPU, Memory usage, сетевая статистика отдельно по каждому контейнеру. Вот только я не понял, как вычисляется метрика по CPU. Она представлена в миллисекундах. Это вычисляемое значение, которое берется из докеровского json со статами, далее выделяется jsonpath $.cpu_stats.cpu_usage.total_usage, переводится в изменения в секунду и в завершении используется арифметический множитель 1.0E-9. Если кто-то знает, подскажите, что это за метрика. Почему ее так считают.
Читайте также:  Ст. 433 ГК РФ. Момент заключения договора

Docker container cpu usage

Memory usage

Container network traffic

Network packets

Docker Memory total

Disk usage

Создание Docker образа для связки CryptoPro и Nginx

Далее по тексту мы используем следующие оговорки:

  • Docker образ на основе Centos 6.X
  • CryptoPro 4 R2 for linux
  • Nginx последняя сборка (на момент написания статьи 1.12.2-1.el6)
  • У нас выпущены валидные ключи и сертификаты для доменного имени или сгенерированы с помощью тестового УЦ CryptoPro
  • Сертификаты будут устанавливаться в контейеры с типом провайдера КС2, так как nginx работает только с этим типом

Описание Dockerfile (очевидные вещи опущены)

  • Копируем специально подготовленный конфигурационный файл openssl в Docker-образ (см. форум CryptoPro)
  • Инсталируем необходимое ПО redhat-lsb-core libcurl
  • Копируем контейнер (по усмолчанию контейнеры CryptoPro размещаются по пути /var/opt/cprocsp/keys/..., где ... имя пользователя, от которого создавался контейнер. В нашем случае root. Меняем владельца папки)
  • Копируем сертификат (местоназначения скопированного сертификата не имеет значения, но если использовать большую вложенность пути, импорт завершится с ошибкой)
  • Копируем файл конфигурации виртуального хоста test.conf

Описание docker-entrypoint

  • Запускаем сервис CryptoPro:

  • Указываем CryptoPro где находится библиотека Curl:

    /opt/cprocsp/sbin/amd64/cpconfig -ini \\config\\apppath -add string libcurl.so /usr/lib64/libcurl.so

  • Если переносимый контейнер имеет пароль, то его надо сбросить:

    /opt/cprocsp/bin/amd64/csptest -passwd -container ‘\\.\HDIMAGE\test_container’ -change ” -passwd ‘old_password’

  • Устанавливаем сертификат в контейнер с типом провайдера КС1 (обратите внимание, что имя контейнера идет без порядкового номера, используемого в dockerfile test.000):

    /opt/cprocsp/bin/amd64/certmgr -inst -file /tmp/nginx.cer -cont ‘\\.\HDIMAGE\test’

  • Устанавливаем ПО необходимое для работы с контейнерами типа КС2 (Важно чтобы данный пакет был инсталирован после установки сертификата, но перед линковокой установленного сертификата с контейнером типа КС2):

    yum install -y /tmp/lsb-cprocsp-kc2-64-4.0.0-4.x86_64.rpm

  • Линкуем установленный сертификат с контейнером КС2:

    /opt/cprocsp/bin/amd64/certmgr -inst -store uMy -cont ‘\\.\HDIMAGE\test’ -provtype 75 -provname “Crypto-Pro GOST R 34.10-2001 KC2 CSP”

  • Перековертируем сертификат из формата X509/DER в X.509/PEM:

    /opt/cprocsp/cp-openssl/bin/amd64/openssl x509 -inform der -in /tmp/nginx.cer -out /etc/nginx/nginx.pem

  • Редактируем nginx.conf. Необходимо изменить пользователя, от которого будет запускать nginx. Пользователь должен быть тем, от которого создавался/размещался контейнер с ключами. В нашем случае root

Полезные команды и информация

  • Запуск контейнера осуществляется командой:

    docker run –rm -p 443:443 -p 80:80 –name cprocsp6 –privileged –security-opt seccomp=unconfined –tmpfs /run –tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d crypto

  • Экспрот сертификата из контейнера в формате X509/DER (лучше использовать этот формат, так как при экспорте с опцией -base64 в файле сертификата будут отсутствовать строчки —–BEGIN CERTIFICATE—– и —–END CERTIFICATE—–)
    /opt/cprocsp/bin/amd64/certmgr -export -store uMy -dest /tmp/nginx.cer

  • Проверить наличие установленных сертификатов в системе (в поле Provider Name должно быть Crypto-Pro GOST R 34.10-2001 KC2 CSP):
    /opt/cprocsp/bin/amd64/certmgr -list -store uMy

    • Работа с выгруженным контейнером формата pfx в Linux-like системах не поддерживается!
    • Описание файла конфигурации виртуального хоста:

      ssl_certificate     /etc/nginx/nginx.pem;               наш ГОСТовский сертификат
      ssl_certificate_key engine:gost_capi:node.sdsys.ru;     наш ГОСТовский ключ
      ssl_certificate     /etc/nginx/sdsys.crt;               
      ssl_certificate_key /etc/nginx/sdsys.key;
      ssl_session_cache shared:SSL:1m;
      ssl_session_timeout  5m;
      ssl_protocols               TLSv1;
      ssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;         описание Ciphers
      ssl_prefer_server_ciphers   on;
      
      

В описании location необходимо добавить proxy_set_header X-SSL-Cipher $ssl_cipher;

Используемая литература:

Форум CryptoPro

Другие источники

Примеры использования OpenSSL + GOST-engine

Не буду сильно вдаваться в подробности работы с докер-образами, лишь приведу одну команду для начала работы внутри образа:

docker run --rm -i -t rnix/openssl-gost bash

Для начала можно убедиться, что алгоритмы GOST2012-GOST8912-GOST8912 и GOST2001-GOST89-GOST89 есть в списке поддерживаемых:

openssl ciphers

Если вам известен хост, который работает по HTTPS на основе ГОСТ-алгоритмов, то посмотреть его сертификат и попробовать подключиться можно командой:

openssl s_client -connect gost.example.com:443 -showcerts

Создать закрытый ключ и сертификат по ГОСТ Р 34.10-2012:

openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem

Подписать файл ранее созданными сертификатами:

openssl cms -sign -signer cert.pem -inkey key.pem -binary -in file.txt -nodetach -outform DER -nocerts -noattr -out signed.sgn

Извлечь содержимое подписанного файла, сертификатом, который был подписан самим собой:

openssl cms -verify -in signed.sgn -certfile cert.pem -CAfile cert.pem -inform der -out data.txt

С подписями самих сертификатов все немного сложнее. Пока мне не попался сервис, у которого сертификат выдан доверенным центром сертификации. Обычно, требуется дополнительно указывать сертификат удостоверяющего центра при работе с выданными им сертификатами. Это можно сделать глобально для системы (в образе), либо явно указывать в каждой команде.

Программа cURL в использовании не изменилась, просто поддерживает хосты с ГОСТ-сертификатами.

КриптоПро JCP

  • Для установки КриптоПро JCP нужно установить Oracle Java 1.7.0 (через собственную сборку или пакеты для Fedora)

  • Распакуйте архив и перейдите в каталог

 .install.sh usrjavajre1.7.0_51 XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 

Поддержка Рутокена

  • Выполните:

   rtjlib.jar  

Запуск контрольной панели

.ControlPane.sh usr

(требует графического дисплея)

Управление персональным сертификатом

Создание

Для создания запроса потребуется:

  • имя контейнера (в локальном хранилище hdimage: \\.\hdimage\webserver

  • имя файла запроса webserver.csr

Во время работы программы потребуется нажимать любые кнопки (после запроса «Press keys») и дважды указать пароль на контейнер (после запроса «Password:»).

 cryptcp      webserver.csr
CryptCP  c , -.
Command prompt Utility   signature and encryption.
Press keys...
........................................
CryptoPro CSP: Set password on produced container .
Password:
Retype password:
Request is saved  file.
ReturnCode: 

Откройте в браузере ссылку http://www.cryptopro.ru/certsrv/certrqxt.asp (тестовый удостоверяющий центр КриптоПро).

Вставьте в поле «Base-64-шифрованный запрос сертификата» содержимое файла webserver.csr и нажмите кнопку «Выдать». Затем сохраните файл по ссылке «Загрузить сертификат» (по умолчанию предлагается имя certnew.cer.

Установите сертификат (введите пароль на контейнер при запросе):

 cryptcp    certnew.cer
CryptCP  c , -.
Command prompt Utility   signature and encryption.
CryptoPro CSP: Type password  container 
Password:
Certificate is installed.
ReturnCode: 

Просмотр

 certmgr 
Certmgr  c ,  -.
program  managing certificates, CRLs and stores
 
=============================================================================
-------
Issuer            : =infocryptopro.ru, =RU, =CRYPTO-PRO, =Test Center CRYPTO-PRO
Subject           : =webserver
Serial            : 0x28840500020011AA2550
SHA1 Hash         : 0x744fdc41b8d1b9132120a2bdc706b46cfb6d9e8c
Not valid before  :   09:: UTC
Not valid after   : 04  07:09: UTC
PrivateKey Link   : Yes. Container  : HDIMAGE\\webserve.000\D0FF
=============================================================================
 
ErrorCode: 0x00000000

Удаление

Удаление сертификата

certmgr  

Удаление контейнера:

certmgr   

Размещение контейнеров

Контейнеры HDIMAGE: /var/opt/cprocsp/keys/<имя пользователя>/

Сохранение сертификата в файле

 cryptcp     CERT.cer
CryptCP  c , -.
Command prompt Utility   signature and encryption.
Openning container...
Certificate

Импорт персонального сертификата

Вы можете импортировать собственный сертификат в локальный считыватель HDIMAGE.

Если у вас нет сертификата, самое время его создать:

  • Создание через cert-sh-functions (требует установки пакета cert-sh-functions

  • Создание сертификатов PKCS12 (достаточно только пакета openssl)

Допустим, мы пошли по первому пути и создали сертификат web-server:

cert-sh-functions
ssl_generate 

Сертификат по умолчанию будет лежать в /var/lib/ssl/certs/web-server.cert, а ключ ­— в /var/lib/ssl/private/web-server.key

Для импорта потребуется файл сертификата и закрытый ключ в контейнере PKCS#12.

Создадим для нашего ключа и сертификата необходимый контейнер:

 openssl pkcs12   varlibsslcertsweb-server.cert  varlibsslprivateweb-server.pem  web-server.p12

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

Проверка созданного контейнера (при запросе введите пароль, введённый в предыдущей команде):

 openssl pkcs12  web-server.p12    BEGIN
Enter Import Password:
MAC verified OK
 CERTIFICATE-----
 PRIVATE KEY-----

И сертификат и ключ попали в контейнер.

После генерации сертификата проверим наличие считывателя:

 cpconfig  reader    ^Nick
Nick name: FLASH
Nick name: HDIMAGE

Если считывателя нет, создайте его:

 cpconfig  reader  HDIMAGE store

Для импорта сертификата в КриптоПро используйте программу certmgr:

 certmgr   путь к файлу с сертификатом  имя контейнера

В нашем случае:

certmgr   web-server.p12  HDIMAGE

Статья про КриптоПро

Оригинал статьи

КриптоПро – линейка криптографических утилит (вспомогательных программ) — так называемых криптопровайдеров. Они используются во многих программах российских разработчиков для генерации ЭЦП, работы с сертификатами, организации структуры PKI и т.д.

Поддержка ГОСТ-сертификатов в nginx

Возможность работать из языков программирования это уже много, но хотелось еще две возможности:

  1. Легко поднимать свой веб-сервер с ГОСТ-сертификатом по HTTPS (TLS).
  2. Легко проксировать все запросы на хост с ГОСТ-сертификатом

Легко – это означает докер-образ. Его нужно создать. Для этого нужно в Dockerfile собрать nginx с кастомным OpenSSL и GOST-engine. Открыв документацию сборки nginx, я увидел одну опцию о ssl — --with-http_ssl_module, которая просто булева. Но nginx популярный продукт, инструкций по сборке с openssl много, поэтому я нашел еще опцию --with-openssl=[DIR]. Как показала практика, nginx хочет, чтобы здесь были исходники openssl, а сборкой скрипты nginx займутся сами. Это не совсем то, что я хотел бы (я хотел использовать multi-stage build). Я ознакомился с help-выводом сборщика nginx, но ничего, что мне там помогло бы, я не нашел.

Пришлось дублировать инструкции выкачивания исходников OpenSSL, распаковки, сборки GOST-engine, включения GOST-engine в конфиги. Всё это начало собираться, но поддержки ГОСТ-алгоритмов в nginx все ещё не было. Это я проверял указанием в конфиге ssl_ciphers GOST2001-GOST89-GOST89:HIGH:MEDIUM;. Выполнение nginx -t говорило, что не знает этого алгоритма.

Как оказалось, openssl, собранный nginx, не поддерживал динамические движки, т.е. ./Configure выводил no-dynamic-engine [forced]. Здесь пришлось внимательно почитать документацию сборки OpenSSL, чтобы выяснить, что проставило forced. Причина нашлась в аргументах сборки openssl, которые вызывал nginx, а именно no-shared. Если это указано, то нет никаких флагов, чтобы включить поддержку загрузки движков. Пришлось править инструкцию сборки:

sed -i 's|--prefix=$ngx_prefix no-shared|--prefix=$ngx_prefix|' auto/lib/openssl/make

Всё это собралось, но nginx начал ругаться, что не может найти gost.so по пути /usr/lib/x86_64-linux-gnu/, это довольно странно, потому что тот же собранный openssl ищет и находит движки совсем в другом месте, а именно там, где и собирался ./lib/engines-1.1. Добавил инструкцию копирования собранных движков в /usr/lib/x86_64-linux-gnu/, чтобы угодить nginx. Заработало.

Рядом с основным Dockerfile в репозитории я положил демонстрационный Dockerfile, который при сборке создает себе ГОСТ-сертификаты и использует их, обрабатывая соединения на https://gost.example.com. Придется поработать с DNS или docker network, чтобы из одного контейнера попробовать подключится к этому демонстрационному, но все это я описал в документации.
Демонстрационный хост использует ключи по gost2001, другие варианты это gost2012_256, gost2012_512. А вместо GOST2001-GOST89-GOST89GOST2012-GOST8912-GOST8912.
Образ с nginx + GOST запушен в Docker Hub: https://hub.docker.com/r/rnix/nginx-gost/

Сборка OpenSSL, GOST-engine, cURL

Сборка стороннего продукта для тех, кто делает это редко, может быть нетривиальной задачей. Для сборки OpenSSL, GOST-engine и cURL пришлось разобраться с кучей опций и перепробовать несколько комбинаций версий. Если в Dockerfile вы заметите странное, то, скорее всего, это осталось от таких экспериментов.

Я зафиксировал все версии проектов для сборки, чтобы исключить ситуацию, что из-за обновления что-то перестанет работать. Например, я собирал OpenSSL 1.1.0h + GOST-engine и команда openssl ciphers не содержала GOST-алгоритмов, хотя openssl engine показывала GOST-engine в списке. Указав предыдущую версию OpenSSL 1.1.0g, все работало, как ожидалось. Это было очень странно, я повторил это еще раз, потом пытался выяснить причины, но в итоге решил остаться на 1.1.0g.

Собирая сам GOST-engine, я не сразу обратил внимание на наличие файла INSTALL.md в master-ветке, потому что собирал из ветки openssl_1_1_0 по неизвестно откуда взятой документации. Та версия собиралась с кастомной сборкой OpenSSL командой

cmake -DCMAKE_C_FLAGS='-I/usr/local/ssl/include -L/usr/local/ssl/lib' ..

Но master-ветка так собираться перестала, появились ошибки об отсутствии DOPENSSL_ROOT_DIR и подобное. В итоге решение было найдено и зафиксировано.

Читайте также:  ЭЦП для физлиц для торгов во Владимире - получить недорого

Для сборки cURL с кастомной сборкой OpenSSL гораздо больше документации, тем не менее, документация успевала устаревать, и с опциями пришлось много экспериментировать.
Результат работы выложен здесь.
Образ запушен в Docker Hub.

Ссылки

  1. Репозиторий со всеми решениями на GitHub
  2. Образ на Docker Hub с OpenSSL + GOST + cURL
  3. ГОСТ Р 34.10-2012 на Википедии со списком сертифицированных решений
  4. Репозиторий GOST-engine
  5. О возможностях и ограничениях GOST-engine
  6. Пример того, как решают вопрос в продакшн-окружении

КриптоПро ЭЦП Browser plug-in

Плагин проверки ЭЦП для браузера требует установленного КриптоПро CSP. Инструкция на сайте производителя: http://www.cryptopro.ru/cadesplugin/Manual.aspx

1. Скачиваем архив по ссылке http://www.cryptopro.ru/products/cades/plugin/get

Будет скачен архив под архитектуру браузера.

2. Распаковываем архив, устанавливаем пакеты:

– сначала из дистрибутива КриптоПро:

  lsb-cprocsp-cades-3.6.1-.i486.rpm \
 lsb-cprocsp-ocsp-util-3.6.1-.i486.rpm \
 lsb-cprocsp-tsp-util-3.6.1-.i486.rpm

– затем сам плагин:

  cprocsp-npcades-.rpm

3. Копируем библиотеки:

на 32-битной системе:

  optcprocsplibia32libncades.so usrlibbrowser-plugins

на 64-битной системе:

  optcprocsplibamd64libncades.so usrlib64browser-plugins

4. В Mozilla Firefox или Chromium перезапустите браузер и откройте адрес about:plugins. Убедитесь, что плагин установлен.
На странице http://www.cryptopro.ru/cadesplugin/Manual.aspx справа вверху должна появится надпись:

Плагин загружен

и появится ссылка «Демо-страница».

Под Firefox 17.0.6 плагин падает. Более новые версии работают.

На странице работает только усовершенствованная подпись при следующих условиях:

  • для tsputil и ocsputil есть валидные коммерческие лицензии (запустите программы с командой license, установка лицензии с параметрами license -s <серийный номер>)

При создании обычной подписи показывается ошибка http://ats.cryptopro.ru/forum2/default.aspx?g=posts&m=34173#post34173:

 Не удалось создать подпись из-за ошибки: Internal error. (0x800B010A)

Установка

  • Распакуйте архив и перейдите в распакованную папку

  • Проверьте доступность репозиториев для установки или установите вручную пакеты lsb, pcsc-lite, libpcsclite-devel

  • Под правами пользователя root выполните:

 lsb-cprocsp-base-3.6.1-.noarch.rpm lsb-cprocsp-rdr-3.6.1-.i486.rpm lsb-cprocsp-capilite-3.6.1-.i486.rpm lsb-cprocsp-kc1-3.6.1-.i486.rpm

Примечания:

  • Для КриптоПро CSP 3.6 R2 потребуется установить пакет cprocsp-compat-altlinux-1.0.0-1.noarch.rpm

  • Для установки cprocsp-rdr-gui может понадобиться libXm.so.3 (libopenmotif3) и для вывода кириллицы fonts-bitmap-cyr_rfx-iso8859-5.

  • Для установки cprocsp-rdr-gui-gtk потребуется предварительно установить libpangox-compat.

Установка Zabbix Agent 2

На хост, где крутятся Docker контейнеры, которые мы мониторим, надо установить Zabbix agent. Установка будет зависеть от системы хоста, но в общем случае это просто подключение нужного репозитория и установка через пакетный менеджер.

На момент написания статьи, последней версией Zabbix была 5.4, так что показываю, как установить Zabbix Agent 2 именно этой версии.

Ubuntu 20:

# wget https://repo.zabbix.com/zabbix/5.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1+ubuntu20.04_all.deb
# dpkg -i zabbix-release_5.4-1+ubuntu20.04_all.deb
# apt update
# apt install zabbix-agent2

Debian 10:

# wget https://repo.zabbix.com/zabbix/5.4/debian/pool/main/z/zabbix-release/zabbix-release_5.4-1+debian10_all.deb
# dpkg -i zabbix-release_5.4-1+debian10_all.deb
# apt update
# apt install zabbix-agent2

Centos 8 и другие rpm-based дистрибутивы:

# rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/8/x86_64/zabbix-release-5.4-1.el8.noarch.rpm
# dnf clean all
# dnf install zabbix-agent2

Делаем базовую настройку агента. Добавляем в конфиг /etc/zabbix/zabbix_agent2.conf информацию о сервере и имени хоста.

Server=10.20.1.1
ServerActive=10.20.1.1
Hostname=docker-host

Перезапускаем zabbix-agent2 и добавляем в автозагрузку.

# systemctl restart zabbix-agent2
# systemctl enable zabbix-agent2

Установка zabbix-agent2

Дополнительно нам нужно добавить пользователя zabbix, от имени которого работает агент, в группу docker, чтобы у него был доступ к docker.sock.

# usermod -aG docker zabbix

После этого надо перезагрузить хост, чтобы изменения вступили в силу. Если этого делать не хочется или нет возможности, можно напрямую выдать права.

# setfacl --modify user:zabbix:rw /var/run/docker.sock

Теперь переходим на сервер мониторинга Zabbix. Дальнейшая настройка будет проходить там.

Подписание документа ЭЦП

cryptcp  КПС   pincode src.txt dest.txt.sig
  • nochain – отменяет проверку цепочки сертификатов

  • pin – пин-код

  • КПС1 – критерий поиска сертификата

Пример создания ЭЦП (по SHA1 Hash):

cryptcp   255c249150efe3e48f1abb3bc1928fc8f99980c4    test.txt test.txt.sig
[ReturnCode: x] Описание Возвращаемый код завершения в баше $?
0 успешно 0
0x8010006b Введен неправильный PIN 107
0x2000012d Сертификат не найден 45
0x20000065 Не удалось открыть файл 101

Использование образа в работе с языками программирования

Если язык программирования позволяет исполнять установленные в системе программы, то задача использования ГОСТ-алгоритмов проще всего решается копированием бинарников собранных openssl и curl в конце Dockerfile языка программирования с использованием multi-stage build. Например:

FROM rnix/openssl-gost AS openssl-gost

# Replace with any other image based on Debian x86_64
FROM debian:stretch-slim

COPY --from=openssl-gost /usr/local/ssl /usr/local/ssl
COPY --from=openssl-gost /usr/local/ssl/bin/openssl /usr/bin/openssl
COPY --from=openssl-gost /usr/local/curl /usr/local/curl
COPY --from=openssl-gost /usr/local/curl/bin/curl /usr/bin/curl
COPY --from=openssl-gost /usr/local/bin/gostsum /usr/local/bin/gostsum
COPY --from=openssl-gost /usr/local/bin/gost12sum /usr/local/bin/gost12sum

Даже необязательно копировать в /usr/bin, это можно сделать в любой каталог, а затем вызывать из вашей программы, передав полный путь и все аргументы.

Сертификаты

Список установленных сертификатов

certmgr -list, например:

1-------
Issuer            : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject           : CN=test2
Serial            : 0x120007E4E683979B734018897B00000007E4E6
SHA1 Hash         : 0x71b59d165ab5ea39e4cd73384f8e7d1e0c965e81
Not valid before  : 07/09/2015  10:41:18 UTC
Not valid after   : 07/12/2015  10:51:18 UTC
PrivateKey Link   : Yes. Container  : HDIMAGE\\test2.000\F9C9
2-------
Issuer            : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject           : CN=webservertest
Serial            : 0x120007E47F1FD9AE0EDE78616600000007E47F
SHA1 Hash         : 0x255c249150efe3e48f1abb3bc1928fc8f99980c4
Not valid before  : 07/09/2015  09:56:10 UTC
Not valid after   : 07/12/2015  10:06:10 UTC
PrivateKey Link   : Yes. Container  : HDIMAGE\\webserve.00108

Добавление реального сертификата

Добавить только сертификат (только проверка ЭЦП):

certmgr   cert.cer

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

Закрытый ключ состоит из шести key-файлов:

header.key
masks2.key
masks.key
name.key
primary2.key
primary.key

Способ с дискетой или флешкой

Скопировать в корень дискеты или флэшки сертификат и приватный ключ (из каталога 999996.000, 999996 – название (alias) контейнера):

  pathtokey mediaflashdrive
 pathtocertclient.cer mediaflashdrive

Выполнить команду по копированию ключа с флэшки на диск, ключ попадет в пользовательское хранилище My.

Необходимо выполнять под пользователем, который будет использовать данный контейнер для подписи.

gate@example.com – то, что прописано в поле E сертификата (можно посмотреть командой keytool --printcert -file /path/to/cert/client.cer):

csptest     

С жесткого диска

«Ручной способ».

Скопировать приватный ключ в хранилище (контейнер), где <username> – имя пользователя linux:

  pathtokey varoptcprocspkeysusername

Поставить «минимальные» права:

  varoptcprocspkeysusername

Узнать реальное название контейнера:

csptest  -enum_cont  

Ассоциировать сертификат с контейнером, сертификат попадет в пользовательское хранилище My:

certmgr   pathtofileclient.cer  

Если следующая ошибка, нужно узнать реальное название контейнера (см. выше):

Failed to open container \\.\HDIMAGE\<container>
[ErrorCode: 0x00000002]

Установить сертификат УЦ из-под пользователя root командой:

certmgr   uroot  pathtofileCA.cer

Проверка успешности установки закрытого ключа

certmgr 

PrivateKey Link

Если выводится PrivateKey Link: Yes. Container: HDIMAGE\\999996.000\D7BB, то есть и сертификат, и приватный ключ, а если выводится PrivateKey Link: No – связи нет, и использовать такой контейнер для подписи не удастся.

Источник

Добавление тестового сертификата

Добавление работает только на той же машине, и в тот же контейнер, где был сформированы следующий запрос на добавление:

cryptcp      test.csr

Ввести пароль на контейнер test123.

cryptcp      myname.csr

Пароль mysecurepass

Откройте в браузере ссылку тестовый удостоверяющий центр КриптоПро

cryptcp    certnew.cer

Ввести пароль на контейнер. По-умолчанию: 12345678

Удаление сертификата

Проверка сертификата

certmgr   file.sig

Ответ:

1-------
Issuer            : E=cpca@cryptopro.ru, C=RU, L=Москва, O=ООО КРИПТО-ПРО, CN=УЦ KPИПTO-ПPO
Subject           : E=info@site.ru, C=RU, L=г. Москва, O="ООО ""Верес""", OU=Руководство, CN=Иванов Иван Иванович, T=Генеральный директор
Serial            : 0x75F5C86A000D00016A5F
SHA1 Hash         : 0x255c249150efe3e48f1abb3bc1928fc8f99980c4
Not valid before  : 08/12/2014  09:04:00 UTC
Not valid after   : 08/12/2019  09:14:00 UTC
PrivateKey Link   : No

Подписание пустого файла (размер 0) проходит успешно, но при просмотре сертификатов этого файла выдается ошибка:

Can't open certificate store: '/tmp/tmp.G8cd13vzfZ.sig'.
Error: No certificate found.
/dailybuilds/CSPbuild/CSP/samples/CPCrypt/Certs.cpp:312: 0x2000012D
[ErrorCode: 0x2000012d]

Будьте внимательны!

Просмотр всех атрибутов сертификата

В cryptcp нет необходимых инструментов для получения всех атрибутов сертификата. Поэтому следует использовать openssl, но настроив его.

Получаем SHA 1 хеши:

certmgr -list -f file.sig | grep 'SHA1 Hash'

В цикле извлекаем сертификаты:

cryptcp -nochain -copycert -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -f file.sig -df certificate.der -der
openssl x509 -in certificate.der -inform der -text -noout

Настройка openssl для поддержки ГОСТ:

В файл /etc/ssl/openssl.cnf

 openssl_def # Это в начало файла
#Все что ниже в конец

 
 

 
 

 
 /usr/lib/ssl/engines/libgost.so # заменить реальным файлом
 
 

Проверка:

openssl ciphers        gost
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

Экспорт сертификатов на другую машину

Закрытые ключи к сертификатам находятся тут: /var/opt/cprocsp/keys. Поэтому эти ключи переносятся просто: создаем архив и переносим на нужную машину в тот же каталог.

Экспорт самих сертификатов (если их 14):

 i    ;     certmgr   .cer; 

Переносим эти файлы на машину и смотрим, какие контейнеры есть:

csptest -keyset -enum_cont -verifycontext -fqcn

И как обычно, связываем сертификат и закрытый ключ:

certmgr -inst -file 1.cer -cont '\\.\HDIMAGE\container.name'

Если закрытый ключ и сертификат не подходят друг к другу, будет выведена ошибка:

Can not install certificate
Public keys in certificate and container are not identical

Если все успешно:

Криптопро докер и Установка криптоПро CSP в windows docker

Если нет закрытого ключа, то просто ставим сертификат:

certmgr -inst -file 1.cer

Проверка подписи ЭЦП

Для верифицирования сертификатов нужен сертификат удостоверяющего центра и актуальный список отзыва сертификатов,
либо настроенный для этого revocation provider.

Корневой сертификат УЦ, список отзыва сертификата является одним из реквизитов самого сертификата.

Контрагенты когда открывают подписи в КриптоАРМ используют revocation provider, он делает проверки отзыва сертификата онлайн.
Как реализована проверка в Шарепоинте не знаю. Знаю только что используется библиотека Крипто.Net

cryptcp  

Проверка конкретной подписи из локального хранилища по его хешу:

cryptcp   255c249150efe3e48f1abb3bc1928fc8f99980c4  test.txt.sig

Проверить, взяв сертификат из file1.sig, подпись файла file2.sig. Практически, надо использовать один и тот же файл:

cryptcp    file1.sig file2.sig

Ответ:

Certificates found: 2
Certificate chains are checked.
Folder './':
file.xls.sig... Signature verifying...
Signer: Старший инженер, Иванов Иван Иванович, Отдел закупок, ООО «Верес», Москва, RU, info@site.ru
 Signature's verified.
Signer: Генеральный директор, Сидоров Иван Петрович, Руководство, ООО «Кемоптика», Москва, RU, info@site.ru
 Signature's verified.
[ReturnCode: 0]

Результат:

[ReturnCode: x] Текст Описание Возвращаемый код завершения в баше $?
0 Успешно 0
0x80091004 Invalid cryptographic message type Неправильный формат файла 4
0x80091010 The streamed cryptographic message is not ready to return data Пустой файл 16

Заключение

Мной изучена проблема работы с ГОСТ-алгоритмами в системах Linux, предоставлено решение в виде docker-образов, все это сопровождено документацией и примерами. Решение оформлено в виде репозитория на GitHub.

Стоит сказать о безопасности использования такого решения. Главное, не стоит доверять образам на Docker Hub, даже если там написано Automated Build. Я все равно могу собрать образ с любыми правками всех используемых библиотек и систем и запушить его в свой Docker Hub под любым тегом. Поэтому рекомендую форкать репозиторий на гитхабе, пулить его себе и уже самостоятельно собирать, проверив инструкции в Dockerfile на наличие того, что используются только официальные ресурсы без подозрительных модификацией по ходу сборки.

Собирая образ самостоятельно, вы можете убедиться, что в код не попали злонамеренные правки, потому что сборка происходит только из открытого кода, который доступен для просмотра всем желающим. Тем не менее, это не гарантирует, что в нем нет ошибок и уязвимостей. Использование проприетарных сертифицированных средств так же не гарантирует отсутствие ошибок и уязвимостей, но к тому же их код от вас закрыт.

Заключение

Сколько бы Zabbix не хоронили, но он живее всех живых и развивается в правильном направлении. С его помощью нет никаких проблем в настройке мониторинга Docker, несмотря на то, что это динамически изменяемая среда. Все изменения отслеживаются и мониторинг настраивается автоматически. Участие оператора не требуется. Достаточно один раз все сделать. Причем допиливать что-то тоже нет необходимости. Всё работает из коробки с помощью штатного функционала.

Используемая литература

  • ЖТЯИ.00050-03 90 02-02. СКЗИ «КриптоПро CSP». Руководство администратора безопасности. Использование СКЗИ под управлением ОС Linux (из электронной документации по КриптоПро; доступно для скачивания с демонстрационной версией)

  • ЖТЯИ.00050-03 90 07. КриптоПро CSP. Приложение командной строки

Оцените статью
ЭЦП Эксперт
Добавить комментарий

Adblock
detector