docker криптопро csp

Open source


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

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

Есть .net core приложение, которое работает в Azure (в докере, linux). Приложению необходимо шифровать данные, используя КриптоПро. Локально приложение разрабатывается в двух ОС – Windows и MacOS. Решал ли кто-нибудь задачу, как кроссплатформенно работать с КриптоПро?

задан 24 фев 2021 в 8:39

Alexander W.'s user avatar

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

ответ дан 24 фев 2021 в 9:08

gbg's user avatar

gbggbg

21.8k2 золотых знака31 серебряный знак52 бронзовых знака

Содержание
  1. Причины
  2. 5 Работа с электронной подписью в РЕД ОС под Байкал-М
  3. Установка КриптоПро CSP 4
  4. Установка КриптоПро CSP 5
  5. Установка драйверов для токенов Рутокен
  6. Утилиты token-manager и gostcryptogui
  7. Вход по сертификату на Госуслуги в РЕД ОС под Байкал-М
  8. Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере
  9. Принцип работы
  10. Установка лицензии
  11. Загрузка корневого сертификата
  12. Загрузка пользовательского сертификата
  13. Как запустить
  14. Рест сервер
  15. Как по быстрому выпустить тестовый сертификат:
  16. Авторизация
  17. Возможные проблемы:
  18. Env контейнера
  19. Установка
  20. КриптоПро JCP
  21. Поддержка Рутокена
  22. Запуск контрольной панели
  23. Управление персональным сертификатом
  24. Создание
  25. Просмотр
  26. Удаление
  27. Размещение контейнеров
  28. Сохранение сертификата в файле
  29. Импорт персонального сертификата
  30. Сборка OpenSSL, GOST-engine, cURL
  31. Проверка подписи ЭЦП
  32. Использование образа в работе с языками программирования
  33. Ссылки
  34. Подписание документа ЭЦП
  35. Проверка лицензии
  36. Статья про КриптоПро
  37. Примеры использования OpenSSL + GOST-engine
  38. Корневые сертификаты
  39. Поддержка ГОСТ-сертификатов в nginx
  40. КриптоПро ЭЦП Browser plug-in
  41. Поддержка ГОСТ-алгоритмов в PHP
  42. Сертификаты
  43. Список установленных сертификатов
  44. Добавление реального сертификата
  45. Добавление реального сертификата с привязкой к закрытому ключу и возможностью подписывать документы
  46. Способ с дискетой или флешкой
  47. С жесткого диска
  48. Проверка успешности установки закрытого ключа
  49. Добавление тестового сертификата
  50. Удаление сертификата
  51. Проверка сертификата
  52. Просмотр всех атрибутов сертификата
  53. Экспорт сертификатов на другую машину
  54. Заключение
  55. Используемая литература

Причины

Для начала стоит сказать, что для продакшн-окружения существуют сертифицированные средства от компаний «Криптоком», «Крипто-Про», «Сигнал-КОМ» и других. Мне же нужно было реализовать взаимодействие в тестовом (девелоперском) окружении на 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 продукт. Судя по конфигурации, скорее всего, это одна и та же библиотека.

Всем привет!

Не могу победить ситуацию.   Пытаюсь перенести закрытый ключ с VIPnet 4.2/ 4.4  Windows  в PFX на Крипто-про. Уже делал это с прошлыми ключами.

Но сейчас неожиданно получил эффект:  Закрытый ключ не экспортируется или экспортируется с каким-то хитрым алгоритмом. Крипто-Про в логах ругается

pfx_AddCertAttributesToContext!() pfx - pkcs12 attribute unsupported
cptools:pfx_AddCertAttributesToContext!() pfx - pkcs12 attribute unsupported
cptools:

Обновился на  VipNet 4.4 (Windows), но не может обратно импортировать только что собой созданный PFX говорит  пароль “не подходит” (ага, только что созданный типа 123, 12345678)

openssl pkcs12 -in container.pfx -nodes

тоже не видит закрытого ключа. в раннем PFX  видит.

При этом  ключ из контейнера работает, VipNet 4.2 (Linux) подписывает что надо, на Windows тоже работает.
Но закрытый ключ не удается достать достать для переноса.

Предыдущие выпускал в Тензор, и ИТК  в начале года,  новый ключ в августе  в Тензор. Ключи выпускались удаленно в VipNet контенер.
Проверил типы шифрования одинаковые ГОСТ 34.10-2012/512

Единственное различие нашел:  Новый ключ имеет поле:
Embedded License    : CryptoPro CSP

