КриптоПро JCP

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

Введение.

В одной из поддерживаемых мной систем цифровая подпись сообщений проверялась с помощью КриптоПро CSP и библиотека отвечающая за это функцию периодически падала с ошибкой. Библиотека эта писалась в спешке и не мной, поэтому я решил переделать ее “по-человечески” и оформить в виде python модуля. Ниже я опишу процесс разработки и опишу с какими трудностями я столкнулся.


Offline

Dmitriy PRO

 

Оставлено
:

4 октября 2021 г. 15:40:58(UTC)

Добрый день, коллеги!

Необходимо подписать закрытым ключом ЭП Партнера текст запроса в формате CMS/PKCS#7 в DER кодировке.
Подписанный XML вкладывается в тело (body) HTTP/POST запроса, с указанием content-type:application/octet-stream и отправляется на веб-адрес.
Для ЭП используется алгоритм ГОСТ Р 34.10-2012.
Помогите пожалуйста реализовать задачу с использованием КриптоПро .NET.


Offline

Андрей *

 

Оставлено
:

4 октября 2021 г. 17:08:52(UTC)

Здравствуйте.

Установите КриптоПро .NET SDK – там есть примеры.

\Program Files (x86)\Crypto Pro\.NET SDK\Examples\
пример:
\simple.zip\CMS\cs\SingleSigner.cs


Offline

Dmitriy PRO

 

Оставлено
:

5 октября 2021 г. 23:58:43(UTC)

Спасибо, все получилось!

В итоге сам КриптоПро .NET не понадобился


Offline

rafaelkhasanov

 

Оставлено
:

17 октября 2021 г. 3:07:30(UTC)

Хочу проверить подпись, пришедшую от ЕСИА.
Использую такую команду:

Вывод:
CSP (Type:80) v5.0.10003 KC1 Release Ver:5.0.11455 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 10322787
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
An error occurred in running the program.
/dailybuildsbranches/CSP_5_0r0/CSPbuild/CSP/samples/csptest/ctkey.c:3119:CryptImportPublicKeyInfoEx()
Error number 0x80093101 (2148086017).
либо внутренняя ошибка ASN1 либо ошибка дешифровки.
Total: SYS: 0,000 sec USR: 0,030 sec UTC: 0,050 sec
[ErrorCode: 0x80093101]

На винде все ок
КриптоПро JCP 2021-10-17_03-03-25.png (23kb) загружен 16 раз(а).


Online

Александр Лавник

 

Оставлено
:

18 октября 2021 г. 9:08:50(UTC)

Автор: rafaelkhasanov Перейти к цитате

Хочу проверить подпись, пришедшую от ЕСИА.
Использую такую команду:

Вывод:
CSP (Type:80) v5.0.10003 KC1 Release Ver:5.0.11455 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 10322787
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
An error occurred in running the program.
/dailybuildsbranches/CSP_5_0r0/CSPbuild/CSP/samples/csptest/ctkey.c:3119:CryptImportPublicKeyInfoEx()
Error number 0x80093101 (2148086017).
либо внутренняя ошибка ASN1 либо ошибка дешифровки.
Total: SYS: 0,000 sec USR: 0,030 sec UTC: 0,050 sec
[ErrorCode: 0x80093101]

На винде все ок
КриптоПро JCP 2021-10-17_03-03-25.png (23kb) загружен 16 раз(а).

Здравствуйте.

Попробуйте доустановить пакет cprocsp-rsa-64-5.0.11455-5.x86_64.rpm из состава дистрибутива КриптоПро CSP 5.0.11455 и повторить проверку.


Offline

rafaelkhasanov

 

Оставлено
:

20 октября 2021 г. 1:38:03(UTC)

КриптоПро JCP 2021-10-20_01-35-13.png (239kb) загружен 5 раз(а).
Установили. К сожалению, картина не изменилась. Имеет ли значение, что устанавливалось от рута, а скрипт запускается от другого юзера?


Offline

rafaelkhasanov

 

Оставлено
:

20 октября 2021 г. 2:09:50(UTC)

Проверил сейчас через гостовский тестовый сертификат (предварительно изменив настройки в тех кабинете ЕСИА, чтобы изменился алгоритм), все ок, проверяет успешно, а вот SHA256 не хочет.


Online

Александр Лавник

 

Оставлено
:

20 октября 2021 г. 12:20:15(UTC)

Автор: rafaelkhasanov Перейти к цитате

Проверил сейчас через гостовский тестовый сертификат (предварительно изменив настройки в тех кабинете ЕСИА, чтобы изменился алгоритм), все ок, проверяет успешно, а вот SHA256 не хочет.

Здравствуйте.

Если есть возможность, то приложите (или пришлите ссылку через ЛС) файла, с которым возникает ошибка при проверке подписи.


Offline

vicmosin

 

Оставлено
:

17 февраля 2022 г. 8:50:55(UTC)

Доброго времени суток,
интересует следующее – есть ли возможность проверить подпись, генерируемую с помощью браузер-плагина (https://docs.cryptopro.ru/cades/plugin/plugin-samples/plugin-samples-sign-detached) на стороне сервера без установки JCP?
То есть либо чистый Java либо BouncyCatstle.

Заранее спасибо.


Offline

TolikTipaTut1

 

Оставлено
:

17 февраля 2022 г. 11:47:18(UTC)

Добрый. Да, проверить можно.


Offline

vicmosin

 

Оставлено
:

17 февраля 2022 г. 12:18:49(UTC)

Автор: TolikTipaTut1 Перейти к цитате

Добрый. Да, проверить можно.

Есть какие-то примеры где можно почерпнуть? ))


Offline

TolikTipaTut1

 

Оставлено
:

17 февраля 2022 г. 12:27:18(UTC)

https://github.com/anato…0using%20BouncyCastle.cs

Тут на C#, но на Java переписать, думаю, несложно будет.

Важно! В примере, представленном выше, проверяется математическая корректность ЭП. Квалифицированность цепочки, ровно как построение цепочки сертов до корневого, загрузка crl, обработка Ocsp и т.д. в примере нет

Отредактировано пользователем 17 февраля 2022 г. 12:32:37(UTC)
 | Причина: Не указана

thanks 1 пользователь поблагодарил TolikTipaTut1 за этот пост.


Offline

vicmosin

 

Оставлено
:

17 февраля 2022 г. 12:37:39(UTC)

Автор: TolikTipaTut1 Перейти к цитате

https://github.com/anatolkavassermann/BounyCastle-and-OpenSSL-crypto/blob/main/Different%20samples%20using%20BouncyCastle.cs

Тут на C#, но на Java переписать, думаю, несложно будет.

Важно! В примере, представленном выше, проверяется математическая корректность ЭП. Квалифицированность цепочки, ровно как построение цепочки сертов до корневого, загрузка crl, обработка Ocsp и т.д. в примере нет

Спасибо!

> Квалифицированность цепочки, ровно как построение цепочки сертов до корневого, загрузка crl, обработка Ocsp и т.д. в примере нет

Это я так понимаю уже часть JCP?


Offline

TolikTipaTut1

 

Оставлено
:

