Работа с закрытыми ключами на виртальной машине в Hyper-V « БЛОГ ЛИСА

Работа с закрытыми ключами на виртальной машине в Hyper-V «  БЛОГ ЛИСА ЭЦП

Как решить проблему, что криптопро не видит usb ключ?

Создали новую виртуальную машину и стали ставить софт все последовательно.

Перед установкой любого программного обеспечения работающего с USB носителями на которых находятся сертификаты и закрытые ключи. Нужно ОБЯЗАТЕЛЬНО
отключить токен, если воткнут локально, то отключаем его, если по сети, разрываем сессию

Описание окружения

Есть виртуальная машина на Vmware ESXi 6.5, в качестве операционной системы установлена Windows Server 2022 R2 . На сервере стоит КриптоПРО 4.0.9944, последней версии на текущий момент. С сетевого USB хаба, по технологии USB over ip , подключен ключ JaCarta. Ключ в системе видится
, а вот в КриптоПРО нет.

Что нужно допилить в готовом клиенте, чтобы сбежать с крипто про

Код написан довольно дружелюбно для расширения, поэтому можно просто взять за основу класс KeyStoreWrapperJCP, и аналогично написать KeyStoreWrapperBouncyCastlePKCS12, KeyStoreWrapperBouncyCastleJKS.

Переписать DigitalSignatureFactory, так, чтобы он на вход начал принимать путь до криптоконтейнера на файловой системе и пароль от него (для КриптоПро это просто не нужно). Там есть свич, который проверяет тип криптопровайдера, в него надо дописать дополнительно два кейса, для имен типа BOUNCY_JKS и BOUNCY_PKCS12 и навешать использование соответсвующих KeyWrapper и вызов initXmlSec.

В initXmlSec нужно дописать1) возможность принимать вообще любой провайдер, а не только криптопро (это просто удобно)2) Security.addProvider(new BouncyCastleProvider());3) для XMLDSIG_SIGN_METHOD сделать свич: если КриптоПро, то алгоритм называется «GOST3411withGOST3410EL», а если BouncyCastle алгоритм называется «GOST3411WITHECGOST3410».

Ну вроде как и все. Если бы была известна лицензия на этот смэв-клиент, я бы приложил конкретный код под Apache License 2, а так это просто список идей.

Почему крипто про jcp зло

  • Если у вас много разработчиков и виртуальных машин, покупать лицензию не очень хочется
  • Проприетарщина, поэтому все описанные ниже баги исправить нельзя. Точнее можно (дизассемблер стреляет без промаха), но незаконно и с потерей всех гарантий — не вариант
  • На Java 8 под OSX завести не удалось (никакую версию КП JCP). Скорей всего это исправят довольно скоро, т.к. представители отреагировали на мой пост в Фейсбуке
  • Вообще, на OSX завести не удалось. Гуй админки — полурабочий, сыпет ошибками, куски гуя не работают.
  • На линуксе тоже есть баги в интерфейсе
  • Когда-то давно установщик на Windows писал в консоли крокозябры (не проверял на новых версиях — может, пофиксили)
  • Установка патчингом дистрибутива джавы. Ящетаю, что установка софта методом патчинга джавы — это зло в последней инстанции, за это суд по правам человека должен назначать шестикратный расстрел с повешанием
  • Не каждую джаву можно пропатчить, для выяснения магической комбинации нужно серьезно упороться. Тут важно, что мы стараемся разрабатывать на самых новых версиях джавы, с пылу-с жару, и тестируем на новых версия (на момент написания статьи — JDK9), так что ограничения на версию джавы — это безумие как оно есть
  • Способы инсталляции и запуска админки — лютый треш (это надо видеть)

В качестве альтернативы в тестовом окружении я предалагю использовать Bouncy Castle с контейнером PKCS12 или JKS. Это открытое, свободное и бесплатное ПО.К чести разработчиков Крипто Про, похоже, они принимали участие в его разработке.

Обоснование нужности готового клиента

На технологическом портале СМЭВ3 лежат исходники клиента, но вот незадача — они гвоздями прибиты к КриптоПро. Вордовский файл с инструкцией, приложенный к исходникам, утверждает это самым прямым образом. Да и все равно, исходные ключи у нас тоже в формате КриптоПро. Исходя из production это нормально, а вот для тестового окружения жутко неудобно. Хотелось бы от этого избавиться.

На сайте есть две версии — «актуальная» и «рекомендуемая». Почему они так, и почему актуальная версия не рекомендуется, а рекомендуемая не актуальна — какая-то дилемма копирайтера 🙂 Дальше речь о том клиенте который «актуальный».

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

Задача не выполнена, но выполнена и закрыта, изумительно. Ладно, черт с ними…