Куда копать?  Как еще можно получить закрытый ключ из контейнера?

5 Работа с электронной подписью в РЕД ОС под Байкал-М

docker криптопро csp Скачать документ

Установка КриптоПро CSP 4.0 Установка КриптоПро CSP 5.0 Установка драйверов для токенов Рутокен Утилиты token-manager и gostcryptogui Вход по сертификату на Госуслуги в РЕД ОС под Байкал-М

Работа с электронной подписью в РЕД ОС под Байкал-М (архитектура aarch64, она же arm64) аналогична работе в РЕД ОС x86_64. Но есть отличия в установке и настройке некоторых утилит.

Установка КриптоПро CSP 4

Установка КриптоПро CSP 4.0 через стандартный установщик, входящий в дистрибутив КриптоПро CSP 4.0 архитектуры arm64, невозможна. Установка завершается ошибкой:

docker криптопро csp

Но установку можно выполнить через dnf, непосредственно указав перечень пакетов. Для этого:

1. Скачайте архив с сайта КриптоПро по ссылке.

2. Распакуйте архив в папку (в примере /home/test/).

cd /home/test
tar -xvf linux-arm64.tgz

3. Перейдите в папку с КриптоПро:

cd /home/test/linux-arm64

4. Перейдите в сеанс пользователя root:

su -

и выполните установку пакетов КриптоПро CSP 4.0 вручную:

dnf install ./lsb-cprocsp-base* ./lsb-cprocsp-rdr* ./lsb-cprocsp-kc1* ./lsb-cprocsp-capilite* ./cprocsp-rdr-gui-gtk* ./cprocsp-rdr-pcsc* ./lsb-cprocsp-pkcs11* pcsc-lite

Установка КриптоПро CSP 5

Установка КриптоПро CSP 5.0 успешно выполняется через стандартный установщик, входящий в дистрибутив КриптоПро CSP 5.0 архитектуры arm64:

1. Скачайте архив с сайта КриптоПро по ссылке.

2. Распакуйте архив в папку (в примере /home/test/).

cd /home/test
tar -xvf linux-arm64.tgz

3. Перейдите в папку с КриптоПро:

cd /home/test/linux-arm64

4. Выполните установку КриптоПро 5.0 командой:

./install_gui.sh

Установка драйверов для токенов Рутокен

Драйверы Рутокен ЭЦП для архитектуры arm64 (aarch64) доступны по ссылке:

http://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/ARM/aarch64/

Плагин Rutoken доступен по следующей ссылке:

http://download.rutoken.ru/Rutoken_Plugin/Current/Linux/

Установка драйвера и плагина выполняется штатно через dnf.

Утилиты token-manager и gostcryptogui

Утилиты для работы с сертификатами и электронной подписью token-manager и gostcryptogui адаптированы под архитектуру arm64 (aarch64) и успешно работают в РЕД ОС под Байкал-М с КритоПро CSP версий 4.0 и 5.0.

Вход по сертификату на Госуслуги в РЕД ОС под Байкал-М

Вход по сертификату на Госуслуги через браузеры Chromium, Спутник и другие пока не поддерживается, т.к. разработчиком еще не выпущен плагин Госуслуг (IFCPlugin) под архитектуру arm64 (aarch64): https://ds-plugin.gosuslugi.ru/plugin/upload/Index.spr

Если вы нашли ошибку, пожалуйста, выделите текст и нажмите 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.ruCryptCP 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 с поддержкой алгоритмов ГОСТ.

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

Полная занятость, удаленная работа

docker криптопро csp

Екатеринбург

честная разработка

Разрабатываем то, что улучшает жизнь

docker криптопро csp

Приглашаем Разработчика .NET на удалённое сотрудничество в интересные и социально-важные проекты уровня города, региона, страны.

Рассматриваются кандидаты уровня middle, senior.

Задача – проектирование и реализация распределенных многопользовательских систем на .NET, в том числе с использованием веб-технологий.

Для этого тебе понадобятся:

  • хорошее знание платформы .NET Framework версии 4.6 и выше, язык C#;
  • знание SQL, опыт работы реляционными базами данных (предпочтительнее Postgres) и NoSQL решениями;
  • опыт работы от 2 лет в роли разработчика на .NET;
  • умение работать самостоятельно и в команде;
  • интерес к изучению новых языков программирования, фреймворков, технологий разработки;
  • хороший технический английский.