17 февраля 2022 г. 12:45:36(UTC)

Автор: vicmosin Перейти к цитате

Автор: TolikTipaTut1 Перейти к цитате

https://github.com/anatolkavassermann/BounyCastle-and-OpenSSL-crypto/blob/main/Different%20samples%20using%20BouncyCastle.cs

Тут на C#, но на Java переписать, думаю, несложно будет.

Важно! В примере, представленном выше, проверяется математическая корректность ЭП. Квалифицированность цепочки, ровно как построение цепочки сертов до корневого, загрузка crl, обработка Ocsp и т.д. в примере нет

Спасибо!

> Квалифицированность цепочки, ровно как построение цепочки сертов до корневого, загрузка crl, обработка Ocsp и т.д. в примере нет

Это я так понимаю уже часть JCP?

Нет, придётся писать самостоятельно с использованием BouncyCastle


Offline

Санчир Момолдаев

 

Оставлено
:

17 февраля 2022 г. 12:54:33(UTC)

Добрый день!
для проверки подписей лицензия JCP не требуется.
вы не хотите его (jcp) использовать только из-за лицензий?


Offline

TolikTipaTut1

 

Оставлено
:

17 февраля 2022 г. 13:32:39(UTC)

Автор: Санчир Момолдаев Перейти к цитате

Добрый день!
для проверки подписей лицензия JCP не требуется.
вы не хотите его (jcp) использовать только из-за лицензий?

+
Есть готовое решение уже, и поддержка есть. BC использовать- не лучший вариант. Придётся многое переписывать для адекватной работы с ГОСТ-ом


Offline

vicmosin

 

Оставлено
:

17 февраля 2022 г. 13:52:46(UTC)

Автор: Санчир Момолдаев Перейти к цитате

Добрый день!
для проверки подписей лицензия JCP не требуется.
вы не хотите его (jcp) использовать только из-за лицензий?

Именно.
То есть для проверки подписей я могу использовать JCP бесплатно?

Отредактировано пользователем 17 февраля 2022 г. 13:53:19(UTC)
 | Причина: Не указана


Offline

Санчир Момолдаев

 

Оставлено
:

17 февраля 2022 г. 15:42:26(UTC)

Автор: vicmosin Перейти к цитате

Автор: Санчир Момолдаев Перейти к цитате

Добрый день!
для проверки подписей лицензия JCP не требуется.
вы не хотите его (jcp) использовать только из-за лицензий?

Именно.
То есть для проверки подписей я могу использовать JCP бесплатно?

да

thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.


Offline

squadgazzz

 

Оставлено
:

10 сентября 2021 г. 9:26:23(UTC)

Здравствуйте! Подскажите, с помощью JCSP на алгоритмах GOST28147 и GOST3412_2015_K возможно осуществить потоковое шифрование и последующую верификацию больших файлов без загрузки их целиком в оперативную память? Существуют ли готовые примеры?

Отредактировано пользователем 10 сентября 2021 г. 9:44:14(UTC)
 | Причина: Не указана


Offline

Евгений Афанасьев

 

Оставлено
:

14 сентября 2021 г. 23:34:39(UTC)

Здравствуйте. Посмотрите EnvelopedSignature из состава CAdES.jar (описание в javadoc/CAdES-javadoc.jar дистрибутива), примеры в пакете CAdES/enveloped архива samples-sources.jar. В EnvelopedSignature есть потоковое шифрование.

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.


Offline

Алексей Н.

 

Оставлено
:

13 октября 2021 г. 14:41:00(UTC)

Здравствуйте! Использую JCP jcp-2.0.41940-A, требуется реализовать шифрование с помощью алгоритма GOST3412_2015_M, но его нет в списке доступных

Цитата:

– JCP – =========== CryptoPro Java Provider ===========
– AlgorithmParameters – GOST_PARAM_VALIDATOR
– KeyFactory – GOST3410DHEL
– KeyFactory – GOST3410DH_2012_256
– KeyFactory – GOST3410DH_2012_512
– KeyFactory – GOST3410EL
– KeyFactory – GOST3410_2012_256
– KeyFactory – GOST3410_2012_512
– KeyPairGenerator – GOST3410EL
– KeyPairGenerator – GOST3410ELEPH
– KeyPairGenerator – GOST3410EPH_2012_256
– KeyPairGenerator – GOST3410EPH_2012_512
– KeyPairGenerator – GOST3410_2012_256
– KeyPairGenerator – GOST3410_2012_512
– KeyStore – CertStore
– KeyStore – FloppyStore
– KeyStore – HDImageStore
– KeyStore – MemoryStore
– KeyStore – MemoryStore0
– KeyStore – MemoryStore1
– KeyStore – MemoryStore2
– KeyStore – MemoryStore3
– KeyStore – MemoryStore4
– KeyStore – MemoryStore5
– KeyStore – MemoryStore6
– KeyStore – MemoryStore7
– KeyStore – MemoryStore8
– KeyStore – MemoryStore9
– MessageDigest – GOST3411
– MessageDigest – GOST3411_2012_256
– MessageDigest – GOST3411_2012_512
– SecureRandom – CPRandom
– Signature – CryptoProSignature
– Signature – CryptoProSignature_2012_256
– Signature – CryptoProSignature_2012_512
– Signature – GOST3411_2012_256withGOST3410DH_2012_256
– Signature – GOST3411_2012_256withGOST3410_2012_256
– Signature – GOST3411_2012_512withGOST3410DH_2012_512
– Signature – GOST3411_2012_512withGOST3410_2012_512
– Signature – GOST3411withGOST3410DHEL
– Signature – GOST3411withGOST3410EL
– Signature – NONEwithCryptoProSignature
– Signature – NONEwithCryptoProSignature_2012_256
– Signature – NONEwithCryptoProSignature_2012_512
– Signature – NONEwithGOST3410DHEL
– Signature – NONEwithGOST3410DH_2012_256
– Signature – NONEwithGOST3410DH_2012_512
– Signature – NONEwithGOST3410EL
– Signature – NONEwithGOST3410_2012_256
– Signature – NONEwithGOST3410_2012_512
– Crypto – =========== CryptoPro Java Cipher Provider. ===========
– Cipher – GOST28147
– Cipher – GOST28147Clear
– Cipher – GostJCE
– Cipher – GostJCEClear
– Cipher – GostTransport
– Cipher – XmlGostTransport2001
– Cipher – XmlGostTransport2012_256
– Cipher – XmlGostTransport2012_512
– KeyAgreement – GOST3410DHEL
– KeyAgreement – GOST3410DH_2012_256
– KeyAgreement – GOST3410DH_2012_512
– KeyAgreement – GOST3410EL
– KeyAgreement – GOST3410_2012_256
– KeyAgreement – GOST3410_2012_512
– KeyFactory – GOST28147
– KeyGenerator – GOST28147
– KeyGenerator – SYMMETRIC512
– KeyPairGenerator – GOST3410DHEL
– KeyPairGenerator – GOST3410DHELEPH
– KeyPairGenerator – GOST3410DHEPH_2012_256
– KeyPairGenerator – GOST3410DHEPH_2012_512
– KeyPairGenerator – GOST3410DH_2012_256
– KeyPairGenerator – GOST3410DH_2012_512
– Mac – GOST28147
– Mac – GOST28147Clear
– Mac – HMAC_GOSTR3411
– Mac – HMAC_GOSTR3411_2012_256
– Mac – HMAC_GOSTR3411_2012_512
– SecretKeyFactory – GOST28147
– SecretKeyFactory – MASTER_KEY
– RevCheck – =========== CryptoPro Java Revocation Checker. ===========
– CertPathBuilder – CPPKIX
– CertPathValidator – CPPKIX

