prostomav Оставлено | |
Добрый день Проверку осуществляем функцией VerifyCades, которая возвращает следующую ошибку: “-2146762495 – Истек/не наступил срок действия требуемого сертификата при проверке по системным часам или по отметке времени в подписанном файле.”. При попытки игнорирования данной ошибки и последующем получении данных из подписи – ничего не возвращается. Подскажите, насколько это корректно? Ведь на момент подписания сертификат был действующим. Логичнее было б данную ошибку сделать предупреждением с возвращением корректного результат функцией VerifyCades. | |
Санчир Момолдаев Оставлено | |
Добрый день | |
Artem Vasilev Оставлено | |
Собрал модуль для php 7.4 с последним сертифицированым дитрибутивом КриптоПРО 5 (5.0.12000) Цитата: Aborted (core dumped) Захожу и удаляю в коде установку штампа времени. Запускаю снова – подписалось, хэш на экране есть, а следом Цитата: munmap_chunk(): invalid pointer Ошибка возникает в месте вызова метода VerifyCades(); Операционная система: Цитата: LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch | |
Artem Vasilev Оставлено | |
Добавлю информации Удалил все корневые и промежуточные сертификаты, которые ставил Поставил сертификаты отсюда: http://q20.cryptopro.ru/ Дополнительно поставил сертификат CRYPTO-PRO Test Center 2 В результате перестал получать даже подпись. Скрипт проверки падает в ошибку Segmentation fault (core dumped) или munmap_chunk(): invalid pointer Через раз UPD: Не хватало одного сертификата. Поставил и ошибка “Segmentation fault (core dumped)” вернулась Попробовал включить лог Код:
Вывод journalctl -f: Отредактировано пользователем 25 ноября 2021 г. 18:23:47(UTC) | |
Санчир Момолдаев Оставлено | |
| |
Artem Vasilev Оставлено | |
Автор: Санчир Момолдаев Спасибо! Да, действительно, “подсунуть” системный libcurl помогло Для потомков: В Almalinux нужно проверить наличие libcurl, в принципе Код:
Если в выдаче есть /usr/lib64/libcurl.so, то всё “ок” Код:
Дальше прописываем в конфиг КриптоПро путь к этой библиотеке Код:
Подозреваю, что данный метод будет работать на всех RHEL 8 совместимых системах | |
Kokosjan Оставлено | |
Доброго времени суток! Как правильно проверить отделенную подпись с использованием библиотеки pycades? Отредактировано пользователем 26 июля 2022 г. 9:56:36(UTC) | |
Андрей * Оставлено | |
Здравствуйте. Указать, что данные закодированы в base64, | |
Андрей * Оставлено | |
Kokosjan Оставлено | |
Пробовал передавать значения в base64. При валидации получаю ошибку Exception: Internal error. (0x8009200E) Вот такой код: import pycades signedata = pycades.SignedData() data = open(“report.pdf”,”rb”).read() sgn = open(“report.pdf.sig”,”rb”).read() signedata.Content = encd.decode(‘utf-8’) signedata.VerifyCades(encs.decode(‘utf-8’), pycades.CADESCOM_CADES_DEFAULT, True) | |
Kokosjan Оставлено | |
Насолько я понимаю, ошибка имеет расшифровку The signed cryptographic message does not have a signer for the specified signer index. | |
Андрей * Оставлено | |
Автор: Kokosjan Насолько я понимаю, ошибка имеет расшифровку The signed cryptographic message does not have a signer for the specified signer index. Перечисление CADESCOM_CADES_TYPE Если указать CADESCOM_CADES_BES – ошибка есть? | |
Андрей * Оставлено | |
encs.decode(‘utf-8’) – зачем? | |
Андрей * Оставлено | |
+ проверить, что report.pdf.sig – бинарный, вероятно, он уже закодирован в base64? Если закодирован – не нужно повторно кодировать… | |
Kokosjan Оставлено | |
Цитата: Если указать CADESCOM_CADES_BES – ошибка есть? Да, ошибка та же самая Цитата: encs.decode(‘utf-8’) – зачем? VerifyCades в качестве первого аргумента принимает только строку, таким образом массив в base64 из типа bytes перевожу в str Цитата: + проверить, что report.pdf.sig – бинарный, вероятно, он уже закодирован в base64? Если закодирован – не нужно повторно кодировать… Не похоже на base64 | |
Андрей * Оставлено | |
b64encode разве не строку возвращает? | |
Kokosjan Оставлено | |
Санчир Момолдаев Оставлено | |
код правильный. проблема в самой подписи. | |
Kokosjan Оставлено | |
Автор: Санчир Момолдаев код правильный. проблема в самой подписи. Создал заявку – #58398 | |
<?php
namespace
CProCSP
/**
* Глобальные константы тип усовершенствованной подписи, например для CPSignedData::VerifyHash
* @var int CADES_BES Тип подписи CAdES BES
* @var int CADES_DEFAULT Тип подписи по умолчанию (CAdES-X Long Type 1)
* @var int CADES_T Тип подписи CAdES T
* @var int CADES_X_LONG_TYPE_1 Тип подписи CAdES-X Long Type 1
*/
const
CADES_BES
0x01
const
CADES_DEFAULT
0x00
const
CADES_T
0x05
const
CADES_X_LONG_TYPE_1
0x5D
/**
* Глобальные константы тип кодировки контента, например для CPSignedData::Sign
* @var int ENCODE_ANY Data is saved as a base64-encoded string or a pure binary sequence.
* This encoding type is used only for input data that has an unknown encoding type. Introduced in CAPICOM 2.0.
* @var int ENCODE_BASE64 Data is saved as a base64-encoded string.
* @var int ENCODE_BINARY Data is saved as a pure binary sequence.
*/
/*const ENCODE_ANY = 0xffffffff;
const ENCODE_BASE64 = 0;
const ENCODE_BINARY = 1;*/
/**
* Глобальные константы тип проверки подписи, например для CPSignedData::Verify
* @see https://msdn.microsoft.com/en-us/library/aa375740.aspx
* @var int VERIFY_SIGNATURE_ONLY Проверка только подписи.
* @var int VERIFY_SIGNATURE_AND_CERTIFICATE Проверка подписи и сертификата на основании которого создана подпись.
*/
const
VERIFY_SIGNATURE_ONLY
0
const
VERIFY_SIGNATURE_AND_CERTIFICATE
1
/**
* Только описание! Для автокомплитов IDE и справки
* CPSigners класс плагина предоставляет свойства и методы для работы с подписанным сообщением.
* Расширяет интерфейс объекта CAPICOM.SignedData .
*
* @see http://cpdn.cryptopro.ru/default.asp?url=content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data.html
* @see http://cpdn.cryptopro.ru/default.asp?url=content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data2.html
* @see http://cpdn.cryptopro.ru/default.asp?url=content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data3.html
* @see http://cpdn.cryptopro.ru/default.asp?url=content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data4.html
* @see http://cpdn.cryptopro.ru/default.asp?url=content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data5.html
*
* @package CProCSP
*/
class
CPSignedData
public
function
SignCades
/**
* Добавляет к сообщению усовершенствованную подпись.
*/
public
function
SignHash
/**
*
*/
public
function
CoSignHash
/**
* Создает подпись
* Creates a digital signature on the content to be signed.
* @see https://msdn.microsoft.com/en-us/library/aa387726.aspx
*
* @param CPSigner $signer
* @param boolean $bDetached If True, the data to be signed is detached;
* @param int $encodingType A value of the ENCODING_TYPE
*/
public
function
Sign
$signer
null
$bDetached
false
$encodingType
ENCODE_BASE64
/**
* Cosigns an already signed message.
* @see https://msdn.microsoft.com/en-us/library/aa387725.aspx
*
* @param CPSigner $signer
* @param int $encodingType A value of the CAPICOM_ENCODING_TYPE
*/
public
function
CoSign
$signer
null
$encodingType
ENCODE_BASE64
/**
*
*/
public
function
CoSignCades
/**
*
*/
public
function
EnhanceCades
/**
* Determines the validity of a signature or signatures.
* @param string $signedMessage A string that contains the signed message to be verified.
* @param boolean $bDetached If True, the data to be signed is detached
* @param int $verifyFlag A value of the CAPICOM_SIGNED_DATA_VERIFY_FLAG
*/
public
function
Verify
$signedMessage
$bDetached
false
$verifyFlag
/**
*
*/
public
function
VerifyCades
/**
* Проверяет усовершенствованную подпись на основе переданного хэш-значения.
*
* Метод VerifyHash позволяет проверить усовершенствованную подпись,
* в том числе и на соответствие заданому типу подписи.
* В отличие от метода VerifyCades, данный метод не проверяет соответствие хэш-значения каким-либо данным.
* Если в переданном сообщении присутствует подписанный атрибут messageDigest, то данный метод проверяет только
* соответствие хэш-значения в параметре Hash тому хэш-значению, которое содержится в атрибуте messageDigest.
*
* @param CPHashedData $hash
* @param string $signedMessage Проверяемое подписанное сообщение.
* @param int $cadesType Тип усовершенствованной подписи
*
* @throws \Exception Генерирует Ошибки в любом случае кроме успешной проверки
*/
public
function
VerifyHash
$hash
$signedMessage
$cadesType
CADES_DEFAULT
/**
*
*/
public
function
set_ContentEncoding
/**
* Данные которые будем подписывать
* Data to be signed. This property must be initialized before the Sign method is called.
* When the value of this property is reset, directly or indirectly, the whole state of the object is reset,
* and any signature that was associated with the object before the property was changed is lost.
*
* @param string $content данные
*/
public
function
set_Content
$content
/**
* Возвращает коллекцию подписантов подписи
* Retrieves the Signers collection that represents the signature creators of the data.
*
* @return \CProCSP\CPSigners
*/
public
function
get_Signers
/**
* Retrieves the Certificates collection of the signed data.
*/
public
function
get_Certificates
Pavel Bell Оставлено | |
Добрый день, у меня есть необходимость программно проверять присланные документы от Гос организации. Целевая ОС Ubuntu 20.04, язык Python. Установил и собрал все по инструкции https://docs.cryptopro.r…es/pycades/pycades-build Теперь как я понимаю нужно установить корневой сертификат? Если да, где его можно взять? | |
Pavel Bell Оставлено | |
Установил необходимые сертификаты и проверил. Я надеюсь, что для процедуры проверки подписи лицензию не надо покупать? Отредактировано пользователем 27 апреля 2022 г. 20:40:13(UTC) | |
Андрей * Оставлено | |
Автор: Pavel Bel Я надеюсь, что для процедуры проверки подписи лицензию не надо покупать? Не требуется, после истечения – будет проверять. | |
Pavel Bell Оставлено | |
Не получается почему то через pycades сделать проверку. Пока тупо в лоб пытаюсь делать так: Цитата: rtf = ‘notification_on.rtf’ hashedData = pycades.HashedData() sig = open(‘notification_on.rtf.sig’, ‘rb’) _signedData = pycades.SignedData() Exception: Internal error. (0x8009200E) Судя по коду ошибки это: The signed cryptographic message does not have a signer for the specified signer index. Что я не так делаю? | |
Андрей * Оставлено | |
Андрей * Оставлено | |
почему не используется VerifyCades? | |
Pavel Bell Оставлено | |
Андрей * Оставлено | |
В файле cms в der, там нет кодирования. Убрать декодирование из base64, получится вот так: Код:
проверяется? либо content передать в _signedData.Content | |
| |
Pavel Bell Оставлено | |
Спасибо за советы, вот что получается: Цитата: _signedData.VerifyHash(hashedData, str(signature), pycades.CADESCOM_CADES_BES) то Exception: Internal error. (0x8009100E) если через VerifyCades то Exception: Internal error. (0x8009100E) Ошибки одинаковые, в обоих случаях, но отличаются от предыдущей Пробовал разные декодирования, но они не проходят. | |
Андрей * Оставлено | |
str что делает? Функции или бинарные данные или base64(бинарные данные) принимают. | |
Pavel Bell Оставлено | |
Извините, не видел ответа, горячие дни наступили. Приведение типа bytes в строку Цитата: Функции или бинарные данные или base64(бинарные данные) принимают. Не принимают, возвращается must be str, not bytes Вот, что нашел про ошибку 0x8009100E: Цитата: При получении штампа времени через tsputil возвращается ошибка: Для проверки подписи штампа времени нужен сертификат службы штампов времени, которым этот штамп подписан. Пока сделал проверку просто через вызов cryptcp с параметрами. Для полноты картины — мне надо не просто проверить подпись, а проверить, что документ не был изменен “по дороге” и что подписан тем кем надо. Отредактировано пользователем 20 июня 2022 г. 8:08:54(UTC) | |
- 1 2015-05-13 08:00:53
- Тема: Lotus и КриптоПро
- 2 Ответ от admin 2015-05-13 08:02:58
- Re: Lotus и КриптоПро
- 3 Ответ от admin 2015-11-17 08:47:55
- Re: Lotus и КриптоПро
- vgoma / crypto-pro Goto Github PK
- crypto-pro’s Introduction
- cryptoPro
- Зачем мне этот пакет?
- Установка
- API
- Методы объекта cryptoPro
- Методы объекта сертификата
- Поддерживаемые СКЗИ
- Примеры
- Тэг script (UMD)
- Angular (ES Modules + Typescript)
- React (ES Modules + JavaScript)
- Миграция с версии 1 на 2
- Тем, кто хочет помочь
- Запуск режима разработки
- Запуск тестов
- Проверка работы примеров с React и Angular
- Проверка пакета перед публикацией в NPM
- Полезная информация
- Установка КриптоПРО CSP в Linux / OSX
- Установка КриптоПРО ЭЦП browser plugin в Linux
- Настройка плагина для Firefox (до версии 52)
- Установка сертификатов в Linux
- Лицензия
- Crypto-pro’s People
- crypto-pro’s Issues
- Поддержка установки через Bower
- Подписание файла в Angular
- Экспорт сертификата с приватным ключом
- XADES формат подписи
- Ошибка на production (Ошибка обработки сертификатов: t. Item is not a function)
- Пустой файл при извлечении из прикрепленной подписи
- Ошибка синтаксиса при подключении cryptopro на internet explorer
- Не получается подписать файл через createDetachedSignature
- Подпись нешифрованных документов
- Для чего здесь вычисляется hash по ГОСТ Р 34. 11-94 для строки: “abc” ?
- Синтаксическая ошибка internet explorer 10
- Создание открепленной подписи для файла
- Ошибка CSP “The parameter is incorrect (0x80070057)” на версии cades “2. 13642”
- Ошибка создание отсоединенной подписи
- Подписание в формате XADES
- Ошибка “Плагин недоступен” в консоли IE 11 и Chrome
- Проверка открепленной подписи и подписанного файла.
- Реализация CoSign планируется?
- Сборка проекта в минифицированной версии в одном файле
- Есть ли возможность подписать XML
- реализация подписи в браузере с помощью Angular
- Не видит сертификаты с USB накопителя
- Неверный тип возвращаемого значения getAlgorithm
- Почему подписать можно только base64
- Возвращать сообщения об ошибках с кодом
- Проверка подписи
- Вычисление hash
- КриптоПРО ЭЦП Browser Plug-In не доступен
- Отделенная подпись не создается.
- Возможно ли декодировать dataBase64 c помощью подписи?
- Контейнеры с сертификатами на носителях
- При попытке запустить билд приложения в ie, приложение крашится
- Запуск Angular примера в IE 11
- Валидация подписи
- метод getCertList не работает после минификации с помощью UglifyJs
- Планируются ли новые методы?
- Например
- Uncatched Exception in Promice (“The operation was canceled by the user. (0x000004C7)”)
- переход с createSignature на createAttachedSignature
- Ошибка при проверке подписи
1 2015-05-13 08:00:53
- admin
- Репутация : 0
Тема: Lotus и КриптоПро
Пробуем через COM подписывать в лотусскрипте данные с помощью Криптопро.
На форме: Что подписываем: – поле “tosign”ЭЦП: – поле “signpole”
Пример 1.Сначала пробуем получить сертификаты в Lotus через виндовый элемент управления CAPICOM.В этом варианте для юзера есть окошечко выбора сертификата.В конце уже присвоили элементу CAdESCOM сертификат из элемента CAPICOM.В данном примере юзер может выбирать сертификат.
Sub Click(Source As Button) ' через CAPICOM
Dim Signer As Variant ' кто подписывает
Dim Store As Variant ' хранилище сертификатов
Dim Certificates As Variant ' все сертификаты
Dim Certif As Variant ' поиск непросроч. сертификатов для выбора одного сертификата
Dim Build As Variant
Dim MySert As Variant ' один выбранный сертификат
Dim MySert1 As Variant ' один выбранный сертификат (Certificate object)
Dim privateKey As Variant
ProviderName$ = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"
'Set Signer = CreateObject("CAPICOM.Signer")
Set Store = CreateObject("CAPICOM.Store")
Build = Store.Open (2,"MY")
Set Certificates = Store.Certificates
'xxx = Certificates.Count
'xxx = Certificates.Select("123", "ВЫБЕРИ СЕРТИФИКАТ!") все сертификаты
Set Certif = Certificates.Find(9, Now)
Set MySert = Certif.Select("123", "ВЫБЕРИ СЕРТИФИКАТ!") ' непросроченные
Set MySert1 = MySert.Item(1)
Print "Сертификат для " + (MySert1.SubjectName)
Set privateKey = MySert1.PrivateKey
Print (privateKey.ProviderName)
'Set xxx = Signer.Load (MySert1)
' -----------------------------------------------------------------------------------------------
Dim oSigner As Variant
Set oSigner = CreateObject("CAdESCOM.CPSigner")
oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf"
Set oSigner.Certificate = MySert1 ' Присвоили CAdESCOM сертификат из CAPICOM
Dim oSignedData As Variant
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
oSignedData.Content = doc.GetItemValue("tosign")(0) 'ЧТО подписываем
'sSignedData = oSignedData.Sign(oSigner, False)
sSignedData = oSignedData.SignCades(oSigner, 1, False)
Call doc.ReplaceItemValue("signpole",Cstr(sSignedData))
Msgbox "конец"
End Sub
2 Ответ от admin 2015-05-13 08:02:58
- admin
- Репутация : 0
Re: Lotus и КриптоПро
Пример 2.Работа с компонентом КриптоПро CADESCOM.Окошка выбора сертификата юзером – нет.
Что подписываем: на форме текстовое поле tosign.Подпись: поле signpole
Sub Click(Source As Button) ' CAdESCOM
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Dim oAbout As Variant
Dim oVersion As Variant
Dim Build As Variant
Dim Certificates As Variant ' все сертификаты
Dim Certif As Variant ' поиск непросроч. сертификатов для выбора одного сертификата
Dim MySert As Variant ' один выбранный сертификат
Dim MySert1 As Variant ' один выбранный сертификат (Certificate object)
Dim privateKey As Variant
ProviderName$ = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"
Set oAbout = CreateObject("CAdESCOM.About")
Set oVersion= oAbout.CSPVersion(ProviderName$,75)
Build = oVersion.BuildVersion
Print Cstr(Build)
Dim Store As Variant ' хранилище сертификатов
Set Store = CreateObject("CAdESCOM.Store")
Build = Store.Open (2,"MY")
Set Certificates = Store.Certificates
Print Cstr(Certificates.Count) ' всего сертификатов
Set Certif = Certificates.Find(9, Now)
Print Cstr(Certif.Count) ' непросроченные сертификаты
Set MySert = Certif.Item(1)
Print "Сертификат для " + (MySert.SubjectName)
Set privateKey = MySert.PrivateKey
Print (privateKey.ProviderName)
Dim oSigner As Variant
Dim oSignedData As Variant
Dim sSignedData
Set oSigner = CreateObject("CAdESCOM.CPSigner")
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
oSigner.TSAAddress = "http://testca.cryptopro.ru/tsp/tsp.srf"
Set oSigner.Certificate = MySert
oSignedData.Content = doc.GetItemValue("tosign")(0) 'ЧТО подписываем
sSignedData = oSignedData.Sign(oSigner, False)
Call doc.ReplaceItemValue("signpole",Cstr(sSignedData))
Msgbox "конец"
'Print Cstr(sSignedData)
End Sub
3 Ответ от admin 2015-11-17 08:47:55
- admin
- Репутация : 0
Re: Lotus и КриптоПро
Попытки проверить ЭЦП поля “signpole”.
Пример 1:CAdESCOM – проверяем подпись поля в лотус документе.
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Dim SignedMsg As String, Cont As String
Dim oSignedData
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
Cont = doc.GetItemValue("tosign")(0)
SignedMsg = doc.GetItemValue("signpole")(0) 'Текст подписанный
oSignedData.Content = Cont$ ' ЭЦП
zzz= oSignedData.VerifyCades(SignedMsg, 0, 1) ' не работает!
numberSignature=oSignedData.Signers.Count
'yyy = oSignedData.Display
'oSignedData.VerifyCades
xxx = oSignedData.VerifyCades (SignedMsg)
End Sub
Пример 2: проверка XML фала подписанного криптопро с винта с помошью CAdESCOM
Sub Click(Source As Button)
' берем с xml файла с ЭЦП - localFile$ содержимое konteyner и signaturesxml.
' пытаемся с помошью VerifyCades проверить валидность signaturesxml по отношению к konteyner.
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Dim SignedMsg
Dim oSignedData
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
localFile$ = "c:\XML3.xml"
outputFile$ = "c:\XMLSub Click(Source As Button)
' берем с xml файла с ЭЦП - localFile$ содержимое konteyner и signaturesxml.
' пытаемся с помошью VerifyCades проверить валидность signaturesxml по отношению к konteyner.
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Dim SignedMsg
Dim oSignedData
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
localFile$ = "c:\XML\123.xml"
outputFile$ = "c:\XML\0000.xml"
Dim inputStream As NotesStream, outputStream As NotesStream
Set inputStream = session.CreateStream
Set outputStream =session.CreateStream
Call inputStream.Open(localFile$,"UTF-8")
inputStream.Position = 0
Cont$= inputStream.ReadText()
Call inputStream.Close ()
Cont$ = Strleftback( Cont$, "</konteyner>" )
Cont$ = Strrightback ( Cont$, "<konteyner>" )
' Call outputStream.Open (outputFile$)
' outputStream.Truncate
' Dim domParser As NotesDOMParser
' Set domParser=session.CreateDOMParser(inputStream, outputStream)
' Call domParser.Serialize( )
' domParser.Process
' Dim docNode As NotesDOMDocumentNode
' Set docNode = domParser.Document
' Dim documentList As NotesDOMNodeList
' Set documentList = docNode.GetElementsByTagName ("konteyner")
' Dim eNode As NotesDOMElementNode
' Set eNode = documentList.GetItem(1) 'name
' Cont$ = eNode.lastchild.NodeValue
'oSignedData.Content = Cont$ ' ЭЦП
'Call inStream.Close
'yyy = oSignedData.Display
Dim xml As XMLProcessor
Set xml = New XMLProcessor("")
Call xml.parseFile(localFile$)
sigXML$ = xml.selectValue(Nothing, "signaturesxml[id=sigXML]", "-")
Call doc.ReplaceItemValue("tosign",Cont$)
Call doc.ReplaceItemValue("signpole",sigXML$)
'Cont$ = xml.selectValue(Nothing, "konteyner", "-")
oSignedData.Content = Cont$ ' ЭЦП
zzz= oSignedData.VerifyCades(sigXML$, 0, 1)
numberSignature=oSignedData.Signers.Count
xxx = oSignedData.Verify (sigXML$)
'oSignedData.VerifyCades
End Sub
00.xml"
Dim inputStream As NotesStream, outputStream As NotesStream
Set inputStream = session.CreateStream
Set outputStream =session.CreateStream
Call inputStream.Open(localFile$,"UTF-8")
inputStream.Position = 0
Cont$= inputStream.ReadText()
Call inputStream.Close ()
Cont$ = Strleftback( Cont$, "</konteyner>" )
Cont$ = Strrightback ( Cont$, "<konteyner>" )
' Call outputStream.Open (outputFile$)
' outputStream.Truncate
' Dim domParser As NotesDOMParser
' Set domParser=session.CreateDOMParser(inputStream, outputStream)
' Call domParser.Serialize( )
' domParser.Process
' Dim docNode As NotesDOMDocumentNode
' Set docNode = domParser.Document
' Dim documentList As NotesDOMNodeList
' Set documentList = docNode.GetElementsByTagName ("konteyner")
' Dim eNode As NotesDOMElementNode
' Set eNode = documentList.GetItem(1) 'name
' Cont$ = eNode.lastchild.NodeValue
'oSignedData.Content = Cont$ ' ЭЦП
'Call inStream.Close
'yyy = oSignedData.Display
Dim xml As XMLProcessor
Set xml = New XMLProcessor("")
Call xml.parseFile(localFile$)
sigXML$ = xml.selectValue(Nothing, "signaturesxml[id=sigXML]", "-")
Call doc.ReplaceItemValue("tosign",Cont$)
Call doc.ReplaceItemValue("signpole",sigXML$)
'Cont$ = xml.selectValue(Nothing, "konteyner", "-")
oSignedData.Content = Cont$ ' ЭЦП
zzz= oSignedData.VerifyCades(sigXML$, 0, 1)
numberSignature=oSignedData.Signers.Count
xxx = oSignedData.Verify (sigXML$)
'oSignedData.VerifyCades
End Sub
Пример 3. Проверка подписанного с криптопро XML файла на винчестере при помощи Msxml2.
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
Dim oXml
Set oXml = CreateObject("Msxml2.DOMDocument")
oXml.async = False
oXml.validateOnParse = True
localFile$ = "c:\XML3.xml"
localFile2$ = "c:\XML3.xml"
oXml.Load(localFile$)
If oXml.parseError.ErrorCode = 0 Then
Print( "SUCCESS loading XML File")
Else
Print("Ошибка: " & oXml.parseError.reason & " в строке: " & oXml.parseError.line & " позиция: " & oXml.parseError.linepos)
End If
Set objXMLDOMNodeList = oXml.getElementsByTagName ("konteyner")
Set Item = objXMLDOMNodeList.item(0)
cont$ = Item.xml
repl$ = |<konteyner xmlns="http://_.w3.org/1999/xhtml">|
cont$ = Replace (cont$,repl$,"")
repl$ = |</konteyner>|
cont$ = Replace (cont$,repl$,"")
Set objXMLDOMNodeList = oXml.getElementsByTagName ("signaturesxml")
Set Item = objXMLDOMNodeList.item(0)
sig$ = Item.xml
repl$ = |<signaturesxml xmlns="http://_.w3.org/1999/xhtml" id="sigXML">|
sig$ = Replace (sig$,repl$,"")
repl$ = |</signaturesxml>|
sig$ = Replace (sig$,repl$,"")
Call doc.ReplaceItemValue("tosign",cont$)
Call doc.ReplaceItemValue("signpole",sig$)
Dim oSignedData
Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
oSignedData.Content = cont$ ' ЭЦП
zzz= oSignedData.VerifyCades(sig$, 0, 1)
numberSignature=oSignedData.Signers.Count
'Dim Strm As NotesStream
'Set Strm = session.CreateStream
'Call Strm.Open(localFile2$)
'Strm.WriteText (cont$)
'Call Strm.Close
End Sub
vgoma / crypto-pro
Goto Github
PK
View Code? Open in Web Editor
API для взаимодействия с КриптоПро
License: MIT License
crypto-pro’s Introduction
cryptoPro
Единое, асинхронное API для взаимодействия с КриптоПРО ЭЦП Browser Plug-In
- cryptoPro
- Тем, кто хочет помочь
- Полезная информация
- Лицензия
Зачем мне этот пакет?
КриптоПРО ЭЦП Browser Plug-In доступен в разных браузерах в двух версиях.
Асинхронной (в современных браузерах) и синхронной (в браузерах постарше).
С помощью этого пакета можно не писать реализацию под каждую версию плагина дважды.
И вместо этого
и этого
написать это (UMD):
или это (ES Modules + Typescript):
Установка
Подключение пакета как UMD модуля через тэг script:
<div dir="auto" data-snippet-clipboard-copy-content="
window.cryptoPro.getUserCertificates()
.then(function (certificates) {
//…
})
.catch(function (error) {
//…
});
“>
=""
Подключение пакета как ES модуля с Typescript или JavaScript:
let certificates: Certificate[];
try {
certificates = await getUserCertificates();
} catch(error) {
// …
}
})();”>
:
Список требуемых полифиллов (если необходимы, подключаются самостоятельно):
- Promise
- Array.prototype.find
API
Методы объекта cryptoPro
Методы объекта сертификата
Сертификат предоставляет следущее API:
Поддерживаемые СКЗИ
КриптоПРО CSP (v4.0+) рекомендуется использование только сертифицированных версий. Инструкция по установке:
- Linux / OSX
- (в Windows следуйте указаниям программы-установщика)
КриптоПРО ЭЦП browser plug-in (v2.0.12438+).
Инструкция по установке плагина в Linux. В Windows и OSX следуйте указаниям программы-установщика.
Инструкция по установке сертификатов в систему для Linux / OSX.
Примеры
Для их запуска необходим NodeJS LTS.
Тэг script (UMD)
examples/script-tag npm i npm start
Angular (ES Modules + Typescript)
examples/angular npm i
Запуск в режиме разработки:
Запуск в продакшн режиме:
npm run build npm run serve
React (ES Modules + JavaScript)
Запуск в режиме разработки:
Запуск в продакшн режиме:
npm run build npm run serve
Миграция с версии 1 на 2
Внесены следующие изменения:
- Пакет собран в форматах:
- UMD, в папке
dist/
, для подключения через тэг script. Объектwindow.cryptoPro
доступен глобально. - ES Modules, в папке
lib/
, для использования с разными системами сборки.
Методы API импортируются напрямую из npm пакета.
- UMD, в папке
- В UMD версии переименован глобальный объект с
window.CryptoPro
наwindow.cryptoPro
- Переименованы общие методы:
getCert
->getCertificate
isValidEDSSettings
,isValidCSPVersion
,isValidCadesVersion
->isValidSystemSetup
- Убран метод
signDataXML
- Переименованы методы сертификата:
- Результат методов сертификата
getOwnerInfo
иgetIssuerInfo
изменился с{ descr, title, translated }
на{ description, title, isTranslated }
- Принципиальная реализация методов, обращающихся к Крипто ПРО не изменилась.
Получение сертификатов, создание подписи, проверка корректности настроек работают по-прежнему. - Убрана поддержка IE8 (Крипто ПРО его больше не поддерживает)
- Убрана поддержка КриптоПРО CSP версий ниже 4.0
- Убрана поддержка КриптоПРО ЭЦП browser plug-in версий ниже 2.0
- Доработана обработка ошибок, выбрасываемых из Крипто ПРО
- При написании кода будут работать автодополнения и подсказки
- Исправлена проблема работы библиотеки с UglifyJs
- Методы API доступны напрямую:
В версии 1:
В версии 2 (UMD):
В версии 2 (ES Modules):
Тем, кто хочет помочь
Буду благодарен за расширение/улучшение/доработку API.
Вам будут полезны примеры,
предоставляемые Крипто ПРО.
Запуск режима разработки
Во время работы с кодом необходим запущенный сборщик:
И пример, на котором можно тестировать изменения.
Удобнее всего тестировать на примере с тэгом script, тк он отвязан от фреймворков
и использует сборку в формате UMD из папки dist/, постоянно обновляемую пока работает
сборщик. Запускаем его таким образом:
examples/script-tag npm i npm link ../../ npm start
После выполнения npm link ../../ в директории examples/script-tag/node_modules папка crypto-pro станет ярлыком,
указывающим на папку содержащую локально собранный пакет.
Запуск тестов
Тесты написаны с использованием Jest:
Проверка работы примеров с React и Angular
React и Angular используют версию сборки пакета в формате ES модулей из директории lib/.
Для их запуска необходимо сначала собрать пакет выполнив:
После этого из папки examples/angular или examples/react залинковать пакет:
examples/angular npm i npm link ../../
И запустить пример в одном из двух режимов. В режиме разработки:
или в режиме продакшн:
npm run build npm run serve
Проверка пакета перед публикацией в NPM
Необходимо протестировать работу в заявленных браузерах, сделав это на локально запакованной версии пакета.
Для этого собираем пакет:
npm run package mv package ..
Важно переместить папку package куда-нибудь выше для избежания конфликтов при линковке с текущим package.json.
Переходим в любую директорию с примером и создаем там ссылку на только что собранный пакет:
examples/script-tag npm link ../../../package
Проверяем работу примеров в режимах разработки и продакшн.
После завершения экспериментов можно удалить глобальную ссылку из директории ../../../package таким образом:
../../../package npm unlink
Полезная информация
Установка КриптоПРО CSP в Linux / OSX
Процесс установки в OSX незначительно отличается от Linux, поэтому описание приведено на примере дистрибутива семейства Debian (x64).
Некоторые команды могут потребовать запуска с sudo.
Названия файлов и директорий могут отличаться из-за различий в версиях.
После загрузки КриптоПРО CSP для нужной платформы, распакуйте архив:
tar -xzvf linux-amd64_deb.tgz chmod 777 -R linux-amd64_deb/
Запустите скрипт установки:
linux-amd64_deb/install.sh
Проверьте отсутствие cprocsp-rdr-gui:
dpkg -l grep cprocsp-rdr
Установите дополнительно cprocsp-rdr-gui-gtk:
dpkg -i linux-amd64_deb/cprocsp-rdr-gui-gtk-64_4.0.0-4_amd64.deb
Дополнительная информация по установке
Установка КриптоПРО ЭЦП browser plugin в Linux
Загрузите КриптоПРО ЭЦП browser plug-in и распакуйте его:
mkdir cades_linux_amd64 tar -xzvf cades_linux_amd64.tar.gz -C cades_linux_amd64
Сконвертируйте rpm в deb пакеты при помощи утилиты alien:
apt-get update apt-get install alien cades_linux_amd64 alien
dpkg -i cprocsp-pki-cades_2.0.0-2_amd64.deb dpkg -i cprocsp-pki-plugin_2.0.0-2_amd64.deb
Проверьте наличие файлов плагина:
lrwxrwxrwx 1 root root 19 Окт 21 12:33 libnpcades.so.2 -> libnpcades.so.2.0.0
-rwxr-xr-x 1 root root 2727236 Июн 8 14:33 libnpcades.so.2.0.0″>
ls -la /opt/cprocsp/lib/amd64 grep libnpcades lrwxrwxrwx 1 root root 19 Окт 21 12:33 libnpcades.so - libnpcades.so.2.0.0 lrwxrwxrwx 1 root root 19 Окт 21 12:33 libnpcades.so.2 - libnpcades.so.2.0.0 -rwxr-xr-x 1 root root 2727236 Июн 8 14:33 libnpcades.so.2.0.0
Настройка плагина для Firefox (до версии 52)
После настройки плагина на страницах, запрашивающих работу с ЭП в панели навигации, рядом с url будет кнопка,
позволяющая “разрешить и запомнить” использование установленного плагина.
/usr/lib/mozilla/plugins cp /opt/cprocsp/lib/amd64/libnpcades.so.2.0.0 ./ ldd libnpcades.so.2.0.0 cp /opt/cprocsp/lib/amd64/libnpcades.so.2.0.0 ./libnpcades.so ldd libnpcades.so
Перезапустите Firefox, и убедитесь в наличии CryptoPRO Cades plugin (см. Menu -> Addons).
Установка сертификатов в Linux
В OSX процесс схож с Linux.
Подключите USB носитель с ключевыми контейнерами и проверьте результат команды:
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -fqcn -verifyc CSP (Type:80) v4.0.9009 KC1 Release Ver:4.0.9797 OS:Linux CPU:AMD64 FastCode:READY:AVX. AcquireContext: OK. HCRYPTPROV: 16188003 .LASHvanov .LASHetrov .LASHidorov .LASHasiliev .LASHmirnov OK. Total: SYS: 0,020 sec USR: 0,060 sec UTC: 0,180 sec
Скопируйте ключевой контейнер \\.\FLASH\.\sidorov на жесткий диск:
/opt/cprocsp/bin/amd64/csptest -keycopy -contsrc -contdest CSP (Type:80) v4.0.9009 KC1 Release Ver:4.0.9797 OS:Linux CPU:AMD64 FastCode:READY:AVX. CryptAcquireContext succeeded.HCRYPTPROV: 38556259 CryptAcquireContext succeeded.HCRYPTPROV: 38770755 Total: SYS: 0,000 sec USR: 0,100 sec UTC: 14,920 sec [ErrorCode: 0x00000000]
Проверьте наличие нового контейнера \\.\HDIMAGE\sidor:
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -fqcn -verifyc CSP (Type:80) v4.0.9009 KC1 Release Ver:4.0.9797 OS:Linux CPU:AMD64 FastCode:READY:AVX. AcquireContext: OK. HCRYPTPROV: 34554467 .LASHvanov .LASHetrov .LASHidorov .LASHasiliev .LASHmirnov .DIMAGEidor OK. Total: SYS: 0,010 sec USR: 0,050 sec UTC: 0,130 sec [ErrorCode: 0x00000000]
Установите личный сертификат:
/opt/cprocsp/bin/amd64/certmgr -inst -cont
Возможно в выводе вы ссылку на сертификат УЦ
При необходимости загрузите сертификат удостоверяющего центра и установите его командой:
<div dir="auto" data-snippet-clipboard-copy-content="/opt/cprocsp/bin/amd64/certmgr -inst -store uroot -file .crt”>
/opt/cprocsp/bin/amd64/certmgr -inst -store uroot -file файл сертификата.crt
После чего, при проверке установленного личного сертификата вы увидите PrivateKey Link: Yes:
/opt/cprocsp/bin/amd64/certmgr -list -store uMy