Будет плюсом:

  • опыт работы с .NET 6, ASP.NET Core;
  • опыт работы с ORM решениями (предпочтительнее Entity Framework и EF Core 6);
  • знание технологий используемых для frontend разработки (TypeScript, Angular, React.js, или другие);
  • знание структур данных, алгоритмов и паттернов создания enterprise приложений;
  • опыт создания приложений с микросервисной архитектурой;
  • опыт создания масштабируемых приложений;
  • опыт работы с Docker (Docker Compose, Docker Swarm, Kubernetes);
  • опыт работы с системами учета версий, автоматической сборки и непрерывной интеграции (Git, Teamcity, Gitlab).

Мы используем в проектах:

  • agile-практики (SCRUM, Kanban);
  • технологии для .NET-разработки: .NET 4.7/.NET Core/.ASP.NET 6, C#, EF Core, WebAPI, Angular, PostgreSQL, Minio, ElasticSearch, Riak, RabbitMQ, СКЗИ «КриптоПро CSP»;
  • инструментарий: Microsoft Visual Studio/JetBrains Rider/VS Code, , JIRA, Fisheye+Crucible, Confluence, Gitlab, Docker, Kubernetes.

Мы готовы предложить:

Комфорт:

  • у тебя будет гибкий график работы, ведь мы верим, что каждый сотрудник осознает объем задач и распределяет свои ресурсы разумно;
  • в качестве бонусов мы гарантируем: ДМС со стоматологией, 50 % компенсации фитнеса в твоем клубе;
  • персональное предложение по зарплате в зависимости от уровня твоих навыков;
  • удаленная работа или комфортный офис (Екатеринбург).

Возможности и перспективы:

  • наставничество: ты получишь поэтапный план входа в должность и поддержку на каждом шаге;
  • мы любим учиться: участвуем в профессиональных комьюнити, делимся опытом и новыми фишками на внутренних встречах и митапах; читаем и пополняем собственную корпоративную библиотеку;
  • рост: у нас много примеров построения успешной карьеры с entry level. Компания саппортит в стремлении расти, и если ты готов брать на себя ответственность – у нас найдутся для тебя более сложные задачи 😉 ;
  • мы ценим обратную связь, у нас регулярные performance review внутри отделов.

Атмосфера:

  • По отзывам наших сотрудников, одна из сильных сторон компании – высокого уровня профессионалы, у которых можно многому научиться; а также взаимоотношения в команде.
  • Адекватное руководство, минимум бюрократии и атмосфера поддержки (больше доверия, а не контроля).
  • У нас насыщенная корпоративная жизнь (в том числе и online), организованы мероприятия по интересам: можно сменить рабочую обстановку и поиграть в настолки или покер, написать картину маслом, сходить в поход с коллегами или поучаствовать в благотворительном проекте, либо стать частью корпоративной спортивной команды; за разные полезные дела дарим классный мерч.

Вакансия опубликована 13 сентября 2022 в Екатеринбурге

Ваши отзывы помогают людям принимать взвешенные карьерные решения

Оставить отзыв

+ Много специалистов высокого профессионального уровня и просто хороших людей. На мой взгляд люди в компании её самая сильная сторона
+ Очень гибкие графики работы. Работать на удалёнке можно было ещё до пандемии
+ В большинстве своём проектная аутсорс разработка, со всеми вытекающими плюсами
+ Можно хорошо прокачаться с уровня Intern\Junior до Middle\Senior, при условии что и вы будете прикладывать время и усилия (задачи найдутся)
+ Для отдела тестирования примерно раз в полгода покупались доступы к профильным конференциям (HeisenBug, DUMP). В доковидную эпоху один раз оплатили большую часть стоимости билета для офлайн конференции

Войдите, чтобы увидеть все отзывы

Войти

ПАО «Газпром нефть»

ПАО «Газпром нефть»

Разрабатывать бэкенд на C#, .NET. Покрывать свой код юнит тестами и интеграционными тестами. Проводить code review. В составе кросс-функциональной…

Имеешь уверенные знания и опыт разработки на C#, .NET. Имеешь опыт работы с системами контроля версий Git/SVN (понимаешь методологию…

Командная разработка сложных программных продуктов. Ревизия исходного кода. Поддержка ранее созданных модулей и приложений. Изучение и внедрение новых технологий и…

Высшее техническое образование. Знание языка C#. Знание платформы .NET. Знание ООП. Опыт работы с MS SQL Server. Опыт работы с…

Проектирование и разработка программного обеспечения. Поддержка работающих решений. Адаптация ПО для российских и зарубежных подразделений компании.