Однако в продукте он указан https://www.cryptopro.ru/products/csp/jcp
Это проблема некорректного “подключения” jcp или он отсутствует в поставке?

КриптоПро JCP – средство криптографической защиты информации, реализующее российские криптографические стандарты, разработанное в соответствии со спецификацией JCA (Java Cryptography Architecture).

Интеграция КриптоПро JCP с архитектурой Java позволяет использовать стандартные процедуры, такие как создание и проверка ЭЦП (в том числе XMLdsig, CAdES, XAdES) , шифрование, генерацию ключей, вычисление кодов аутентификации (Message Authentication Code – MAC) в JavaTM Cryptography Extension (JCE) в соответствии со спецификациями JavaTM Cryptography Extension (JCE) на различных операционных системах и аппаратных платформах.

Реализация КриптоПро JCP совместима с КриптоПро CSP.

Средство криптографической защиты КриптоПро JCP распространяется в двух комплектациях:

  • генерация ключей, формирование и проверка ЭЦП, хэширование данных;
  • генерация ключей, формирование и проверка ЭЦП, хэширование данных, шифрование.

Назначение: 

КриптоПро JCP предназначен для:

  • авторизации и обеспечения юридической значимости электронных документов при обмене ими между пользователями, посредством использования процедур формирования и проверки электронной цифровой подписи (ЭЦП) в соответствии с отечественными стандартами ГОСТ Р 34.11-94/ГОСТ Р 34.11-2012 и ГОСТ Р 34.10-2001/ГОСТ Р 34.10-2012;
  • обеспечения конфиденциальности и контроля целостности информации посредством ее шифрования и имитозащиты, в соответствии с ГОСТ 28147-89 и ГОСТ 34.12-2015;
  • обеспечение аутентичности, конфиденциальности и имитозащиты соединений TLS;
  • контроля целостности, системного и прикладного программного обеспечения для его защиты от несанкционированного изменения или от нарушения правильности функционирования;
  • управления ключевыми элементами системы в соответствии с регламентом средств защиты.

Реализуемые алгоритмы: 

Алгоритм выработки значения хэш-функции реализован в соответствии с требованиями ГОСТ Р 34.11 94 “Информационная технология. Криптографическая защита информации. Функция хэширования” и ГОСТ Р 34.11 2012 “Информационная технология. Криптографическая защита информации. Функция хэширования”.

Алгоритмы формирования и проверки ЭЦП реализованы в соответствии с требованиями:

  • ГОСТ Р 34.10-2001 “Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи”;
  • ГОСТ Р 34.10-2012 “Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи”.

Алгоритм зашифрования/расшифрования данных и вычисление имитовставки реализованы в соответствии с требованиями ГОСТ 28147-89 “Системы обработки информации. Защита криптографическая” и ГОСТ 34.12-2015 “Информационная технология. Криптографическая защита информации”.

При генерации закрытых и открытых ключей обеспечена возможность генерации с различными параметрами в соответствии с ГОСТ Р 34.10-2001/ГОСТ Р 34.10-2012.

При выработке значения хэш-функции и шифровании обеспечена возможность использования различных узлов замены в соответствии с ГОСТ Р 34.11-94/ГОСТ Р 34.11-2012 и ГОСТ 28147-89.

Системные требования: 

КриптоПро JCP функционирует в следующем окружении:

  • виртуальной машина, удовлетворяющая спецификации Java 7 ™ Virtual Machine;
  • требуется Java 7 Runtime Environment версии 7 и выше;

Основные характеристики: 

Длина ключей электронной цифровой подписи (ГОСТ Р 34.10-2001):

  • закрытый ключ – 256 бит;
  • открытый ключ – 512 бит при использовании алгоритма ГОСТ Р 34.10-2001;

Длина ключей электронной цифровой подписи (ГОСТ Р 34.10-2012, 256 бит):

  • закрытый ключ – 256 бит;
  • открытый ключ – 512 бит при использовании алгоритма ГОСТ Р 34.10-2012, 256 бит;

Длина ключей электронной цифровой подписи (ГОСТ Р 34.10-2012, 512 бит):

  • закрытый ключ – 512 бит;
  • открытый ключ – 1024 бит при использовании алгоритма ГОСТ Р 34.10-2012, 512 бит;

Длина ключей, используемых при шифровании:

  • закрытый ключ – 256 бит на базе алгоритма ГОСТ Р 34.10-2001;
  • закрытый ключ – 256 бит на базе алгоритма ГОСТ Р 34.10-2012, 256 бит;
  • закрытый ключ – 512 бит на базе алгоритма ГОСТ Р 34.10-2012, 512 бит;
  • открытый ключ – 512 бит на базе алгоритма ГОСТ Р 34.10-2001;
  • открытый ключ – 512 бит на базе алгоритма ГОСТ Р 34.10-2012, 256 бит;
  • открытый ключ – 1024 бит на базе алгоритма ГОСТ Р 34.10-2012, 512 бит;
  • симметричный ключ – 256 бит;

Типы ключевых носителей:

  • дискеты 3,5″;
  • сменные носители с интерфейсом USB;
  • российские интеллектуальные карты (Оскар) с использованием считывателей смарт-карт, поддерживающих интерфейс OpenCard Framework (в том числе протокол PC/SC для Windows): GemPC Twin, Towitoko, Oberthur OCR126 и др.);
  • электронные ключи и смарт-карты eToken;
  • электронные ключи Rutoken;
  • смарт-карты ESMART;
  • директория жесткого диска.

Преимущества: 

Сравнение версий JCP JCP JCP 2.0
ГОСТ Р 34.10-2012 512 / 1024 бит
ГОСТ Р 34.10-2001512 бит512 бит
ГОСТ Р 34.10-941024 бит 
ГОСТ Р 34.11-2012 256 / 512 бит
ГОСТ Р 34.11-94256 бит256 бит
ГОСТ 28147-89256 бит256 бит
ГОСТ 34.12-2015256 бит
Поддержка новых алгоритмов в JTLS+
Контроль сроков действия ключа+
Поддержка CAdES/XAdES-подписи+
  • Страница для печатиСтраница для печати

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

Для того что бы автоматизировать процесс подписывания электронных документов нам понадобится:
1) Крипто-ПРО CSP;
2) USB Ключ (например рутокен), вставленный в USB порт;
3) Блокнот (Notepad.exe);
4) Установленные сертификаты для Вашего ключа;

Камнем преткновения во всей этой истории является файл csptest.exe который находится в директории КриптоПро (по умолчанию C:\Program Files\Crypto Pro\CSP\csptest.exe).

