Побег из Крипто Про. ГОСТ 34.10-2012 edition / Хабр

Побег из Крипто Про. ГОСТ 34.10-2012 edition / Хабр ЭЦП
Содержание
  1. Отдельные почтовые клиенты с российской криптографией
  2. Что на выходе? форматы документов с эцп
  3. Javascript
  4. Java-апплеты
  5. Внедрение
  6. Глава вторая: ещё одна эп
  7. Глава первая: проверка эп
  8. Дополнительные библиотеки java
  9. Криптопро csp (скзи)
  10. Криптопро dss
  11. Криптопро dss lite
  12. На базе nss
  13. Настройка vpn криптопро ipsec с гостовым шифрованием
  14. Настройка и запуск java gateway, создание проекций классов
  15. Неочевидные тонкости эцп
  16. Облачная подпись
  17. Отдельные библиотеки
  18. Отдельные браузеры с российской криптографией
  19. Переносим неэкспортируемые контейнеры крипто-про
  20. Получение ключа с токена
  21. Практический опыт внедрения
  22. Предпроектные работы
  23. Про инструменты и возможности
  24. Про работу и терминологию
  25. Проверка эцп во входящих soap-сообщениях
  26. Размещение секретного ключа и сертификата на виртуальной дискете на сервере системы
  27. Расширения классов
  28. Результат
  29. Средства формирования доверенной среды
  30. Установка криптопро jcp на windows
  31. Формирование эцп
  32. Формирование эцп для исходящих soap-сообщений веб-сервиса
  33. Электронная цифровая подпись на сайте при помощи криптопро эцп browser plug-in

Отдельные почтовые клиенты с российской криптографией

Отдельные почтовые клиенты с российской криптографией позволяют реализовать защиту переписки, используя электронную подпись и шифрование письма для абонента/группы абонентов (S/MIME). Данное решение удобно использовать в системах, построенных по принцу «точка-точка», в которых обмен информацией происходит непосредственно между абонентами, а сервер при этом используется только для маршрутизации сообщений.

ПлатформыСемейство Windows, GNULinux, OS X, iOS, Android
Алгоритмы и криптографические протоколыЭЦП, шифрование, хэш-функция, имитозащита, HMAC, VKO, TLS
Интеграция с PKIX.509, PKCS#10, CMS, CRL
Механизмы ЭЦПВызов из JavaScript встроенных в браузер функций
TLS-ГОСТВстроен в библиотеку и поддерживается браузером
Форматы защищенных сообщенийPKCS#7, CMS
Интеграция с браузером100%
Мобильные платформыiOS, Android
Хранилища ключейБраузерное хранилище, USB-токены
Взаимодействие с USB-токенамиХранилище ключей и сертификатов
Использование аппаратной реализации алгоритмов
ИнсталляцияПрограмма установки, в целом, не требуются права системного администратор
Portable. Например, запуск браузера с FLASH-памяти USB-токена
Примеры (ГОСТ)Mozilla ThunderBird от Лисси
DiPost от Фактор ТС

Что на выходе? форматы документов с эцп

Следующий вопрос — что мы получаем на выходе? Документ с факсимиле, с водяным знаком? Какой формат документа с ЭЦП можно получить?

Есть два возможных исхода:

  1. Контейнер («обычная» подпись). Как правило, это архив формата «*.sig». Там находятся подписанные документы, данные о сертификате, с помощью которого сделана подпись и сама подпись. Файл такого формата открывается только с помощью специального ПО. Использовать привычные Adobe Reader или MS Office не получится — они не приспособлены для работы с криптографией. Кроме самих данных, подписи и сертификата, пользователь может сохранить неподписанную копию документа.

  2. «Встроенная» подпись. Мы получаем файл того же формата, что подали на подпись. В специальных областях подписанного документа размещаются данные о сертификате. Такая подпись возможна только для файлов формата:

Javascript


Некоторое время назад на Хабре появилась статья, автор которой реализовал многие криптографические форматы непосредственно на JavaScript

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

Java-апплеты

Одним из вариантов использования СКЗИ в браузере является их интеграция в Java-апплеты.

В ряде случаев СКЗИ и криптографические библиотеки не требуют установки и представляют собой нативную библиотеку. В этом случае возможна ее интеграция непосредственно «внутрь» апплета и вызов функций СКЗИ через механизм JNI. При этой схеме библиотека будет инсталлирована в профайл пользователя при первой загрузке Java-апплета в браузере и ее отдельной инсталляции не потребуется.


Другим вариантом является написание Java-апплета, который вызывает предустановленное в системе СКЗИ (CSP, JCP и др.)

Более подробно пример подобной реализации, основанный на использовании Рутокен ЭЦП и OpenSSL, описан в статье

Внедрение

Изначально мы посмотрели на задачу через призму законодательства. Какие ограничения оно накладывает, что можно, а что нельзя. Вердикт: сдавать авансовую отчетность в цифровом формате не запрещено.

Так как данный бизнес-процесс планировалось реализовать на корпоративном портале Битрикс24, мы изучили вопрос интеграции ЭЦП в портал. Что важно, весь процесс должен проходить в режиме одного окна, т.е. из портала.

Но самая большая сложность была вот в чем. Торговые представители пользуются только одним девайсом — корпоративным iPad. Подобные мобильные устройства не очень любят работать с сертификатами в реестрах или на внешних ключах (токенах, смарт-картах), по-настоящему удобных решений не так много. Мы остановились на интеграции с КриптоПро DSS.