Уверенный опыт на C# ASP.NET Core. ASP.NET (MVC, WebAPI). Опыт написания сложных SQL запросов / MS SQL. Опыт написания API, опыт…

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

Выполнение задач по заказной разработке на языке программирования C# и .NET. Проведение ревью кода других разработчиков. Участие в развитии разрабатываемой…

Опыт разработки на C# от 1 года (в некоторых случаях рассматриваем без опыта коммерческой разработки). Писать структурированный, понятный другим разработчикам…

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

Разработка моделей данных и сервисов. Разработка схем для хранилищ данных (MsSQL, MySQL, Clickhouse, Redis). Разработка функциональных API. Разработка интерфейсов к…

Профильное образование. Опыт разработки от 2-х лет. Уверенное владение C#, ООП, HTTP, шаблонами, паттернами. ASP.NET MVC. GIT (pull, push…

Монополия

Монополия

МОНОПОЛИЯ.АЗС – мобильное приложение для грузоперевозчиков. Не пасует перед необходимостью засучить рукава и самому реализовать свою идею. CI+CD: TeamCity + Octopus.

Хорошо и полно знает современный язык C# и представляет, как работает та или иная часть платформы .NET. Понимает, как работают…


Offline

Scriptoz

 

Оставлено
:

3 июня 2021 г. 10:51:19(UTC)

Добрый день!

Пытаюсь установить КриптоПро CSP 5.0 в windows docker container. Образ: mcr.microsoft.com/windows/servercore:10.0.19042.985.

Пытаюсь выполнить установку через exe, процесс просто зависает:

Код:

Start-Process -Wait -FilePath "c:\tmp\CSPSetup-5.0.11823.exe" -ArgumentList '-silent -nodlg'

Так же пытался выполнить установку через msi, процесс сразу же завершается, ничего не устанавливается:
Код:

Код:

Start-Process 'msiexec' -ArgumentList '/i c:\tmp\csp-x64-eng__5.0.11998.msi /quiet /qn /norestart /log c:\tmp\log.txt'

Подскажите, пожалуйста, как правильно установить КриптоПро CSP 5.0 в docker на основе образа mcr.microsoft.com/windows/servercore?


Offline

Scriptoz

 

Оставлено
:

3 июня 2021 г. 11:22:40(UTC)

Через msi установку удалось запустить, я забыл ключ -Wait:

Код:

Start-Process 'msiexec' -ArgumentList '/i c:\tmp\csp-x64-eng__5.0.11998.msi /quiet /qn /norestart /log c:\tmp\log.txt' -Wait

Однако, установка завершилась с ошибками. Вот кусок лога с ошибкой:

Код:

KSInstall64:error #-536870365:SetupCopyOEMInf
MSI (s) (D8!AC) [11:00:48:768]: Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
Error 25002.Driver installation failed. Details in System EventLog.
MSI (s) (D8!AC) [11:00:48:784]:
Error 555.-536870365:
CustomAction KSInstall64 returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
Action ended 11:00:48: InstallFinalize. Return value 3.
KSInstall64:info: KSInstUninstall start.
KSInstall64:error #2:Can't get inf file location
MSI (s) (D8!4C) [11:00:48:878]: Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
Error 25002.Driver installation failed. Details in System EventLog.
KSInstall64:error #2:GetInfFileLocation
MSI (s) (D8!4C) [11:00:48:893]: Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
Error 25002.Driver installation failed. Details in System EventLog.
Info 1903.Scheduling reboot operation: Deleting file c:\Program Files\Crypto Pro\CSP\TBD57E8.tmp. Must reboot to complete operation.
Action ended 11:00:50: INSTALL. Return value 3.

Поиск в EventLog особо ничего не прояснил:

Код:

Get-WinEvent -ProviderName "MsiInstaller" -MaxEvents 100

Код:

 ProviderName: MsiInstaller
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
6/3/2021 11:00:50 AM 1042 Information Ending a Windows Installer transaction: c:\\tmp\\csp-x64-eng__5.0.11998.msi. Client Process Id: 4680.
6/3/2021 11:00:50 AM 1033 Information Windows Installer installed the product. Product Name: CryptoPro CSP. Product Version: 5.0.11998. Product Language: 1033....
6/3/2021 11:00:50 AM 11708 Information Product: CryptoPro CSP -- Installation operation failed.
6/3/2021 11:00:48 AM 10005 Error Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
6/3/2021 11:00:48 AM 10005 Error Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
6/3/2021 11:00:48 AM 10555 Error
6/3/2021 11:00:48 AM 10005 Error Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.
6/3/2021 11:00:36 AM 1040 Information Beginning a Windows Installer transaction: c:\\tmp\\csp-x64-eng__5.0.11998.msi. Client Process Id: 4680.