Откроем командную строку и выполним команду:

cd C:\Program Files\Crypto Pro\CSP\
и
csptest

Мы увидим все возможные параметры данного exe файла.

select [global options] from:
  -help         print this help
  -noerrorwait  do not wait for any key on error
  -notime       do not show time elapsed
  -pause        Wait for keyboard input after completion so that
                you may check memory and other resources usage
  -reboot       Call DestroyCSProvider() of last used CSP at exit
                Services (cryptsrv*, HSM, etc) not affected
  -randinit <x> Initialize system rng with srand(x) (default: time)
  -showrandinit Show system rng initialization value
  -stack            Measure stack usage
select [mode] from:
  -lowenc       low level encryption/decryption test
  -sfenc        simplified level message encryption/decryption test
  -cmslowsign   CMS low level message signing test
  -cmssfsign    CMS simplified level message signing/verifying test
  -lowsign      low level message signing test
  -lowsignc     low level message signing test with cycle
                Use '-lowsign -repeat NN' instead!
  -sfsign       simplified level message signing/verifying test
  -ipsec        ipsec tests
  -defprov      default provider manipulations
  -testpack     Pack of several tests
  -property     certificate obtain/install property for secret key linking
  -certkey      change provider name in certificate secret key link
  -context      provider context tests
  -absorb       absorbs all certs from containers with secret key linking
  -drvtst       proxy-driver test
  -signtool     SDK signtool analog
  -iis          manage IIS
  -hsm          manage HSM-client
  -rpcc         RPC over SSL client
  -rpcs         RPC over SSL server
  -oid          oid info/set/get
  -passwd       set/change password
  -keycopy      copy container
  -keyset       create (open) keyset
  -tlss         start tls server
  -tlsc         start tls client
  -tls          TLS tests
  -prf          PRF tests
  -hash         hash test
  -makecert     certificate issuing test
  -certprop     show certificate properties
  -rc           verify pkcs#10/certificate signature
  -cmsenclow    CMS low level message encryption/decryption test
  -sfse         simplified level message SignedAndEnveloped test
  -stress       stress test for Acquire/ReleaseContext
  -ep           public key export test
  -enum         CSP parameters enumeration
  -cpenc        CP/Crypto level (advapi32) encryption tests
  -setpp        SetProvParam tests
  -perf         Performance tests
  -speed        Speed tests and optimal function mask setting
  -testcont     Install/Uninstall test containers
  -install      CSP installation information, clearing out CSP
  -version      Print CSP version

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

csptest -sfsign

выдаст

<commands>:
  -sign             Sign data from input filename
  -verify           Verify signature on data specified by input filename
  -help             Print this help
<options>:
  -in <file>        Input filename to be signed or verified
  -out <file>       Output PKCS#7 filename
  -my <DName>       Cert from CURRENT_USER store to process data
  -MY <DName>       Cert from LOCAL_MACHINE store to process data
  -detached         Deal with detached signature
  -add              Add sender certificate to PKCS#7
  -signature <file> Detached signature file
  -alg     Hash algorithm: SHA1, MD5, MD2, GOST - default
  -ask              Acquire csp context using my cert (default: none)
  -base64           Input/output with base64<->DER conversion
  -addsigtime       Add signing time attribute
  -cades_strict     Strict signingCertificateV2 attribute generation
  -cades_disable    Disable signingCertificateV2 attribute generation

Таким образом, чтобы подписать файл через cmd средствами csptest.exe нужно вызвать команду:

csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович

где:
-my — Указывает владельца ключа;
-in — Указывает какой файл нужно подписывать. Если файл находится не в папке с csptest то нужно указывать полный путь.;
-out — Указывает имя файла подписи;

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

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

csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add

Если же нам нужна подпись в осоединенном формате, то добавим еще один параметр:

csptest -sfsign -sign -in Dogovor.doc -out Dogovor.doc.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add -detached

Примечание:Если подпись документа выполняется с ошибкой
Unable to open file
An error occurred in running the program.
.\signtsf.c:321:Cannot open input file.
Error number 0x2 (2).
Не удается найти указанный файл.
при вызове, как в последнем примере, и Вы уверены в правильности путей в параметре -in и -out, попробуйте создать подпись по первому примеру, а после выполнить команду с полным набором параметров!!!

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

chcp 1251
set CurPath=%cd%
cd C:\Program Files\Crypto Pro\CSP
call csptest -sfsign -sign -in %CurPath%\Secret.txt -out %CurPath%\Secret.txt.sig -my ООО МоиПрограммы Иванов Иван Иванович -addsigtime -add -detached
cd %CurPath%

Нажимаем «Файл» -&gt; «Сохранить как» -&gt; ЗадаемИмя с .bat -&gt; «Сохранить»
Собсвенно и все. Для справки:
chcp 1251 — Задает кодировку для CMD. Необходимо для валидной обработки русских букв в коде;
set CurPath=%cd% — Сохраняет путь текущей директории CMD в переменную CurPath;
cd — Задает текущий путь CMD;
call — Запускает программу;

Данный раздел определяет последовательность действий при разворачивании и настройке
экземпляра Сервиса Проверки Подписи (КриптоПро SVS).

После завершения выполнения действий, описанных в данном разделе, веб-интерфейс Сервиса Проверки
Подписи будет доступен по следующему адресу:

Программный интерфейс Сервиса Проверки Подписи будет доступен по следующему адресу:

Примечание

Базовая последовательность шагов по настройке (обязательные)

1. Создание экземпляра службы.

New-VsInstance -DisplayName SVS -ApplicationName verify -SiteName "Default Web Site"

2. Ввод лицензии.

New-VsLicense [–DisplayName <string>] [–SN <string>] [-CompanyName <string>]
Примечание

При вызове команды без параметров активируется временная лицензия на 3 месяца.

Примечание

Вызов командлета необходим при создании каждого нового экземпляра Сервиса Проверки
Подписи.

3. Установка корневых сертификатов и CRL.

При разворачивании экземпляра Сервиса Проверки Подписи автоматически будут созданы хранилища сертификатов с именами
-TSL и -Ca, где – имя веб-приложения,
указанное в командлете New-VsInstance в параметре -ApplicationName.

4. Настройка привязок веб-сервера IIS.

Disable-VsEndpoint –Name BasicHttps

Подробнее о передаче данных по безопасному соединению:

Опциональные настройки:


<!–

Веб-интерфейс Сервиса Проверки Подписи можно интегрировать в Веб-интерфейс КриптоПро DSS. Для добавления
страниц проверки подписи и сертификата в Веб-интерфейс подписи необходимо задать адрес Сервиса Проверки Подписи через
командлет [Set-DssFeProperties](../../../adminguide/frontend/cmdlets/Set-DssFeProperties.md).

Пример команды:

“`PowerShell
Set-DssFeProperties –VsAddress http://localhost//rest/api
“`

> [!NOTE]
> Если используется Сервис Проверки Подписи версии ниже, чем 2.0.2636, командлет должен выглядеть примерно следующим
> образом:
> “`PowerShell
> Set-DssFeProperties –VsAddress http://localhost//service.svc
> “`