В итоге автоматизированный бизнес-процесс авансовой отчетности работает следующим образом:

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

  2. При необходимости сдать авансовый отчет, сотрудник на своем планшете iPad, заходит на корпоративный портал компании и попадет в свой личный баланс.

  3. Там он создает новый авансовый отчет, пошагово заполняя все строчки. Расходы он записывает с чеков, которые находятся в его руках. Параллельно агент фотографирует чеки на тот же iPad, и прикрепляет их к онлайн авансовому отчету.

    В этот момент в 1С создаётся черновик авансового отчета, которому присваивается порядковый номер, это очень важный момент.

  4. Когда все заполнено, форма авансового отчета создается автоматически. Она типовая, поэтому вероятность, что форма будет меняться — минимальна.

  5. Сотрудник проверяет форму и подписывает её ЭЦП. Сам процесс подписи происходит по следующему алгоритму:

    • Пользователь на корпоративном портале жмет кнопку «подписать ЭЦП».

    • Документ через SOAP протокол без открытия дополнительных окон отправляется в КриптоПро DSS. КриптоПро DSS идентифицирует пользователя тремя шагами:

    • Подписанный документ отправляется к руководителю сотрудника. Он проверяет форму отчета, лимиты, сверяет с фотографиями чеков. Если что-то не так — возвращает на доработку сотруднику с комментариями. Всё в порядке — подписывает документ с помощью облачного ЭЦП и отправляет на следующий шаг согласования.

    • Бухгалтер также подписывает документ ЭЦП и отправляет генеральному директору. На этом этапе бухгалтеру остается только провести уже заполненный и сохраненный авансовый отчет в 1С. С этого момента может выдаваться новый транш.

    • Генеральный директор подписывает отчет ЭЦП. На самом деле подпись директора уже формальность, необходимая по законодательству — отчет проверен руководителем, бухгалтером и документы для новой командировки могут уже готовиться.

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

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

Глава вторая: ещё одна эп

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

По отработанному алгоритму идём в поисковую систему с запросом “тинькофф сертификат”, находим официальный сайт УЦ АО Тинькофф Банк. Тут нас встречает изобилие ссылок на корневые сертификаты, списки отозванных сертификатов и даже видеоинструкция по их установке.

Скачиваем “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2022”, на этот раз ссылка ведёт не на сторонний сервис, а на сайт банка. Формат файла P7B не очень известный, но открывается Windows без установки стороннего софта и показывает находящиеся в нём сертификаты.

Ставим оба, проверяем сертификат в полисе. Но нет, сертификат не является доверенным, т.к. система не может подтвердить поставщика сертификата. На сайте УЦ было 2 ссылки на 2 цепочки сертификатов, один для ГОСТ Р 34.10.2001, другой для ГОСТ Р 34.10.2022.

В новом файле формата P7B оказывается уже 3 файла сертификатов. Можно поставить все 3, однако стоит заметить, что сертификат “Головного удостоверяющего центра” мы поставили в первой главе из RAR архива ООО “ИТК”, они идентичны. А сертификат с не очень говорящим названием “УЦ 1 ИС ГУЦ” поставил КриптоПро CSP, т.к. галочка об установке корневых сертификатов была установлена по-умолчанию в его инсталляторе. Единственным новым является сертификат АО “Тинькофф Банк”, который мы и ставим.

После установки сертификатов из “Цепочка корневых сертификатов УЦ АО Тинькофф Банк ГОСТ Р 34.10.2001” путь в сертификате прорисовался и система радостно сообщила, что он является доверенным. Adobe Acrobat Reader DC также подтвердил, что подпись действительна.

На этом приключения с проверкой ЭП на полисе еОСАГО завершаются. Заметно, что после того, как в системе уже установлен необходимый софт, а пользователь понимает принципы работы и поиска промежуточных сертификатов, то проверка подписи занимает уже меньше времени.

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

Глава первая: проверка эп

Все манипуляции с PDF документом приведены в чистой версии ОС Windows 10, русская домашняя редакция, как наиболее вероятной среде работы простого пользователя. Набор софта, используемый в статье, также является непрофессиональным и доступным для всех.

Для начала я открыл документ в просмотрщике Foxit Reader, который использую как основной:


Это выглядит очень и очень подозрительно — документ модифицирован непонятно кем, сертификат также не является доверенным. Система не может проверить цепочку доверия для данного сертификата и помечает его недействительным.

Кроме имени организации, которой выдан сертификат, видно наименование выдавшей его организации, ООО “ИТК”. Поиск по запросу “ООО ИТК сертификат” вывел меня на страницу Установка корневого сертификата Удостоверяющего центра ООО «ИТК». Это официальный сайт ООО «Интернет Технологии и Коммуникации», который является одним из удостоверяющих центров, выдающих сертификаты ЭП.

Дополнительные библиотеки java

Нам понадобится библиотека iscjcp.jar (исходники

), в которой содержится ряд вспомогательных классов для работы с JCP из Caché. Кроме этого, потребуются три open source библиотеки —

(aka XML Security) и

. Их использование регулируется лицензией

Загрузите архив jars.zip с четырьмя перечисленными библиотеками и распакуйте его в папку jrelibext.

В случае использования Windows 7, необходимо выдать полномочия группе «Все» на чтение и выполнение всех библиотек в папке jrelibext.

Криптопро csp (скзи)

Криптопровайдер КриптоПро CSP устанавливается на ПК пользователя локально. Он подписывает документы, обращаясь к сертификату в реестре, на eToken или RuToken, смарт-картах и других носителях.

Процесс подписи

  1. «Автоматический» режим (т.е. встроив в портал). При загрузке файла на сервер и нажатии на «Подписать» с помощью плагина для браузера будет сделан вызов к КриптоПро CSP. Он подпишет файл выбранными ключами, которые записаны в реестре, либо на eToken клиента. В таком режиме можно сделать только «обычную» (контейнер) и XML подпись, так как передается только хэш документа. Подписать внутрь PDF или документ MS Office не получится.

  2. В «ручном» режиме (т.е. выйдя из портала) подпись генерирует сам клиент с помощью того ПО, которым он пользуется. Например, для подписи документа MS Office должны быть установлены MS Office, КриптоПро CSP и КриптоПро Office Signature. В интерфейсе MS Office пользователь добавляет подпись к документу, используя КриптоПро в качестве криптопровайдера. После этого подписанный файл загружается в личный кабинет функцией «приложить документ».

Плюсы

Минусы

Криптопро dss

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

В КриптоПро DSS можно настроить способ аутентификации пользователя:

Как происходит процесс подписи документа

Пользователь нажимает «Подписать». Генерируется запрос к КриптоПро DSS на подпись. Портал просит ввести ПИН-код доступа к сертификату (если установлено такое требование), и пользователь получает одноразовый пароль по SMS. После правильного ввода документ будет подписан и сохранён на портале, соответственно, отправлен далее по запланированному маршруту.