Offline

Scriptoz

 

Оставлено
:

3 июня 2021 г. 12:42:00(UTC)

Пробовал совет из этого топика с установкой без драйвера NOCPROCTRL=1. Получаю те же ошибки. Да и вообще логи установки с этим параметром и без него выглядят почти идентично. Привожу значимо различающиеся фрагменты:

С опцией NOCPROCTRL=1

Код:

KSInstall64:info: InstallService start.
KSInstall64:info: FullFileName:c:\Program Files\Crypto Pro\CSP\cpdrvlib.ms.inf
KSInstall64:info: FullPath:c:\Program Files\Crypto Pro\CSP\
KSInstall64:info: ComponentID:{AA89E01B-A77E-44F6-9563-67F251E42A2A}
KSInstall64:info: SetupOpenInfFile success
KSInstall64:info: Found Manufacturer: CPMfg
KSInstall64:info: Found TargetOS: NTx86
KSInstall64:info: Found InstallSectionName: cpdrvlib
KSInstall64:info: Found Service: cpdrvlib
KSInstall64:info: CopyOemInf: Going to call SetupCopyOEMInf (1-st time)
KSInstall64:error #-536870365:SetupCopyOEMInf
MSI (s) (F8!68) [12:05:50:342]: Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.

Без опции NOCPROCTRL=1

Код:

KSInstall64:info: InstallService start.
KSInstall64:info: FullFileName:c:\Program Files\Crypto Pro\CSP\CProCtrl.ms.inf
KSInstall64:info: FullPath:c:\Program Files\Crypto Pro\CSP\
KSInstall64:info: ComponentID:{17FF92CA-46FB-4F88-94E3-D624546F926E}
KSInstall64:info: SetupOpenInfFile success
KSInstall64:info: Found Manufacturer: CPMfg
KSInstall64:info: Found TargetOS: NTamd64
KSInstall64:info: Found InstallSectionName: CProCtrl
KSInstall64:info: Found Service: CProCtrl
KSInstall64:info: CopyOemInf: Going to call SetupCopyOEMInf (1-st time)
KSInstall64:error #-536870365:SetupCopyOEMInf
MSI (s) (34!68) [12:13:19:006]: Product: CryptoPro CSP -- Error 25002.Driver installation failed. Details in System EventLog.

Неужели не у кого не возникало желания развернуть КриптоПро в windows docker? Вроде как контейнеры достаточно прочно вошли в нашу жизнь… К слову, в linux docker проблем с установкой никаких не возникает:

Код:

RUN tar -xf cryptopro_csp_r2_5.0.11732_deb.tgz
RUN linux-amd64_deb/install.sh


Offline

Максим Коллегин

 

Оставлено
:

7 июля 2021 г. 18:31:43(UTC)

В серверной ОС еще нужно отключить установку криптопровайдера уровня ядра:


Offline

Scriptoz

 

Оставлено
:

22 июля 2021 г. 12:22:45(UTC)

Автор: Максим Коллегин Перейти к цитате

В серверной ОС еще нужно отключить установку криптопровайдера уровня ядра:

Спасибо! С чем столкнулся сейчас:

Если делать установку КриптоПро CSP при сборке docker образа, то любая последующая команда из Dockerfile “зависает” и потом выдает ошибку:

Dockerfile

Код:

FROM mcr.microsoft.com/windows/servercore:10.0.19042.985
SHELL ["powershell"]
RUN New-Item -ItemType directory -Path c:\\tmp
COPY cryptopro\\csp-x64-eng__5.0.11998.msi c:\\tmp
# После этой команды последующая завершается ошибкой.
# Если эти команды выполнить непосредственно в контейнере - все работает.
RUN Start-Process 'msiexec' -ArgumentList '/i c:\\tmp\\csp-x64-eng__5.0.11998.msi /quiet /qn /norestart /log c:\\tmp\\log.txt NOCPROCTRL=1 NODRIVER=1' -Wait
RUN Get-Content -Path c:\tmp\log.txt

Ошибка:

Код:

container <id> encountered an error during hcsshim::System::Start: context deadline exceeded.
time="2021-07-21T17:07:06+03:00" level=error msg="Error waiting for container: container <id>: driver \"windowsfilter\" failed to remove root filesystem: failed to detach VHD: The device is not ready.