–>

Дополнительно можно выполнить следующие настройки.

Полный список командлетов администрирования КриптоПро SVS

Пример настройки КриптоПро SVS


# Создание экземпляра SVS
New-VsInstance -DisplayName SVS -ApplicationName verify -SiteName "Default Web Site"

# Ввод временной лицензии на 3 месяца
New-VsLicense

# Установка онлайн-режима проверки статуса сертификатов при помощи службы OCSP
Set-VsProperties -RevocationMode Online

# Ограничение набора форматов подписи, доступных для проверки - отключение проверки необработанной подписи ГОСТ Р 34.10-2012
Set-VsSignatureFormat -Format GOST3410 -IsEnabled 0

# Сопоставление расширений файлов с форматами подписи - установка списка расширений для подписи формата CMS
Set-VsSignatureFormat -Format CMS -Extensions sig, p7b, p7s

# Отображение документов в веб-интерфейсе SVS
Add-VsConverterPlugin -FileExtension pdf -Assembly DSS.DocumentConverter.PdfStub.dll
Add-VsConverterPlugin -FileExtension doc -Assembly DSS.DocumentConverter.Word.dll 
Add-VsConverterPlugin -FileExtension dot -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension docm -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension dotm -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension docx -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension dotx -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension FlatOpc -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension FlatOpcMacroEnabled -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension FlatOpcTemplate -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin –FileExtension FlatOpcTemplateMacroEnabled -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension xml -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension odt -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension ott -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension ooxml -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension WordML -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension rtf -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension html -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension xhtml -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension mhtml -Assembly DSS.DocumentConverter.Word.dll
Add-VsConverterPlugin -FileExtension txt -Assembly DSS.DocumentConverter.Word.dll

# Ограничение размера документов в 10 Мбайт
Set-VsEndpointGlobalSettings -MaxMessageSize 10240

# Настройка проверки формата сертификатов
# Регистрация плагина
Add-VsCertificateVerifierPlugin -Assembly SVS.CertificateVerifier.Qualified.dll
# Добавление отпечатков корневых сертификатов Минцифры РФ
Add-VsQualifiedCAThumbprints -Thumbprint 4bc6dc14d97010c41a26e058ad851f81c842415a
Add-VsQualifiedCAThumbprints -Thumbprint aff05c9e2464941e7ec2ab15c91539360b79aa9d

# Настройка шаблона отчета о пакетной проверке подписи
Set-VsProperties -WordFilePath "C:\Program Files\Crypto Pro\DSS\VerificationService\smp_template.docx"
Set-VsProperties -XsltFilePath "C:\Program Files\Crypto Pro\DSS\VerificationService\smp_xslt.xslt"
Restart-VsInstance

Вопросы и ответы

КриптоПро ЭЦП browser plug-in (он же КриптоПро CADESCOM или Кадеском) – плагин, необходимый для создания и проверки электронной подписи на web-страницах с использованием КриптоПро CSP. Используется для работы на торговых площадках и порталах. Дистрибутив доступен на сайте КриптоПро в разделе Продукты / КриптоПро ЭЦП Browser plug-in http://www.cryptopro.ru/products/cades/plugin/get_2_0.

Системные требования

  • Установка плагина возможна на следующих операционных системах:  Win XP SP3, Win Vista SP2, Win 2003 SP2, Win 2008 SP2, Win 7, Win 2008 R2, Win 8, Win8.1, Win10.
  • Работает с браузерами: IE 8 — 11, Opera, Mozilla Firefox, Google Chrome, Yandex Browser

Не работает в браузере EDGE, предустановленном по умолчанию в Windows 10.

  • Требуется предустановленная КриптоПро CSP версии не ниже 3.6 R2

Features

  • CryptoPro TLS supports the TLS (SSL) protocol of on all platforms.
  • CryptoPro CSP can be used  with the Oracle E-Business Suite, Oracle Application Server, Java and Apache applications, via the products of the Crypto-Pro company partners.
  • Supports windows domain authentication using smart cards (USB tokens) and X.509 certificates.
  • The usage of CryptoPro CSP in email applications, as well as in MS Word and Excel products.
  • CryptoPro CSP  includes a kernel mode driver for all platforms, which allows for the use of cryptographic functions (encryption/decryption, signing , hashing) in kernel mode applications.
  • The private keys can be stored in various type of mediums, such as HDD, smart cards etc.