Плюсы

Минусы

Криптопро dss lite

Это «облегчённая» версия КриптоПро DSS. Она предназначена для подписания документов ЭЦП в браузере с использованием ПО. Отличие от DSS — в качестве криптопровайдера используется ПО установленное на ПК пользователя, что позволяет использовать usb-Token и Смарт-Карты для подписи.

DSS lite — «режим» DSS (т.е. идет в составе продукта DSS). Процесс подписи происходит аналогично DSS. Нажатие «подписать» отправляет файл на сервер DSS lite, тот формирует хэш документа и запрашивает доступ к криптопровайдеру (CSP, установленный на ПК пользователя) с помощью плагина.

Плюсы

Минусы

На базе nss

На картинке представлена архитектура решения, реализованная в проекте по расширению NSS aToken.

СпецификацияNSS c использованием PKCS#11-токенов, программных и аппаратных
ПлатформыСемейство Windows, GNULinux, OS X, iOS, Android
Алгоритмы и криптографические протоколыЭЦП, шифрование, хэш-функция, имитозащита, HMAC, VKO, TLS
Интеграция с PKIX.509, PKCS#10, CMS, CRL
Механизмы ЭЦПВызов из JavaScript встроенных в браузер функций
TLS-ГОСТВстроен в библиотеку и поддерживается браузером
Форматы защищенных сообщенийPKCS#7, CMS
Интеграция с браузером100%
Мобильные платформыiOS, Android
Хранилища ключейБраузерное хранилище, USB-токены
Взаимодействие с USB-токенамиХранилище ключей и сертификатов
Использование аппаратной реализации алгоритмов
ИнсталляцияПрограмма установки, в целом, не требуются права системного администратор
Portable. Например, запуск браузера с FLASH-памяти USB-токена
Примеры (ГОСТ)Mozilla FireFox, Chromium от Лисси
Проект atoken от R-Альфа (Mozilla FireFox)
КриптоFox (PKCS11-токен на базе КриптоПро CSP)

Проблемы:


Плюсы:

Настройка vpn криптопро ipsec с гостовым шифрованием

Добрый день %username%! Все знают что Федеральный Закон РФ № 152 диктует нам что мы должны использовать сертифицированные средства для защиты ПДн. Была задача обеспечить безопасность канала по ФЗ-152 для удаленного подключения клиентов. Для этого было использовано сервер VPN с КриптоПро IPsec и сертификаты ГОСТ.

Инструкция внутри.

Перед настройкой служб и соединений на сервере и клиентских машин необходимо установить на них КриптоПро CSP и КриптоПро IPSec!

Настраиваем VPN сервер на Windows Server 2022 R2

Открываем оснастку Server Manager и через мастер добавления ролей выбираем тип установки на основе ролей — Role-based or feature-based installation.

image

Далее выбираем сервер из пула серверов.

image

На шаге выбора ролей выбираем роль Remote Access.

image

Шаг Features пропускаем без внесения изменений. На шаге выбора служб включаемой роли выберем службу DirectAccess and VPN (RAS).

image

После выбора службы откроется окно добавления дополнительных компонент связанных с выбранной службой. Согласимся с их установкой нажав Add Features.

image

Роль Web Server Role (IIS) будет при этом добавлена в мастер добавления ролей. Соответствующий появившийся шаг мастера Web Server Role (IIS) и зависимые опции Role Services пропускаем с предложенными по умолчанию настройками и запускаем процесс установки, по окончании которого будет доступна ссылка на мастер первоначальной настройки служб Remote Access – Open the Getting Started Wizard.

image

Мастер настройки RAS можно вызвать щёлкнув по соответствующей ссылке здесь, либо позже из оснастки Server Manager:

image

Так как настройка DirectAccess в контексте нашей задачи не нужна, в окне мастера выбираем вариант только VPN – Deploy VPN only.

image

Настройка службы Routing and Remote Access

Из Панели управления открываем оснастку Administrative Tools Routing and Remote Access, выбираем имя сервера и открываем контекстное меню. Выбираем пункт Configure and Enable Routing and Remote Access.

image

Так как нам нужен только VPN выбираем.

image

Выбираем VPN.

image

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

image

Настраиваем диапазон адресов для клиентов.

image
image

Укажем что не используем RADIUS сервер.

image

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

image

Выпускаем ГОСТовые сертификаты в КриптоПро УЦ 2.0 для VPN.

Для того чтобы IPSec у нас работал нам нужно:

И так, создадим два шаблона IPSec client IPSec server в Диспетчере УЦ.

image

В настройка шаблона IPSec client добавим параметр Client Authentication (1.3.6.1.5.5.7.3.2). IP security IKE intermediate (1.3.6.1.5.5.8.2.2).

image

Шаблон IPSec server такой же но с параметром Server Authentication (1.3.6.1.5.5.7.3.1).

image

После проделанной работы в Консоли управления ЦР создаем пользователей для запроса и формирования сертификата.

image

Далее запрашиваем сертификат для созданных пользователей. При запросе необходимо указать шаблон который мы создавали.

image

Выберем место хранения (контейнер) для закрытого ключа.

image

После нервного дерганья мышкой (это необходимо для СПЧ) задаем пароль для контейнера.
Теперь нам необходимо экспортировать сертификат в закрытый контейнер.

image

После копирования сертификата необходимо скопировать весь контейнер в файл для переноса на АРМ удаленного клиента. Экспортируем с помощью КриптоПро CSP в формате pfx.

image

По такому же алгоритму создаем сертификат для сервера только по другому шаблону и устанавливаем их с помощью оснастки Сертификаты КриптоПро CSP. Не забываем про корневой сертификат который должен быть в Доверенных корневых центры сертификации.

Настройка политики IP-безопасности на сервере

Шаг раз.

image

Шаг два.

image

Шаг три.

image

На вкладке «Методы проверки подлинности» добавляем Корневой сертификат.

image