Однако, если убрать процесс установки КриптоПро CSP из сборки образа и выполнить ее позже уже в контейнере, то все работает корректно. КриптоПро устанавливается и с ним можно работать:

Код:

docker build . -t csp
docker run -it --rm csp powershell

Код:

# Выполняется внутри контейнера. Все работает как надо.
Start-Process 'msiexec' -ArgumentList '/i c:\\tmp\\csp-x64-eng__5.0.11998.msi /quiet /qn /norestart /log c:\\tmp\\log.txt NOCPROCTRL=1 NODRIVER=1' -Wait
Get-Content -Path c:\tmp\log.txt

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

Отредактировано пользователем 22 июля 2021 г. 12:31:27(UTC)
 | Причина: Не указана


Offline

Максим Коллегин

 

Оставлено
:

22 июля 2021 г. 12:33:57(UTC)

А что в логе c:\\tmp\\log.txt?
Вы используете режим изоляции процесс или Hyper-V для контейнера?


Offline

Scriptoz

 

Оставлено
:

22 июля 2021 г. 13:00:16(UTC)

Автор: Максим Коллегин Перейти к цитате

А что в логе c:\\tmp\\log.txt?
Вы используете режим изоляции процесс или Hyper-V для контейнера?

Если запускать установку руками из контейнера, то лог приложил. docker криптопро csp csp.log (74kb) загружен 1 раз(а). В случае с установкой при сборке образа я содержимое лога посмотреть на могу, так как соответствующая команда не выполняется.

По поводу режима изоляции – я получаю ошибку на этапе сборки образа, а изоляция, если я не путаю, определяется при запуске контейнера, до чего я не дохожу.


Offline

Максим Коллегин

 

Оставлено
:

22 июля 2021 г. 13:07:25(UTC)

Спасибо, принято, попробую разобраться.


Offline

Максим Коллегин

 

Оставлено
:

5 августа 2021 г. 13:45:03(UTC)

Docker на Windows — это какая-то невиданная боль.
По теме: CSP успешно устанавливается, команда зависает на Get-Content, видимо файл слишком большой.
Лог можно прочитать в C:\ProgramData\docker\windowsfilter\873b7eabc664cd740ade8dfe35429c18654abd90d656e2710228fd19fa0ca979\Files\tmp (хэш конечно же будет другой)

Чтобы полученный образ запускался, нужно удалить (переименовать) модуль cpsspap.dll из C:\ProgramData\docker\windowsfilter\873b7eabc664cd740ade8dfe35429c18654abd90d656e2710228fd19fa0ca979\Files\Windows\System32\

ГОСТ TLS работать без него не будет, попробую разобраться позже, почему не может стартовать.

Но CMS подпись должна работать в таком образе.


Offline

Scriptoz

 

Оставлено
:

19 августа 2021 г. 10:47:48(UTC)

После установки CSP при сборке образа зависает любая последующая команда из Dockerfile, не только Get-Content. В моем прикладном случае как раз нужен ГОСТ TLS)) Если у Вас в будущем появятся какие-то идеи на счет этой проблемы – буду признателен.

Установка

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

  • Проверьте доступность репозиториев для установки или установите вручную пакеты 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.

КриптоПро 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/&lt;имя пользователя&gt;/

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

 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

Сборка 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.

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

Для верифицирования сертификатов нужен сертификат удостоверяющего центра и актуальный список отзыва сертификатов,
либо настроенный для этого 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

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

Если язык программирования позволяет исполнять установленные в системе программы, то задача использования ГОСТ-алгоритмов проще всего решается копированием бинарников собранных 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, это можно сделать в любой каталог, а затем вызывать из вашей программы, передав полный путь и все аргументы.

Ссылки

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

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

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

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

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

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

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

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

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

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

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

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

Примеры использования 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 в использовании не изменилась, просто поддерживает хосты с ГОСТ-сертификатами.

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

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

certmgr uroot

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

certmgr root

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

 certmgr uroot cacer.p7b

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

Поддержка ГОСТ-сертификатов в 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/

КриптоПро ЭЦП 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 &lt;серийный номер&gt;)

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

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

Поддержка ГОСТ-алгоритмов в 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.

Сертификаты

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

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.001\2608

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

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

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

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

docker криптопро csp

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

certmgr -inst -file 1.cer

Заключение

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

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

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

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

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

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

Читайте также:  Инструкция по работе с электронной подписью
Оцените статью
ЭЦП Эксперт