Несмотря на невозможность использовать его у себя непосредственно в коде, это отличный тестовый пример. Дело в том, что в методических рекомендациях СМЭВа без поллитры не разобраться, и готовый живой код дает отличный буст к пониманию.

Основная претензия к документации — это канцеляризмы и скудное описание в интернете.Помните мем про копирайтера, который из абзаца сделал одно предложение в несколько слов? Для документации СМЭВа это имеет место быть, например вот цепочка рефакторинов для одной произовльно взятой фразы:

«2. ИС потребителя направляет в СМЭВ межведомственный запрос;»»2. ИС потребителя направляет в СМЭВ запрос;»»2. ИС потребителя направляет запрос;»»2. потребитель направляет запрос;»»2. запрос потребителя;»

Короче, наличие готовой реализации — это добро.

Disclamer

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

Недавно мне нужно было разобраться, как написать сервис, работающий с Системой Межведомственного Электронного Взаимодействия.Все написанное представляет собой просто результат небольшого исследования, максимально абстрагированный от выполненной работы. И даже приблизительно угадать что-то о реально принятых решениях невозможно, я проверял.

Алгоритм решения проблем с jacarta

КриптоПРО очень часто вызывает различные ошибки в Windows, простой пример (Windows installer service could not be accessed). Вот так вот выглядит ситуация, когда утилита КриптоПРО не видит сертификат в контейнере.

Как видно в утилите UTN Manager ключ подключен, он видится в системе в смарт картах в виде Microsoft Usbccid (WUDF) устройства, но вот CryptoPRO, этот контейнер не определяет и у вас нет возможности установить сертификат. Локально токен подключали, все было то же самое. Стали думать что сделать.

Возможные причины с определением контейнера

  1. Во первых, это проблема с драйверами, например, в Windows Server 2022 R2, JaCarta в идеале должна определяться в списке смарт карт как JaCarta Usbccid Smartcard, а не Microsoft Usbccid (WUDF)
  2. Во вторых если устройство видится как Microsoft Usbccid (WUDF), то версия драйверов может быть устаревшей, и из-за чего ваши утилиты будут не определять защищенный USB носитель.
  3. Устарелая версия CryptoPRO

Выдача контейнера pkcs12

В принципе, это не особо нужно, потому что у нас уже есть простой и удобный способ выдавать JKS, а JKS для Java это самое что ни на есть родное решение. Но для полноты картины, пусть будет.

Инициализация xml-подписи в santuario

Ах да, тут есть один интересный момент. В сети множество советов, касающихся СМЭВа, заключающихся в ручном парсинге кусков XMLек, и прочим закатом солнца вручную, но это не наш метод (и не метод, который использовали создатели клиента)

Замес в том, что сгенерить самоподписанные ключи по госту легко (копипаста на SO ищется за секунды). А вот подписать — нет, ибо по мнению интернет-школьников якобы Bouncycastle не поддерживает xml-подпись. Конкретней, при работе с Apache Santuario, XMLSignature из santuario-xmlsec не понимает что использовать для обработки метода «xmldsig-more#gostr34102001-gostr3411» при вызове xmlSignature.sign(privateKey).

Отдельная хохма в том, что IntelliJ IDEA Community глючит при попытке отдебажить xmlsec, бросая step in отладчика в неверное место верных исходников. Я попробовал все разумные версии Идеи, поэтому понимать как это работает надо вслепую, написуя тактические письма в Спортлото. Это не в укор Идее, не существует идеальных инструментов, просто фактор повлиявший на скорость понимания вопроса.

Чтобы это заработало, нужно:

Как мы можем попросить крипто про отдать ключи (на самом деле, нет)

Если у нас уже есть настоящие (не самоподписанные) ключи, то совершенно некисло было бы проверить их в действии. Да, мы говорим о тестовых целях, но таки доверяй — но проверяй!

Если поставить винду в виртуальную машину, накатить туда Крипто Про, установить ключи и попробовать их экспортировать, то обнаруживаем удивительную вещь: в экспортере не работает экспорт в PKCS12, а все остальные направления в экспортере заблокированы (англ. «grayed out»).

Подготовка openssl для работы с гост

Если у вас в начале статьи на стене висит OpenSSL, когда-нибудь он точно выстрелит.Так что да, это важный момент, необходимый для осуществления дальнейшего текста.

Работа с закрытыми ключами на виртальной машине в hyper-v « блог лиса

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeCrypto ProSettingsUsersS-2-9-21-2883657810-1528702820-1102151106-1001KeysИванов Иван Иванович 01 01 2022]

«name.key»=hex:ee,e0,20,c4,e8,eb,e0,f0,e0,20,de,

  ,e2,ed,e0,20,31,30,32