По такому же алгоритму настраиваем политику IP-безопасности на каждой удаленном АРМ.
Корректность установки сертификата и проверка работоспособности IPSec, а так же логирование ошибок можно проверить с помощью утилиты КриптоПро IPSec cp_ipsec_info.exe. После нажатия меню Обновить список, Вы увидите список установленных сертификатов. На против установленного сертификата должна стоять галочка для подтверждений что все хорошо с ним.

image

Настройка подключения VPN к серверу

Подключение настраивается стандартно но с небольшими изменениями.

image

Вроде рассказал все нюансы, если есть замечания или предложения выслушаю с радостью!

Настройка и запуск java gateway, создание проекций классов

Чтобы стало возможным вызывать Java-классы из Caché/Ensemble, необходимо настроить и запустить Java Gateway, а также создать проекции используемых Java-классов.

Добавим новую запись в таблицу настроек Java Gateway в области %SYS:

insert into %Net_Remote.ObjectGateway(Name, Type, Server, Port, JavaHome) values (‘JCPGate’, ‘1’, ‘127.0.0.1’, ‘55555’, ‘C:Program FilesJavajdk1.6.0_20jre’)

Здесь в поле Name указано значение “JCPGate” – это имя нового Java Gateway. В поле JavaHome необходимо указать путь к JRE, для которой была произведена установка JCP. В поле Port указывается TCP-порт, используемый для общения с этим Java Gateway из Caché.

Теперь можно запустить новый Java Gateway, выполнив в терминале Caché следующую команду:

write ##class(%Net.Remote.Service).StartGateway(«JCPGate»)

Чтобы остановить его, вызовите метод StopGateway:

write ##class(%Net.Remote.Service).StopGateway(«JCPGate»)

Запускать/останавливать Java Gateway можно из любой области.

Перейдем в область, где ведется разработка веб-сервисов, и создадим проекцию для Java-класса isc.jcp.JcpFacade, выполнив в терминале Caché следующую команду:

do ##class(%Net.Remote.Java.JavaGateway).%ExpressImport(«isc.jcp.JcpFacade», «55555»)

Здесь 55555 – это номер TCP-порта, который используется для общения с Java Gateway. Этот порт был указан нами ранее при добавлении записи в таблицу %Net_Remote.ObjectGateway.

Неочевидные тонкости эцп

  1. Один документ разные стороны могут подписать исключительно единообразно: либо только ЭЦП, либо только в бумажном виде (например, договор между Заказчиком и Исполнителем). Подпись в бумажном виде не действительна в электронном, а подпись в электронном виде не действительна в бумажном. Это два разных документа.

  2. Документ можно подписать сколько угодно раз. То есть сначала подписал сотрудник, потом бухгалтер, потом Генеральный директор.

  3. Несколько документов, подписанных ЭЦП, можно в одном пакете (архиве) подписать общей совершенно другой ЭЦП. Другие же документы в пакете с ЭЦП также остаются легитимными.

  4. Документы можно подписывать ЭЦП в автоматическом режиме. Предположим, сформировали счет на оплату в CRM — он автоматически подписался. Можно его отправлять клиенту, счет легитимен.

Облачная подпись


Концепция облачной подпись предполагает хранение закрытого ключа и выполнение процедуры подписи/шифрования данных непосредственно на сервере.

Для безопасного применения облачной подписи требуется решить задачу строгой аутентификации клиента при доступе к его закрытому ключу и задачу надежного хранения закрытого ключа на сервере. Примером подобного решения может служить КриптоПро DSS, который в качестве одного из вариантов аутентификации поддерживает Рутокен WEB (строгая двухфакторная аутентификация), а для хранения закрытого ключа использует HSM.

Отдельные библиотеки

BouncyCastle — это open source библиотека, в которой реализована своя система криптографических классов для платформы Microsoft.NET. В библиотеке поддерживаются как базовые криптографические алгоритмы ГОСТ 28147-89, ГОСТ Р 34.10-2001, ГОСТ Р 34.11-94, так и криптографические форматы PKCS#7/CMS, PKCS#10, X.

Отдельные браузеры с российской криптографией

Браузеры, созданные на базе open source проектов Mozilla FireFox и Chromium, используют в качестве криптоядра NSS или OpenSSL. OpenSSL поддерживает российские криптоалгоритмы. Для NSS также существуют разработки, которые обеспечивают поддержку российских криптоалгоритмов. Некоторое время назад на рынке появились полнофункциональные браузеры с поддержкой российской криптографии.

Подобное решение обладает большим, на данный момент невостребованным, потенциалом, так как позволяет создавать защищенные стандартные WEB-клиенты для систем с высокими требованиями к безопасности. Еще одним плюсом подобного браузера является его «портабельность».

С учетом существования USB-токенов с защищенной FLASH-памятью созданы безопасные решения, в котором наиболее критические операции с закрытом ключом осуществляются на «борту» USB-токена, а сам браузер хранится в его защищенной от модификации FLASH-памяти. Подобное решение кроме высокого уровня безопасности является очень удобным в применении.

Переносим неэкспортируемые контейнеры крипто-про

Иногда случается так что необходимо перенести клиент-банк или другое разнообразное бухгалтерское и не очень ПО с одного компьютера на другой. В том случае когда в качестве криптопровайдера выступает

СКЗИ Крипто-ПРО

обычно проблем не возникает — СКЗИ имеет штатные средства копирования ключей. Но не всегда все гладко — в том случае, когда ключевой контейнер находится в реестре Windows, и при генерации ключа

не была

выставлена галочка «Пометить ключ как экспортируемый» то при попытке скопировать куда-либо этот ключ Крипто-ПРО будет ругаться и не скопирует ключ.

Из этой ситуации есть очень простой выход — выгружаем ветку реестра

HKLMSOFTWARECryptoProSettingsUsers{SID}Keys

(в x64 операционках контейнеры лежат в

HKLMSOFTWAREWow6432NodeCryptoProSettingsUsers{SID}Keys

), а на том ПК куда необходимо импортировать смотрим

разрядность ОСSID

пользователя, блокнотом правим .reg файл(меняем SID и, если необходимо, путь к конечной ветке), и импортируем его в реестр.

