Open source
Рекомендация: подборка платных и бесплатных курсов 3D-моделирования – https://katalog-kursov.ru/
В этой статье я расскажу о том, как я решал задачу об интеграции в тестовом режиме с сервисами, которые работают с использованием алгоритмов, определенных ГОСТ Р 34.10-2001 (устарел) и ГОСТ Р 34.10-2012. Приведу примеры некоторых проблем, с которыми столкнулся при решении задачи, дам ссылки на готовое решение и покажу несколько примеров их использования.
Есть .net core приложение, которое работает в Azure (в докере, linux). Приложению необходимо шифровать данные, используя КриптоПро. Локально приложение разрабатывается в двух ОС – Windows и MacOS. Решал ли кто-нибудь задачу, как кроссплатформенно работать с КриптоПро?
задан 24 фев 2021 в 8:39
У них есть экзешник cprocsp, который работает кросплатформенно. Таким образом, вызывая этот экзешник с нужными ключами и обрабатывая вывод парсером, вы теоретически добьетесь нужного результата.
ответ дан 24 фев 2021 в 9:08
gbggbg
21.8k2 золотых знака31 серебряный знак52 бронзовых знака
- Причины
- 5 Работа с электронной подписью в РЕД ОС под Байкал-М
- Установка КриптоПро CSP 4
- Установка КриптоПро CSP 5
- Установка драйверов для токенов Рутокен
- Утилиты token-manager и gostcryptogui
- Вход по сертификату на Госуслуги в РЕД ОС под Байкал-М
- Сервис для создания подписей для ЕСИА на nodejs с КриптоПро 4. 0 в докер контейнере
- Принцип работы
- Установка лицензии
- Загрузка корневого сертификата
- Загрузка пользовательского сертификата
- Как запустить
- Рест сервер
- Как по быстрому выпустить тестовый сертификат:
- Авторизация
- Возможные проблемы:
- Env контейнера
- Установка
- КриптоПро JCP
- Поддержка Рутокена
- Запуск контрольной панели
- Управление персональным сертификатом
- Создание
- Просмотр
- Удаление
- Размещение контейнеров
- Сохранение сертификата в файле
- Импорт персонального сертификата
- Сборка OpenSSL, GOST-engine, cURL
- Проверка подписи ЭЦП
- Использование образа в работе с языками программирования
- Ссылки
- Подписание документа ЭЦП
- Проверка лицензии
- Статья про КриптоПро
- Примеры использования OpenSSL + GOST-engine
- Корневые сертификаты
- Поддержка ГОСТ-сертификатов в nginx
- КриптоПро ЭЦП Browser plug-in
- Поддержка ГОСТ-алгоритмов в PHP
- Сертификаты
- Список установленных сертификатов
- Добавление реального сертификата
- Добавление реального сертификата с привязкой к закрытому ключу и возможностью подписывать документы
- Способ с дискетой или флешкой
- С жесткого диска
- Проверка успешности установки закрытого ключа
- Добавление тестового сертификата
- Удаление сертификата
- Проверка сертификата
- Просмотр всех атрибутов сертификата
- Экспорт сертификатов на другую машину
- Заключение
- Используемая литература
Причины
Для начала стоит сказать, что для продакшн-окружения существуют сертифицированные средства от компаний «Криптоком», «Крипто-Про», «Сигнал-КОМ» и других. Мне же нужно было реализовать взаимодействие в тестовом (девелоперском) окружении на 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 Работа с электронной подписью в РЕД ОС под Байкал-М
Скачать документ
Установка КриптоПро CSP 4.0 Установка КриптоПро CSP 5.0 Установка драйверов для токенов Рутокен Утилиты token-manager и gostcryptogui Вход по сертификату на Госуслуги в РЕД ОС под Байкал-М
Работа с электронной подписью в РЕД ОС под Байкал-М (архитектура aarch64, она же arm64) аналогична работе в РЕД ОС x86_64. Но есть отличия в установке и настройке некоторых утилит.
Установка КриптоПро CSP 4
Установка КриптоПро CSP 4.0 через стандартный установщик, входящий в дистрибутив КриптоПро CSP 4.0 архитектуры arm64, невозможна. Установка завершается ошибкой:
Но установку можно выполнить через 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
Как запустить
- Скачать КриптоПро CSP 4.0 для Linux (x64, deb) и положить по пути
install/linux-amd64_deb.tgz
- Подложить архив с сертификатом как
/cryptopro/certificates/certificate_bundle.zip
- Создаем образ
docker build --tag cryptopro-sign --build-arg CERTIFICATE_PIN=12345678 .
- Запускаем
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 с поддержкой алгоритмов ГОСТ.
Требуемый опыт работы: 1–3 года
Полная занятость, удаленная работа
Екатеринбург
честная разработка
Разрабатываем то, что улучшает жизнь
Приглашаем Разработчика .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. Понимает, как работают…
Scriptoz Оставлено | |
Добрый день! Пытаюсь установить КриптоПро CSP 5.0 в windows docker container. Образ: mcr.microsoft.com/windows/servercore:10.0.19042.985. Пытаюсь выполнить установку через exe, процесс просто зависает: Код:
Так же пытался выполнить установку через msi, процесс сразу же завершается, ничего не устанавливается: Код:
Подскажите, пожалуйста, как правильно установить КриптоПро CSP 5.0 в docker на основе образа mcr.microsoft.com/windows/servercore? | |
Scriptoz Оставлено | |
Через msi установку удалось запустить, я забыл ключ -Wait: Код:
Однако, установка завершилась с ошибками. Вот кусок лога с ошибкой: Код:
Поиск в EventLog особо ничего не прояснил: Код:
Код:
| |
Scriptoz Оставлено | |
Пробовал совет из этого топика с установкой без драйвера NOCPROCTRL=1. Получаю те же ошибки. Да и вообще логи установки с этим параметром и без него выглядят почти идентично. Привожу значимо различающиеся фрагменты: С опцией NOCPROCTRL=1 Код:
Без опции NOCPROCTRL=1 Код:
Неужели не у кого не возникало желания развернуть КриптоПро в windows docker? Вроде как контейнеры достаточно прочно вошли в нашу жизнь… К слову, в linux docker проблем с установкой никаких не возникает: Код:
| |
Максим Коллегин Оставлено | |
В серверной ОС еще нужно отключить установку криптопровайдера уровня ядра: | |
Scriptoz Оставлено | |
Автор: Максим Коллегин В серверной ОС еще нужно отключить установку криптопровайдера уровня ядра: Спасибо! С чем столкнулся сейчас: Если делать установку КриптоПро CSP при сборке docker образа, то любая последующая команда из Dockerfile “зависает” и потом выдает ошибку: Dockerfile Код:
Ошибка: Код:
Однако, если убрать процесс установки КриптоПро CSP из сборки образа и выполнить ее позже уже в контейнере, то все работает корректно. КриптоПро устанавливается и с ним можно работать: Код:
Код:
По самой ошибке в интернете ничего особо нет. Есть какие-то предположения, с чем это может быть связано? Отредактировано пользователем 22 июля 2021 г. 12:31:27(UTC) | |
Максим Коллегин Оставлено | |
А что в логе c:\\tmp\\log.txt? | |
Scriptoz Оставлено | |
Автор: Максим Коллегин А что в логе c:\\tmp\\log.txt? Если запускать установку руками из контейнера, то лог приложил. csp.log (74kb) загружен 1 раз(а). В случае с установкой при сборке образа я содержимое лога посмотреть на могу, так как соответствующая команда не выполняется. По поводу режима изоляции – я получаю ошибку на этапе сборки образа, а изоляция, если я не путаю, определяется при запуске контейнера, до чего я не дохожу. | |
Максим Коллегин Оставлено | |
Спасибо, принято, попробую разобраться. | |
Максим Коллегин Оставлено | |
Docker на Windows — это какая-то невиданная боль. Чтобы полученный образ запускался, нужно удалить (переименовать) модуль cpsspap.dll из C:\ProgramData\docker\windowsfilter\873b7eabc664cd740ade8dfe35429c18654abd90d656e2710228fd19fa0ca979\Files\Windows\System32\ ГОСТ TLS работать без него не будет, попробую разобраться позже, почему не может стартовать. Но CMS подпись должна работать в таком образе. | |
Scriptoz Оставлено | |
После установки 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/<имя пользователя>/
Сохранение сертификата в файле
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, [email protected] Signature's verified. Signer: Генеральный директор, Сидоров Иван Петрович, Руководство, ООО «Кемоптика», Москва, RU, [email protected] 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, это можно сделать в любой каталог, а затем вызывать из вашей программы, передав полный путь и все аргументы.
Ссылки
- Репозиторий со всеми решениями на GitHub
- Образ на Docker Hub с OpenSSL + GOST + cURL
- ГОСТ Р 34.10-2012 на Википедии со списком сертифицированных решений
- Репозиторий GOST-engine
- О возможностях и ограничениях GOST-engine
- Пример того, как решают вопрос в продакшн-окружении
Подписание документа ЭЦП
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
Возможность работать из языков программирования это уже много, но хотелось еще две возможности:
- Легко поднимать свой веб-сервер с ГОСТ-сертификатом по HTTPS (TLS).
- Легко проксировать все запросы на хост с ГОСТ-сертификатом
Легко – это означает докер-образ. Его нужно создать. Для этого нужно в 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-GOST89
— GOST2012-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 <серийный номер>)
При создании обычной подписи показывается ошибка 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 : [email protected], 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 : [email protected], 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.
Необходимо выполнять под пользователем, который будет использовать данный контейнер для подписи.
[email protected] – то, что прописано в поле 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: 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 : [email protected], C=RU, L=Москва, O=ООО КРИПТО-ПРО, CN=УЦ KPИПTO-ПPO Subject : [email protected], 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
Если все успешно:
Если нет закрытого ключа, то просто ставим сертификат:
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. Приложение командной строки