Особенности некоторых браузеров по настройке работы плагина

  • в Mozilla Firefox 29 и выше: необходимо включить работу плагина (браузер может не запросить разрешения на включение плагина). Для этого пройти диагностику и выполнить фикс «Включение плагинов в Mozilla Firefox», после чего обязательно перезапустить Firefox. Также это можно сделать вручную: нажать Ctrl+Shift+A, перейти в раздел «Плагины», выбрать CryptoPro CAdES NPAPI Browser Plug-in и перевести его в состояние «Всегда включать» (Always active), после чего обязательно перезапустить Firefox.
  • в Google Chrome необходимо зайти по ссылке и установить расширение.
  • В Yandex Browser и Opera нужно установить расширение, доступное по этой ссылке
  • В Internet Explorer необходимо сделать следующие настройки:
  1. Добавить адрес сайта, на котором работаете с плагином, в надёжные узлы (Свойства браузера / безопасность / надёжные сайты / сайты / добавить адрес сайта).
  2. Если работа ведётся в Internet Explorer 11, то попробовать работу в режиме совместимости.
  3. Проверить, что адрес сайта добавлен в надёжные узлы плагина (большинство сайтов, принимающих сертификаты нашего УЦ, можно добавить автоматически с помощью диагностики https://help.kontur.ru/uc). Чтобы проверить, что сайт добавлен в надежные узлы плагина, нужно перейти в Пуск — Все программы — КРИПТО-ПРО – Настройки КриптоПро ЭЦП Browser plug-in. Откроется окно браузера, в котором нужно будет позволить разблокировать все содержимое страницы/разрешить доступ. 

Была ли полезна информация?

Не нашли ответ? 
Задайте вопрос специалисту

Спасибо за ответ

Теоритическая часть.

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

Все ключи крипто про хранит в своих хранилищах, таких как root, ca, my. Чтобы в них загрузить сертификат в поставке Криптопро CSP идет специальная утилита certmgr. Синтаксих ее работы таков:

certmgr -inst -store <имя хранилища> -file <файл с сертификатом>

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

certmgr -instl -crl -store <имя хранилища> -file <CRL файл>

Побробную информацию по работе этой утилиты можно получить вызвав:

certmgr -help

Для конкретного сертификата также можно проверить цепочку. Делается это командой:

cryptcp -verify -f <файл сертификата> "text" -errchain

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

Из всего вышесказанного я подумал, что в библиотеке мне нужны будут следующие функции:

  • Загрузка сертификата в хранилище;
  • Загрузка файла отозванных сертификатов;
  • Постороение цепочки сертификата;
  • Проверка подписи.

Реализация взаимодействия с КриптоПро CSP на C.

Так как КриптоПро CSP(CPCSP) является доработкой CryptoApi от Microsoft, то большая часть примеров из официальной документации подходит идля “КриптоПро”. Чем я собствеено говоря и пользовался при написании модуля, так как с примерами у самого КриптоПро не очень все хорошо.

Загрузка сертификата в хранилище.

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

  1. Считать сертификат из файла
  2. Открыть хранилище сертификатов
  3. Положить в него сертификат
  4. Закрыть хранилище

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

typedef struct CERT {
    BYTE *content;
    DWORD size;
} CERT;

CERT readFile(char *filename)
{
    CERT cert = {NULL, 0};
    FILE *fCert;

    fCert = fopen(filename, "r");
    if (fCert)
    {
		fseek(fCert, 0, SEEK_END);   
		cert.size = ftell(fCert);
		rewind(fCert);

	    cert.content = (unsigned char *)malloc(cert.size * sizeof(unsigned char));
	    fread(cert.content, cert.size, 1, fCert);
    }
    else
    {
		perror("Error open certificate file");
    }
    fclose(fCert);

  return cert;
}

PCCERT_CONTEXT ReadCertificateFromFile(char *filename)
{
    CERT fileCert; 
    PCCERT_CONTEXT cert = NULL;

    fileCert = readFile(filename);
		
    cert = CertCreateCertificateContext(
		X509_ASN_ENCODING,
		fileCert.content,
		fileCert.size
	);
    
    if (!(cert))
    {
		perror("Error create cert");
    }

  return cert;
}

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

Далее в описании функций будут использоваться следующие коды ошибок:

# define OPERATION_SUCCESS        0
# define OPEN_STORE_ERROR         1
# define ADD_CERT_TO_STORE_ERROR  2
# define CLOSE_STORE_ERROR        3
# define ADD_CRL_TO_STORE_ERROR   4
# define STR_TO_BIN_LEN_ERROR     5
# define STR_TO_BIN_CONTENT_ERROR 6
# define VERIFY_MSG_SIGNATURE     7
# define GET_CERT_CHAIN_ERROR     8
# define READ_CERT_ERROR          9
# define READ_CRL_ERROR           10

Функция загрузки сертификата в хранилище будет выглядеть следующим образом:

int LoadCertificateToSystemStore(char *cert_file_path, char *store_name)
{
    HCERTSTORE     cpcsp_cert_store = NULL;
    PCCERT_CONTEXT cert_context;

    cert_context = ReadCertificateFromFile(cert_file_path);
    if (!cert_context)
	return READ_CERT_ERROR;
  
    cpcsp_cert_store = CertOpenSystemStore(0, store_name);

    if (!cpcsp_cert_store)
	return OPEN_STORE_ERROR;

    if (!CertAddCertificateContextToStore(
	    cpcsp_cert_store,
	    cert_context,
	    CERT_STORE_ADD_REPLACE_EXISTING,
	    NULL))
	return ADD_CERT_TO_STORE_ERROR;

    if (!CertCloseStore(cpcsp_cert_store, 0))
	return CLOSE_STORE_ERROR;

    if (cert_context)
	CertFreeCertificateContext(cert_context);

    return OPERATION_SUCCESS;
}

В этой функции считывается файл сертификата (функция ReadCertificateFromFile), затем открываем системное хранилище методом CertOpenSystemStore. Если системное хранилище открылось успешно, то с помощью метода CertAddCertificateContextToStore, сертификат загрузается в хранилище. И в заключении хранилище закрывается функцией CertCloseStore.

Нужно отметить что функция CertOpenSystemStore ипользуется только для чтения системных хранилищ (root, ca, my), для остальных надо использовать CertOpenStore.

Загрузка файла отозванных сертификатов.

Функции чтения списка отозванных сертификатов(CRL) и загрузки их в хранилище идентичны функциям работы с сертификатами, за тем исключением, что для их чтения и загрузки используются функции CPCSP c CRL вместо Certificate в названии функции. Например CertAddCertificateContextToStore будет выглядеть как CertAddCRLContextToStore.

Таким образом код для загруки CRL будет таким:

int LoadCRLToSystemStore(char *cert_file_path, char *store_name)
{
    HCERTSTORE    cpcsp_cert_store = NULL;
    PCCRL_CONTEXT crl_context;

    crl_context = ReadCRLFromFile(cert_file_path);
    if (!crl_context)
	return READ_CRL_ERROR;
  
    cpcsp_cert_store = CertOpenSystemStore(0, store_name);

    if (!cpcsp_cert_store)
	return OPEN_STORE_ERROR;

    if (!CertAddCRLContextToStore(
	    cpcsp_cert_store,
	    crl_context,
	    CERT_STORE_ADD_REPLACE_EXISTING,
	    NULL))
	return ADD_CRL_TO_STORE_ERROR;

    if (!CertCloseStore(cpcsp_cert_store, 0))
	return CLOSE_STORE_ERROR;

    if (crl_context)
	CertFreeCRLContext(crl_context);

  return OPERATION_SUCCESS;
}

Постороение цепочки сертификата.

Код функции проверки цепочки сертификатов выглядит следующим образом

int VerifyCertChain(char *certFilePath)
{
    PCCERT_CONTEXT           pCertContext;
    PCCERT_CHAIN_CONTEXT     pChainContext;
    CERT_ENHKEY_USAGE        EnhkeyUsage;
    CERT_USAGE_MATCH         CertUsage;
    CERT_CHAIN_PARA          ChainPara;

    /*
      инициализация парметров поиска и сопоставления, которые 
      будут использоваться для построения цепочки сертификатов 
    */
    EnhkeyUsage.cUsageIdentifier = 0;
    EnhkeyUsage.rgpszUsageIdentifier = NULL;
    CertUsage.dwType = USAGE_MATCH_TYPE_AND;
    CertUsage.Usage  = EnhkeyUsage;
    ChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
    ChainPara.RequestedUsage=CertUsage;
 
    pCertContext = ReadCertificateFromFile(certFilePath);

    if (!CertGetCertificateChain(
	    NULL,
	    pCertContext,
	    NULL,
	    NULL,
	    &ChainPara,
	    0,
	    NULL,
	    &pChainContext))
    {
		perror("The chain could not be created");
    }
	
	int result = pChainContext->TrustStatus.dwErrorStatus;

    if (pChainContext)
    {
		CertFreeCertificateChain(pChainContext);
    }
	
    return result;
}

Помимо настроек цепочки, тут вызывается функция CertGetCertificateChain, которая формирует собственно цепочку сертификатов и записывает ее в структуру PCCERT_CHAIN_CONTEXT. В данной структуре поле TrustStatus отвечает за статус опреации, если цепочка построена корректно, то dwErrorStatus будет 0, иначе будет записан код ошибки.

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

Для начала я подумал сорфировать самоподписной сертификат для проверки функционирования функции, но оказалось, что CPCSP не поддерживает их, поэтому я создал сертификат в Тестовом УЦ КриптоПро. Я не буду описывать данный процесс, так как к библиотике он имеет посредственное отношение. Только скажу, что файл подписи я генерировал под Windows, потому как это было проще сделать через КриптоПро ЭЦП Browser plug-in.

Также надо отметить, что сертификат ЦС, надо загрузить в хранилище “Доверенные корневые…”. Иначе сгенерированный тестовый сертификат не установиться и плагин для ЭЦП не будет корректно работать. Код функции проверки подписи приведен ниже:

int VerifySignedMessage(char *signature)
{
    DWORD blob_size = 0;
    /* 
       определяем размер выходного der блоба
       для подписанного сообщения
    */
    if (!CryptStringToBinaryA(
	    signature,
	    strlen(signature),
	    CRYPT_STRING_BASE64,
	    NULL,
	    &blob_size,
	    NULL,
	    NULL))
	return STR_TO_BIN_LEN_ERROR;	


    /*
       заполняем блоб подписанного сообщения
     */
    BYTE *msg_blob;
    msg_blob = (BYTE *)malloc(blob_size);
    if (!CryptStringToBinaryA(
	    signature,
	    strlen(signature),
	    CRYPT_STRING_BASE64,
	    msg_blob,
	    &blob_size,
	    NULL,
	    NULL))
	return STR_TO_BIN_CONTENT_ERROR;	

    /*
      выполняем проверку подписи
     */
    CRYPT_VERIFY_MESSAGE_PARA verify_params;

    verify_params.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
    verify_params.dwMsgAndCertEncodingType = ENCODING_TYPE;
    verify_params.hCryptProv = 0;
    verify_params.pfnGetSignerCertificate = NULL;
    verify_params.pvGetArg = NULL;
    
    if(!CryptVerifyMessageSignature(
        &verify_params,
        0,
        msg_blob,
        blob_size,
        NULL,
        NULL,
        NULL))
	return VERIFY_MSG_SIGNATURE;
    
    return OPERATION_SUCCESS;
}

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

Также надо отметить что функция CryptStringToBinaryA вызывается 2 раза, первый для получения размер подписи, а второй, чтобы получить данные раскодированные из base64 данные. Ну и затем подпись соответственно проверяется.

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

#ifdef __linux__
	#include <Python.h>
#elif __APPLE__
	#include <Python/Python.h>
#endif

#ifndef LIBSIGNATURE_H_
#define LIBSIGNATURE_H_

/* 
   Список экспортируемых функций
 */
PyObject * PyLoadCertificate(PyObject *self, PyObject *args);
PyObject * PyLoadCRL(PyObject *self, PyObject *args);
PyObject * PyVerifyCertChain(PyObject *self, PyObject *args);
PyObject * PyVerifySignedMessage(PyObject *self, PyObject *args);

/*
  Типы исключений различных ситуаций
 */
extern PyObject *PyOpenStoreError;
extern PyObject *PyAddCertToStoreError;
extern PyObject *PyCloseStoreError;
extern PyObject *PyAddCrlToStoreError;
extern PyObject *PyStrToBinLenError;
extern PyObject *PyStrToBinContentError;
extern PyObject *PyVerifyMsgSignatureError;
extern PyObject *PyGetCertChainError;
extern PyObject *PyReadCertError;
extern PyObject *PyReadCrlError;

#endif

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

Код оберки для библиотеки выглядит следующим образом:

#include <stdio.h>
#include "libsignature.h"

// Таблица методов реализуемых расширением
// название, функция, параметры, описание
static PyMethodDef LibsignatueMethods[] = {
    {"load_certificate",  PyLoadCertificate, METH_VARARGS, NULL},
    {"load_crl",  PyLoadCRL, METH_VARARGS, NULL},
    {"verify_chain_certificate",  PyVerifyCertChain, METH_VARARGS, NULL},
    {"vefigy_signature",  PyVerifySignedMessage, METH_VARARGS, NULL},
    {NULL, NULL,  0, NULL}
};

PyObject *PyOpenStoreError;
PyObject *PyAddCertToStoreError;
PyObject *PyCloseStoreError;
PyObject *PyAddCrlToStoreError;
PyObject *PyStrToBinLenError;
PyObject *PyStrToBinContentError;
PyObject *PyVerifyMsgSignatureError;
PyObject *PyGetCertChainError;
PyObject *PyReadCertError;
PyObject *PyReadCrlError;

// Инициализация
PyMODINIT_FUNC initlibsignature(void)
{
    PyObject *m;

    // Инизиализруем модуль libsignature
    m = Py_InitModule("libsignature", LibsignatueMethods);
    if (m == NULL)
        return;

    // Создание исключений при работе с расширением
    PyOpenStoreError = PyErr_NewException("libsignature.OpenStoreError",
	NULL,
	NULL
	);
    PyAddCertToStoreError = PyErr_NewException(
	"libsignature.AddCertToStoreError",
	NULL,
	NULL
	);
    PyCloseStoreError = PyErr_NewException(
	"libsignature.CloseStoreError",
	NULL,
	NULL
	);
    PyAddCrlToStoreError = PyErr_NewException(
	"libsignature.AddCRLToStoreError",
	NULL,
	NULL
	);
    PyStrToBinLenError = PyErr_NewException(
	"libsignature.StrToBinLenError",
	NULL,
	NULL
	);
    PyStrToBinContentError = PyErr_NewException(
	"libsignature.StrToBinContentError",
	NULL,
	NULL
	);
    PyVerifyMsgSignatureError = PyErr_NewException(
	"libsignature.VerifySignError",
	NULL,
	NULL
	);
    PyGetCertChainError = PyErr_NewException(
	"libsignature.ChainCertError",
	NULL,
	NULL
	);
    PyReadCertError = PyErr_NewException(
	"libsignature.ReadCertError",
	NULL,
	NULL
	);
    PyReadCrlError = PyErr_NewException(
	"libsignature.ReadCRLError",
	NULL,
	NULL
	);

    Py_INCREF(PyOpenStoreError);
    Py_INCREF(PyAddCertToStoreError);
    Py_INCREF(PyCloseStoreError);
    Py_INCREF(PyAddCrlToStoreError);
    Py_INCREF(PyStrToBinLenError);
    Py_INCREF(PyStrToBinContentError);
    Py_INCREF(PyVerifyMsgSignatureError);
    Py_INCREF(PyGetCertChainError);
    Py_INCREF(PyReadCertError);
    Py_INCREF(PyReadCrlError);

    PyModule_AddObject(m, "error", PyOpenStoreError);
    PyModule_AddObject(m, "error", PyAddCertToStoreError);
    PyModule_AddObject(m, "error", PyCloseStoreError);
    PyModule_AddObject(m, "error", PyAddCrlToStoreError);
    PyModule_AddObject(m, "error", PyStrToBinLenError);
    PyModule_AddObject(m, "error", PyStrToBinContentError);
    PyModule_AddObject(m, "error", PyVerifyMsgSignatureError);
    PyModule_AddObject(m, "error", PyGetCertChainError);
    PyModule_AddObject(m, "error", PyReadCertError);
    PyModule_AddObject(m, "error", PyReadCrlError);
}

Что делается в этом файле подробно описано здесь.

Для проверки работоспособности питоновской библиотеки, напишем следующий тест:

import libsignature


class TestLibSignature(unittest.TestCase):
    """
    Класс для тестирования работы с КриптоПро CSP.
    """
    def setUp(self):
        """
        Задание путей до тестовых файлов
        """
        self._cert_file = os.path.join(current_path, "files/ca.cer")
        self._crl_file = os.path.join(current_path, "files/ca.crl")
        self._user_cert = os.path.join(current_path, "files/user.cer")
        self._sig_file = os.path.join(current_path, "files/test_sign.sig") 
        self._store = "ROOT"

    def test_load_certificate(self):
        """
        Проверка загрузки сертификата.
        """
        result = libsignature.load_certificate(self._cert_file, self._store)
        self.assertIsNone(result)

    def test_load_crl(self):
        """
        Проверка загрузки списка отозванных серитификатов.
        """
        result = libsignature.load_crl(self._crl_file, self._store)
        self.assertIsNone(result)

    def test_verify_cert_chain(self):
        """
        Проверка корректности цепочки сертификатов
        """
        result = libsignature.verify_chain_certificate(self._user_cert)
        self.assertIsNone(result)

    def verify_signature(self):
        """
        Проверка подписи сообщения
        """
        with open(self._sig_file, "rb") as sigfile:
            signature = sigfile.read()
            result = libsignature.vefigy_signature(signature)
            self.assertIsNone(result)


if __name__ == '__main__':
    unittest.main()

Теперь все готово, и можно запусть команду make test для проверки работоспособности.

Implementation of CryptoPro CSP

The hierarchical architecture of the Cryptographic Functions in the Windows Operating System allows for the use of the Russian cryptographic algorithms implemented in CryptoPro CSP at all possible levels.

Implementation at the Crypto API 2. 0 Level

CryptoPro CSP can be used in application software (as can any other cryptoprovider supplied with the Windows operating system) using the Crypto API 2.0 interface, a detailed description of which is provided in the MSDN (Microsoft Developer Network) program documentation. In such cases the method for selecting the algorithm for the application software can be determined by the user’s/sender’s public-key-algorithm identifier which is contained in the X.509 certificate.

Implementation at the Crypto API 2.0 level provides the ability to use a wide range of functions which solve most problems related to the presentation (formats) of various cryptographic communications (signed, encrypted) by means of the presentation of public keys as digital certificates and by means of the storage and retrieval of certificates in various directories including LDAP.

The functions of CryptoPro CSP allow for the full implementation of presentation and exchange of data in compliance with international recommendations and the Public Key Infrastructure.

Implementation at the CSP Level

CryptoPro CSP can be used directly in an application program by loading the module using the Load Library function. With this in mind the package includes a Programmer’s Manual describing the various sets of functions and the test software. With this type of implementation only a limited set of low-level cryptographic functions corresponding to the Microsoft CSP interface are accessible to the software.

Using Com Interfaces

CryptoPro can be used with COM interfaces developed by Microsoft.

  • CAPICOM 2.0
  • Certificate Services
  • Certificate Enrollment Control

Certificate Enrollment Control

The COM interface Certificate Enrollment Control (implemented in the file xenroll.dll) is designed for the use of a limited number of Crypto API 2.0 functions related to key generation, certificate requests and the processing of certificates received from the Certification Authority using the programming languages Visual Basic, C++, Java Script, VBScript and the development environment Delphi.

It is this interface that is used by the various Certification Authorities (Versign, Thawte, ect.) in the producing of user certificates on the Windows platform.

CAPICOM 2

CAPICOM (implemented in the file capicom.dll) offers the COM interface that uses the primary functions of CryptoAPI 2.0 . This component is an extension of the existing COM Certificate Enrollment Control interface (xenroll.dll) which is implemented by the client functions responsible for key generation, certificate requests and interchange with the certification authority.

With the release of this component the use of digital-signature generation and verification functions, functions responsible for the construction and verification of sequences of certificates and functions responsible for interaction with different directories (including the Active Directory) with Visual Basic, C++, JavaScript, VBScript and the development environment Delphi became possible. Using CAPICOM it is possible to implement the operation of the “thin” client within the browser Internet Explorer’s interface.

The component CAPICOM is freeware and is included as part of the Micrsoft Platform SDK Developer’s redistributable toolbox.

More detailed information on the CAPICOM interface is available on the server https://www.cryptopro.ru/products/csp/usage. The distributive for the interface and sample applications are available in the CD in the directory “\REDISTR\CAPICOM 2.0”

Certificate Services

Certificate Services include several COM interfaces which allow the user to alter the functionality of the Certification Authority built-in to the Windows Server operating system. Using these interfaces it is possible to:

  • Process certificate requests from users.
  • Alter the composition of X.509 addendums recorded in certificates issued by the authority.
  • Determine additional means of publication (storage) of certificates issued by the authority.

Using TLS Protocol in Application Software

Aside from its use in the Internet Explorer interface, the TLS protocol can also be used by application software along with CryptoPro CSP for the authentication and protection of data transmitted according to its own private protocols based on TCP/IP and HTTPS.

For the implementation of the TLS protocol WebClient and WebServer sample implementations are included in the set of samples provided with the platform SDK.

Sample Applications of Cryptographic Security Tools

Test software, including sample invocations of the primary functions of Crypto API 2.0 is provided with CryptoPro CSP. These samples are found in the directory (“\SAMPLES\csptest”). A large number of sample applications of Crypto API 2.0, CAPICOM and Certificate Services functions are offered in the Microsoft Docs and in the Platform SDK developer’s toolbox.

A conference on issues surrounding the use of cryptographic functions and public-key certificates is held on the CryptoPro server (https://www.cryptopro.ru/forum2/).

CryptoPro CSP makes possible the use of reliable, certified cryptographic information-security tools as components of the wide range of tools and software of the Microsoft Corporation for the implementation of secure document flow and E-commerce based on the Public-Key infrastructure and in compliance with international recommendations X.509.

  • Printer-friendly versionPrinter-friendly version

Certificates

CryptoPro CSP has a Federal Security Service certificate of conformance.

Integration

The integration of the CryptoPro CSP with MS Windows operating system allows the use of standard products.

The accordance with the Microsoft CSP interface allows for easy integration into applications by different vendors, which support this interface.

Support for  digitally signed  XML documents using XMLdsig for Windows (MSXML5, MSXML6) allows for the use of Russian cryptographic algorithms in the Microsoft Office InfoPath – a component system of Microsoft Office.

Portability

For easy and portable integration of cryptographic functions on the Unix platforms, the program interface similar to the Microsoft CryptoAPI 2.0 specifications is provided. This interface allows for the use of the high-level functions to create cryptographic messages (encryption, digital signature), building and verifying the chain of certificates, generating keys and processing the messages and certificates.

Заключение.

Процесс создания библиотеки получился трудоемкий, но на выходе получилась рабочая библиотека, которой можно пользоваться. В репозиотории можете найти пакет для работы из python, но также можно использовать только C-ную часть. Для работы С библиотеки нужно выполнить make build_c.

Читайте также:  Где и как получить ЭЦП для торгов по 44-ФЗ
Оцените статью
ЭЦП Эксперт
Добавить комментарий