Также этим методом очень удобно бекапить и клонировать ключи тогда, когда их много(например в аутсорс-бухгалтериях).

P.S. Не забывайте после переноса установить сертификаты из криптоконтейнеров в «Личные».

Добавление от Ghool

В крипто-про на контейнеры можно ставить пин-код.
А так же при вводе этого пин-кода можно поставить галочку «сохранить» — и в дальнейшем его вводить не придётся.
Иногда после этого пин-код благополучно забывают (что и произошло у нас в компании).

При копировании вышеописанным методом, контейнер остаётся защищён пин-кодом — а вот «сохранение» этого пин-кода не переносится на новый компьютер.

Что можно сделать в таком случае?

Если исходный компьютер ещё жив — заходим в панель управления -> КриптоПро CSP -> Сервис -> Скопировать
Выбираем нужный контейнер (кнопка «обзор» или «по сертификату», как проще найти) -> Далее -> вводим название нового контейнера -> далее -> устанавливаем на него новый пароль. Или не устанавливаем.

И вот после этого уже копируем ветку реестра на новый комп.

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

Win32
HKLMSOFTWARECryptoProSettingsKeys

Win64
HKLMSOFTWAREWow6432NodeCryptoProSettingsKeys

Получение ключа с токена

image

Все известные мне УЦ выдают ключи с сертификатами на подобных токенах. На токен записан контейнер КриптоПро с приватным ключом и сертификатом. При экспорте ключа через CryptoPro CSP он экспортируется в особый «КриптоПро pfx» не совместимый ни с чем.

Просьбы выдать ключ в стандартном pfx или любом другом типовом контейнере УЦ игнорируют.Если кто знает УЦ выдающие подписи в стандартных контейнерах поделитесь координатами в комментариях. Хороших людей не стыдно попиарить.

Для преобразования контейнера КриптоПро в стандартный pfx мы как и в оригинальной статье будем использовать P12FromGostCSP. Старые взломанные версии не работают с ключами по 2022 Госту. Идем на сайт авторов и покупаем новую.

Итак мы получили стандартный pfx с ключом и сертификатом.

Обновление Bouncy Castle

Обновляем Bouncy Castle до 1.60 Старые версии могут не поддерживать алгоритмы ГОСТ 2022.

Инициализация Bouncy Castle

    static {
        BouncyCastleProvider bcProvider = new BouncyCastleProvider();
        String name = bcProvider.getName();
        Security.removeProvider(name); // remove old instance
        Security.addProvider(bcProvider);
    }

Разбор pfx

               
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
ByteArrayInputStream baos = new ByteArrayInputStream(pfxFileContent);
keyStore.load(baos, password.toCharArray());

Enumeration<String> aliases = keyStore.aliases();

while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();
    if (keyStore.isKeyEntry(alias )) {
        Key key = keyStore.getKey(alias , keyPassword.toCharArray());
        java.security.cert.Certificate certificate = keyStore.getCertificate(alias );
        addKeyAndCertificateToStore((PrivateKey)key, (X509Certificate)certificate);
    }
}

Алиасы обязательно изменяем. Утилита P12FromGostCSP задает всегда один и тот же алиас «csp_exported» и при обработке уже второго ключа будут проблемы.

Для удобства работы ключ из pfx необходимо загрузить в стандартный Java KeyStore и дальше работать только с ним.

Загрузка KeyStore

FileInputStream is = new FileInputStream(keystorePath);
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
char[] passwd = keystorePassword.toCharArray();
keystore.load(is, passwd);

Сохранение ключа с сертификатом в KeyStore


public void addKeyAndCertificateToStore(PrivateKey key, X509Certificate certificate) {
    synchronized (this) {
        keystore.setKeyEntry(alias.toLowerCase(), key, keyPassword.toCharArray(), new X509Certificate[] {certificate});

        FileOutputStream out = new FileOutputStream(keystorePath);
        keystore.store(out, keystorePassword.toCharArray());
        out.close();
   }
}

Загрузка ключей и сертификатов из KeyStore


Enumeration<String> aliases = keystore.aliases();

while (aliases.hasMoreElements()) {
    String alias = aliases.nextElement();

    if (keystore.isKeyEntry(alias)) {
        Key key = keystore.getKey(alias, keyPassword.toCharArray());
        keys.put(alias.toLowerCase(), key); //any key,value collection

        Certificate certificate = keystore.getCertificate(alias);
        if (certificate instanceof X509Certificate)
            certificates.put(alias.toLowerCase(), (X509Certificate) certificate); //any key,value collection
    }
}

Подпись файла


CMSProcessableByteArray msg = new CMSProcessableByteArray(dataToSign);
 
List certList = new ArrayList();
certList.add(cert);

Store certs = new JcaCertStore(certList);
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner signer = new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder("GOST3411WITHECGOST3410-2022-256").setProvider("BC").build(privateKey);

gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(signer, certificate));
gen.addCertificates(certs);
CMSSignedData sigData = gen.generate(msg, false);
byte[] sign = sigData.getEncoded(); //result here

Есть вариант JcaContentSignerBuilder(«GOST3411WITHECGOST3410-2022-512») для 512 битовых ключей. Мои УЦ выдают 256 битные ничего не спрашивая и игнорируют уточняющие вопросы.

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


byte[] data = ...; //signed file data
byte[] signature = ...;//signature
boolean checkResult = false;

CMSProcessable signedContent = new CMSProcessableByteArray(data);
CMSSignedData signedData;
try {
    signedData = new CMSSignedData(signedContent, signature);
} catch (CMSException e) {
    return SIGNATURE_STATUS.ERROR;
}

SignerInformation signer;
try {
    Store<X509CertificateHolder> certStoreInSing = signedData.getCertificates();
    signer = signedData.getSignerInfos().getSigners().iterator().next();

    Collection certCollection = certStoreInSing.getMatches(signer.getSID());
    Iterator certIt = certCollection.iterator();

    X509CertificateHolder certHolder = (X509CertificateHolder) certIt.next();
    X509Certificate certificate = new JcaX509CertificateConverter().getCertificate(certHolder);

    checkResult = signer.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificate));

} catch (Exception ex) {
    return SIGNATURE_STATUS.ERROR;
}