«header.key»=hex:3,2d,c7,5f,30,08,06,06,2a,85,03,2,02,03,30,82,02,43,31,21,30,1f,06,09,2a,86,48,86,f7,0d,01,09,01,16,12,75,

  75,63,5f,66,6b,40,72,6f,73,6b,61,7a,6e,61,2e,72,75,31,22,30,20,06,03,55,04,

  09,0c,19,d1,83,d0,bb,2e,20,d0,98,d0,bb,d1,8c,d0,b8,d0,bd,d0,ba,d0,b0,20,d0,

  b4,2e,37,31,19,30,17,06,03,55,04,07,0c,10,d0,b3,2e,20,d0,9c,d0,be,d1,81,d0,

  ba,d0,b2,d0,b0,31,81,a2,30,81,9f,06,09,2a,86,48,86,f7,0d,01,09,02,0c,81,91,

  d0,94,d0,b0,d0,bd,d0,bd,d1,8b,d0,b9,20,d1,81,d0,b5,d1,80,d1,82,d0,b8,d1,84,

  d0,b8,d0,ba,d0,b0,d1,82,20,d0,be,d1,82,d0,ba,d1,80,d1,8b,d1,82,d0,be,d0,b3,

  d0,be,20,d0,ba,d0,bb,d1,8e,d1,87,d0,b0,20,d0,b8,d1,81,d0,bf,d0,be,d0,bb,d1,

  8c,d0,b7,d1,83,d0,b5,d1,82,d1,81,d1,8f,20,d1,81,d0,be,20,d1,81,d1,80,d0,b5,

  d0,b4,d1,81,d1,82,d0,b2,d0,be,d0,bc,20,d0,a1,d0,9a,d0,97,d0,98,20,d0,9a,d1,

  1d,0e,04,16,04,14,fe,95,15,4a,04,e2,92,e8,ee,0a,18,7b,27,3a,16,25,58,61,db,

  45,30,08,06,06,2a,85,03,02,02,03,03,41,00,90,93,6a,b4,ff,d8,5a,ca,b7,6b,6f,

  52,e8,52,e5,b6,95,d0,ee,97,d3,f4,86,6e,c3,3d,a3,34,58,0b,9a,2c,9d,d7,6d,a5,

  28,88,97,8b,fb,39,e2,45,91,b1,71,6c,85,d2,71,e3,08,76,de,8c,75,8c,84,d7,35,

  b4,6b,60,8a,08,8d,78,c1,1a,b8,98,2f,96,04,04,93,c1,f7,94

«primary.key»=hex:30,22,04,20,b0,cb,50,04,6c,76,52,aa,a1,cd,0f,fc,96,61,aa,01,

  ,58,bf,ae,d9,57,c9

«masks.key»=hex:30,36,04,20,97,99,81,51,0f,97,05,80,62,32,30,aa,bd,30,e2,f6,1c,

,90,e0,09,03,15,4e,b6,59,

  e7,2d,24,34,04,04,62,74,57,8c

«primary2.key»=hex:30,22,04,20,d5,16,c7,54,fd,cd,06,8b,27,85,88,3c,4f,87,aa,b1,

  60,ce,

«masks2.key»=hex:a7,62,3a,9f,ba,f4,1b,ef,73,c7,8e,c4,35,

  57,a0,06,64,cf

§

§

Резюме

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

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

Тестовые самоподписанные ключи

Так как мы деламем все это в тестовых целях, теперь мы подходим к кульминации и начинаем сами себе выдавать ключи.

Установка единого клиента jacarta pki

Единый Клиент JaCarta
— это специальная утилита от компании «Аладдин», для правильной работы с токенами JaCarta. Загрузить последнюю версию, данного программного продукта, вы можете с официального сайта, или у меня с облака, если вдруг, не получиться с сайта производителя.

Далее полученный архив вы распаковываете и запускаете установочный файл, под свою архитектуру Windows , у меня это 64-х битная. Приступаем к установке Jacarta драйвера. Единый клиент Jacarta, ставится очень просто (НАПОМИНАЮ ваш токен в момент инсталляции, должен быть отключен). На первом окне мастера установки, просто нажимаем далее.

Принимаем лицензионное соглашение и нажимаем «Далее»

Чтобы драйвера токенов JaCarta у вас работали корректно, достаточно выполнить стандартную установку.

Если выберете «Выборочную установку», то обязательно установите галки:

  • Драйверы JaCarta
  • Модули поддержки
  • Модуль поддержки для КриптоПРО

Через пару секунд, Единый клиент Jacarta, успешно установлен.

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

После установки JaCarta PKI, нужно установить КриптоПРО, для этого заходите на официальный сайт.

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