Проверка подписи полностью аналогична проверке по Госту 2001 года. Можно ничего не менять.

Практический опыт внедрения

ЭЦП — действительно нужное решение, прежде всего, для неизменности передаваемых документов, мобильности бизнес-процессов и сохранения времени.

Такую задачу поставили и нам — реализовать подпись на корпоративном портале 1С-Битрикс24. Нужен правильный функционал, удобство в использовании и грамотное вложение бюджета.

Но, как известно, теория часто не сопоставима с практикой. Решение реальных задач оказывается сложнее, но интереснее.

Перед крупной биофармацевтической компанией стояло две задачи:

  1. Автоматизировать бизнес-процесс согласования документов.

    Особенность — возможность выбора определенных участников согласования, его последовательность. Реализовать проект требовалось на стандартном модуле бизнес-процессов корпоративного портала «1С-Битрикс24». Для заказчика было важно разработать наглядный, простой и интуитивный интерфейс.

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

  2. Реализовать ЭЦП на корпоративном портале «1С-Битрикс24» для ведения авансовой отчетности.

Предпроектные работы

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

Для этого есть штат торговых представителей, разбросанных по всей стране, от Калининграда до Владивостока. Каждый агент продвигает продукт на своей, закреплённой территории. Чаще это его место жительства. Он несет издержки — встречи, транспортные расходы, питание — их возмещает компания. Процедура возмещения издержек — не что иное, как сдача авансовой отчетности, так знакомая нам по командировкам.

Ключевым и первичным моментом было пошагово описать бизнес-процесс сдачи авансовой отчетности. Хотя он стандартизирован и закреплен законодательно, но у каждой организации есть своя специфика. О ней мы поговорим позже. Идеальный же бизнес-процесс командировки, каким его задумало государство, выглядит так:

  1. Генеральный директор подписывает приказ о направлении сотрудника в командировку. Часто эти приказы подписываются после командировки задним числом, но это не меняет дальнейший юридический ход процесса.

  2. Командированный сотрудник получает денежные средства под отчет. Так он становится должником перед компанией.

  3. Торговый представитель едет в командировку, сохраняет все билеты, чеки и другие подтверждающие документы. Это ключевой этап для возмещения средств. Все бумаги с информацией о расходах — первичная бухгалтерская документация, основание для увеличения расходов или уменьшения налогооблагаемой базы (прибыли организации). Разумеется, в законодательстве четко прописано, какие именно расходы могут быть зачтены, а какие нет. Все жестко стандартизировано.

  4. Сотрудник по возвращению из командировки составляет авансовый отчет, чтобы с него «списали» долг. К авансовому отчету сотрудник прикладывает все подтверждающие документы: чеки, билеты и прочее.

  5. Любой авансовый отчет, согласно российскому законодательству, в обязательном порядке имеет три подписи: командированного сотрудника, главного бухгалтера и генерального директора. В маленьких организациях генеральный директор может совмещать должность главного бухгалтера, а в больших — появляется подпись руководителя сотрудника.

  6. После сдачи авансового отчета, сотрудник обязан вернуть остаток средств или получить недостающие.

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

  1. Сотрудники находятся в командировках перманентно — все рабочее время. Даже посещение главного офиса — командировка, ведь сотрудники имеют постоянное место жительства, как правило, не в Москве.

  2. Если подотчетные деньги на исходе, то следующий транш может быть выдан только после отчета по предыдущим. Именно тут возникало много сложностей, например:

    • В связи с удаленностью сотрудников (Сибирь, Урал) оригиналы авансовых отчетов могли идти очень долго. А исправление ошибок — лишняя трата времени, средств на курьерскую службу, волокита с переподписанием и изменением дат. Очень вероятно, что отчетный период к моменту прибытия оригиналов может быть уже закрыт.
    • Сотрудников множество, каждый отчитывается примерно раз в месяц, многие что-то забывают, теряют — бухгалтерам было трудно привести в соответствие документы. А ведь бухгалтер должен отразить операцию в своей системе, и не забыть, что сотрудник обещал донести или дослать.
    • У каждого сотрудника есть денежный лимит, но в каждом правиле есть исключения. За этими исключениями следят руководители, именно они в курсе конкретной ситуации у сотрудника.

Переложение этого процесса систематизации и оптимизации авансовой отчетности в ИТ-среду было поэтапным.

Про инструменты и возможности

С видами подписей и вариантами результата разобрались. Теперь перейдем к выбору инструментов. Держим в уме, что есть конкретная задача — интегрировать ЭЦП на корпоративном портале Битрикс24.

Важный шаг — выбор компании поставщика ПО для реализации ЭЦП. Выбор пал на признанного лидера отрасли с широким инструментарием, которому нет аналога в РФ — КриптоПро. Для решения нашей задачи поставщик предложил несколько инструментов.

Про работу и терминологию

ЭЦП инструмент удобный и давно знакомый почти каждому, кто работает с удаленным документооборотом. Однако реализовать ЭЦП на Корпоративном портале Битрикс24 оказалось задачей нетривиальной. Наше знакомство с подобной интеграцией началось с двух клиентских задач:

  1. Стандартной — внедрить подпись документации удаленно.
  2. Нестандартной — дать возможность сотрудникам, разбросанным по всей территории России, отлажено и вовремя сдавать авансовую отчетность.

Однако вначале давайте разберёмся «что это такое — ЭЦП» и «с чем её едят».

Личная подпись — один из идентификаторов человека. Законодательно и безнаказанно повторить её может только этот человек, только его рука. А если она (рука) не дееспособна, а важная сделка не должна сорваться — проводится специальная нотариальная процедура и подпись ставит доверенный человек.

Не будем скрывать — подпись подделывают. Дело мастерства и привычки. Хоть и выработаны технологии сверки — по нажиму, толщине, линиям — гарантом является только обладатель подписи. Любая непонятная другим закорючка признаётся легитимной со слов её автора.

Значимые сделки требуют второй «защиты личной подписи». Человека просят предъявить документ, удостоверяющий личность, с фотографией, поставить подпись в присутствии подтверждающего лица — нотариуса. Последний ручается — подписант выполнит пункты договора, доверенности, заявления.

Но участники процесса не всегда находятся в досягаемости друг от друга. Есть почта, но это затратно и долго.

Здесь и перейдем к электронной подписи. Она бывает трех видов (ФЗ от 06.04.2022 № 63-ФЗ «Об электронной подписи»).

Проверка эцп во входящих soap-сообщениях

Загрузите и распакуйте архив

с исходным кодом классов smev.JcpUtils и smev.JcpSignature. Импортируйте класс

smev.JcpUtils

в Caché с помощью Studio, предварительно перейдя в область, где ведется разработка веб-сервисов. Откройте импортированный класс в Studio и отредактируйте значения параметров JAVAGATEWAYPORT и JAVAGATEWAYSERVER, указав соответственно TCP-порт и IP-адрес используемого Java Gateway. Скомпилируйте класс.

Теперь, чтобы добавить в существующий веб-сервис проверку ЭЦП, достаточно внести в класс веб-сервиса следующий метод:

Method OnPreSOAP(mode As %String, action As %String, request)
{
  do ##super(mode, action, request)

  #dim stream As %Stream.Object = request

  if '$isObject(stream)
  {
    // на случай MIME attachments
    #dim index As %Integer = %request.NextMimeData("")
    set stream = $select(index="":"", 1:%request.GetMimeData(index))
  }

  if $isObject(stream)
  {
  #dim fault As %SOAP.Fault = ##class(smev.JcpUtils).verifySignatureOnPreSoap(stream)
    if $isObject(fault) set ..SoapFault = fault
  }
}

Это работает на версиях Caché/Ensemble, начиная с 2009.1. Ниже приведен пример веб-сервиса, который осуществляет проверку подписи всех входящих SOAP-сообщений.

Размещение секретного ключа и сертификата на виртуальной дискете на сервере системы

Чтобы создать такую дискету, выполните следующие действия:

  1. Установите драйвер, имитирующий FDD привод, например, ImDisk.
  2. Из панели управления Windows запустите программу настройки «ImDisk Virtual Disk Driver» и настройте диск с параметрами:
  3. Отформатируйте виртуальную дискету, задав файловую систему FAT.
  4. Распакуйте содержимое архива FDD.zip на диск A:.

В результате описанных манипуляций на диске A: сервера имеем хранилище ключей, содержащее тестовый секретный ключ. Файл A:SelfSigned.cer представляет собой тестовый сертификат, соответствующий секретному ключу.

Вы можете самостоятельно генерировать ключи и сертификаты с помощью КриптоПро JCP. Эти процедуры описаны в документации продукта.

Расширения классов

В платформе существует набор криптографических классов, в которых предусмотрены механизмы расширения сторонними алгоритмами. Наиболее известным на рынке решением по расширению платформы Microsoft.NET российскими криптоалгоритмами является продукт КриптоПро. NET, представляющий собой надстройку над КриптоПро CSP.

Установка КриптоПро.NET позволяет использовать российские криптоалгоритмы, например,

в WEB-сервисах на базе ASP.NET, SOAP-сервисах, в клиентских браузерных приложениях MS.Silverlight.

ПлатформыMicrosoft.NET 2.0 и старше
Алгоритмы и криптографические протоколыЭЦП, шифрование, хэш-функция, имитозащита, HMAC, VKO, TLS, SOAP
Интеграция с PKIX.509, PKCS#10, CMS, CRL
Механизмы ЭЦПНабор классов. Есть полностью “управляемые” реализации. Есть реализации на базе Crypto API 2.0 и CNG
Механизмы аутентификацииклиентская аутентификация в рамках TLS
аутентификация в SOAP-сервисах
собственные механизмы аутентификации на базе ЭЦП случайных данных
TLS-ГОСТВстраивание
Форматы защищенных сообщенийPKCS#7, CMS, XMLSec, SOAP (OASIS Standard 200401), S/MIME
Интеграция с браузеромЭЦП и шифрование через MS Silverlight
Хранилища ключейРеестр, UBS-токены
Взаимодействие с USB-токенамиХранилище ключей и сертификатов
Использование аппаратной реализации алгоритмов
Через Crypto API 2.0
ПриложенияMicrosoft Lync 2022, Microsoft Office Forms Server 2007 и Microsoft SharePoint 2022, Microsoft XPS Viewer
ИнсталляцияMicrosoft. NET включен в состав Windows, начиная с Windows Vista. Поддержка российских криптоалгоритмов требует установки дополнительного ПО
Примеры (ГОСТ)КриптоПро. NET (на базе КриптоПро CSP)

Результат

На данный момент внедрение такой системы отработано, она исправна. Разработан уникальный модуль интеграции, позволяющий по протоколу soap передавать данные. Для пользователя это означает, что не надо переходить по ссылкам, не надо покидать окна корпоративного портала для подписи документов.

Больше полезного о внедрении порталов.

Средства формирования доверенной среды

Проблема формирования доверенной среды для выполнения криптоопераций, в частности ЭЦП, является отдельной большой темой. В данной статье не планируется ее подробно рассматривать, но хочется отметить, что концептуально разработчики идут следующими путями:

На последнем способе формирования ДС хотелось бы остановиться подробнее.

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

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

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

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

Установка криптопро jcp на windows

Прежде всего, на сервер системы установите

(JRE) версии не ниже 1.6.

Загрузите дистрибутив КриптоПро JCP с сайта производителя, распакуйте его в папку на сервере и запустите скрипт установки install.bat. Скрипт находится в папке lib дистрибутива. При его запуске необходимо указать путь к JRE:

install.bat «C:Program FilesJavajdk1.6.0_20jre»

В случае если имеется лицензия, при запуске скрипта также указывается серийный номер и название компании:

install.bat «C:Program FilesJavajdk1.6.0_20jre» XXXXX-XXXXX-XXXXX-XXXXX-XXXXX «Your Company»

Под Windows 7 скрипт установки необходимо запускать с правами администратора. После завершения работы скрипта, убедитесь в том, что в папке jrelibext появились следующие библиотеки:

Формирование эцп

Загруженный ранее архив

с исходным кодом Caché Object Script содержал класс

smev.JcpSignature

. Импортируйте этот класс в Caché с помощью Studio.

Откройте класс smev.JcpUtils в Studio и отредактируйте значение параметра CERTFILENAME, указав полный путь к файлу сертификата – “A:SelfSigned.cer”. Этот сертификат соответствует секретному ключу, который будет использоваться при формировании ЭЦП. Скомпилируйте класс.

Теперь, чтобы добавить в метод веб-сервиса функционал по формированию ЭЦП для возвращаемых сообщений, необходимо вставить следующую строку в код этого метода:

do ..SecurityOut.AddElement(##class(smev.JcpSignature).%New())

Формирование эцп для исходящих soap-сообщений веб-сервиса

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

Электронная цифровая подпись на сайте при помощи криптопро эцп browser plug-in

В данной статье рассмотрим использование электронно-цифровой подписи на сайте.

Что необходимо, чтобы человек смог использовать электронно-цифровую подпись на сайте?

1) СКЗИ (средство криптографической защиты информации)
Мой опыт работы показывает, что порядка 90% использует КриптоПро CSP (скачать), который в явном или неявном виде продвигают удостоверяющие центры. Порядка 10% VipNet CSP (), который можно использовать бесплатно. С остальными СКЗИ на практике не встречался.
2) КриптоПро ЭЦП Browser plug-in (страница плагина).
3) Установленная подпись (хотя бы одна).

Проверка возможности осуществления подписи
javascript ( jquery)

1) Попытка создать объект cades.
Нужно сделать примечание, что тут и далее, будет деление на браузер с ActiveX(читай IE) и остальные.
Проверка будет осуществляться:

return ('ActiveXObject' in window);

для ActiveX:

try {
    store = new ActiveXObject('CAdESCOM.store');
    status = true;
} catch (e) {
    status = false;
}

Для остальных:

if (navigator.mimeTypes['application/x-cades']) {
    status = true;
} else {
    status = false;
}

Если проверка прошла неудачно, то уведомляем об этом пользователя.

Стоит иметь ввиду, что после обновления хрома до версии 42 (спасибо

статье

за информацию) нужно включить:

chrome://flags/#enable-npapi

Следующая проверка — а разрешен ли плагин для запуска (не для IE проверка)?

try {
    store = objSign.CreateObject('CAPICOM.store');
    status = true;
} catch (e) {
    status = false;
}

Где objSign:

objSign = $('<object/>', {
    'id': 'cadesplugin',
    'type': 'application/x-cades',
    'css': {
        'visibility': 'hidden',
        'height': '0px',
        'width': '0px',
        'position': 'absolute'
    }
}).appendTo('body').get(0);

Проверяем на СКЗИ путем попытки открыть хранилище.

try {
    store.Open();
    status = true;
} catch (e) {
    status = false;
}

Проверяем на существование сертификатов в хранилище:

if ('Certificates' in store) {
    certs = store.Certificates;
}

И их количество (бывает, что Certificates есть, но пуст, что нам тоже не подойдет):

if (certs.Count) {
    status = true;
} else {
    status = false;
}

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

Выбор электронной цифровой подписи

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

1) Группируем по удостоверяющим центрам
Информация об удостоверяющем центре хранится в сертификате.

certs.Item(i).GetInfo(1)
где certs — сертификаты из хранилища, см выше
i — порядковый номер сертификата от 1 (обратите внимание) до certs.Count.
Обратите внимание, что, в случае «кривых» сертификатов, вернуться может и undefined, имеет смысл сделать один дефолтный УЦ для таких случаев.

Теперь мы знаем список УЦ, услугами которых воспользовался клиент.
Запоминаем их и выведем через optgroup.
Сам text у option будет таким:

cert.GetInfo(6)   ' ('   formatDate(cert.ValidFromDate)   ' - '   formatDate(cert.ValidToDate)   ')'

в

cert.GetInfo(6)

— кому выдан сертификат

в

ValidFromDate

— с какого срока сертификат начал/начнет действие

в

ValidToDate

— соответственно, до какого срока

Ну и форматирование даты стандартное:

function formatDate(d) {
    try {
        d = new Date(d);
        return ('0'   d.getDate()).slice(-2)   '.'   ('0'   (d.getMonth()   1)).slice(-2)   '.'   d.getFullYear();
    } catch (e) {
        return '';
    }
}

Еще можно подсветить option.

Зеленым — для работоспособных сертификатов, красным — нет.

Информацию можно получить при помощи самого сертификата.

try {
    return cert.IsValid().Result;
} catch (e) {
    return false;
}

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

Но самые базовые, например, проверка даты — проверяет.

В value у option запишем отпечаток cert.Thumbprint.
Можно порядковый номер записать, можно другие данные — на ваше усмотрение.

Подписание
Ну и, собственно, самый главный шаг, к которому мы стремились — подписание.

1) Находим выбранный сертификат.
Для нашего примера:

certs.Find(0, thumbprint).Item(1)

0

— означает, что мы ищем по отпечатку

1

— что используем первый результат выборки (по факту единственный)

2) Подписываем:

if (isActiveX()) {
    var CPSigner = new ActiveXObject('CAdESCOM.CPSigner');
} else {
    var CPSigner = objSign.CreateObject('CAdESCOM.CPSigner');
}
CPSigner.Certificate = cert;
if (isActiveX()) {
    var SignedData = new ActiveXObject('CAdESCOM.CadesSignedData');
} else {
    var SignedData = objSign.CreateObject('CAdESCOM.CadesSignedData');
}
SignedData.Content = text;
return SignedData.SignCades(CPSigner, 1, false);

где cert — сертификат, при помощи которого подписываем
text — собственно, что подписываем
Ну а в return возвращается подписанное сообщение.

p.s. По максимуму код постарался вычистить от специфики проекта. Если кому-то этот материал пригодится и будет интересно — напишу и серверную часть. Проверка подписанного сообщения (с цепочкой и без), проверка сертификата (ocsp и без), использования tsp и т.д.

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