Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Добрый день!
Выполняю получение данных из отделённой подписи из файла sig через COM с помощью лицензионной КриптоПро CSP 4.0.xxxxx. Сервера времени нет.
Подписание выполняю так (в сокращённом виде): Set oSigner = CreateObject("CAdESCOM.CPSigner") Set oSigner.Certificate = oCert
Set SignedData = CreateObject("CAdESCOM.CadesSignedData") SignedData.ContentEncoding = CAPICOM_BASE64_TO_BINARY SignedData.Content = fileData 'В Base64
signature = SignedData.SignCades(oSigner, CADES_BES, True, CAPICOM_ENCODE_BASE64)
Получение данных из подписи выполняю так (Другого способа не нашёл в COM): signature = streamSig.ReadText() 'данные из sig файла
Set SignedData = CreateObject("CAdESCOM.CadesSignedData") SignedData.ContentEncoding = CAPICOM_BASE64_TO_BINARY SignedData.Content = fileData
Call SignedData.VerifyCades(signature, CADES_BES, True)
Как результат, если серификаты которыми осуществлялась подпись не просрочены в SignedData.Signers заполняется параметрами, в том числе oSign.Certificate и oSign.SigningTime (oSign типа CAdESCOM.CPSigner). Но если сертификаты например просрочены, то oSign.Certificate заполняется, но oSign.SigningTime нет, даже если не считать уведомление о том что подпись не действительна. При этом если выполнить Call SignedData.Display() открывается окно Windows, со всей необходимой информацией о подписях и сертификатах из sig файла.
Можно как-то иначе чем через Call SignedData.VerifyCades(signature, CADES_BES, True), заполнить данными SignedData.Signers, чтобы можно было прочитать достпные параметры, в том числе oSign.SigningTime, хоть и была она поставлена на основании данных локального ПК, где выполнялась подпись?
Мои попытки найти варинты данного решениея пока что не увенчались успехом. Заранее спасибо за любую помощь и совет!
Находил объект CAdESSignature, но для COM такого похоже нет, а есть он на Java. Также вопрос, если выполнить получение этих данных на Java, нужна ли для этого лицензия КриптоПро JCP?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Решил попробовать посмотреть атрибуты подписи, по результтам проверки, даже если сертифкат одного или всех подписавших просрочен. В итоге обнаружил дату и время подписи в AuthenticatedAttributes2 подписи. Set signers = SignedData.Signers ForAll oSign In signers For j = 1 To oSign.AuthenticatedAttributes2.count Set oAttr = oSign.AuthenticatedAttributes2.item(j) Print oAttr.oid.FriendlyName &{ - }& oAttr.oid.Value If oAttr.oid.Value = "1.2.840.113549.1.9.5" Then 'Дата/Время подписи Print Cstr(oAttr.Value) 'В этом месте ошибка. Причём не важно каким образом получаю параметр, любое обращение к Value, приводит к ошибке 'CAdESCOM.CPAttribute.1: Встречено неверное значение тэга ASN1. End If Next End ForAll Что не так делаю и как получить значение атрибута и при необходимости расшифровать его? На просторах сети и форума, пока не нашёл ответ. Отредактировано пользователем 10 марта 2022 г. 13:38:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Можно было бы подумать, что в AuthenticatedAttributes2 на самом дле не заполнен параметр для oid 1.2.840.113549.9.5 (Время подписания), но если вызвать Call SignedData.Display(), отобразится оконо со свойствами подписи, где атрибут "Время подписания" заполнен.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Решил перепроверить через ASN.1 Decoder (https://lapo.it/asn1js/) файл с подписями *.sig, вдруг всё таки нет там в атрибутах даты или она не там. Попробовал и дата оказалась на месте (см. рисунок).  Image 001.png (19kb) загружен 11 раз(а).Получается дата и время на месте и OID соответствует ( 1.2.840.113549.1.9.5), но при попытке его получить через COM (КриптоПро 4.0.хххх) AuthenticatedAttributes2, выдаётся ошибка CAdESCOM.CPAttribute.1: Встречено неверное значение тэга ASN1. Делаю вывод. В коде получения значения атрибута ошибка или есть какой-то способ получения про который ни где не написали. Как всё таки корректно получить данный атрибут? Не писать же в самом деле ASN.1 декодер :).
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,228  Сказал(а) «Спасибо»: 105 раз Поблагодарили: 292 раз в 272 постах
|
Добрый день! через Com не выйдет. далее берем только первого подписанта. C# Код: SignedCms cms = new SignedCms();
cms.Decode(Convert.FromBase64String(sign));
for (int i = 0; i < cms.SignerInfos[0].SignedAttributes.Count; i++)
{
if (cms.SignerInfos[0].SignedAttributes[i].Oid.Value == "1.2.840.113549.1.9.5")
{
Pkcs9SigningTime pkcs9SigningTime = new Pkcs9SigningTime(cms.SignerInfos[0].SignedAttributes[i].Values[0].RawData);
Console.WriteLine(pkcs9SigningTime.SigningTime);
}
}
Java Код: byte[] sign = (new Decoder()).decodeBuffer(new FileInputStream(fileName));
CAdESSignature cAdESSignature = new CAdESSignature(sign, null, null);
ASN1Primitive value = cAdESSignature
.getCAdESSignerInfos()[0]
.getSignerInfo()
.getSignedAttributes()
.get(new ASN1ObjectIdentifier("1.2.840.113549.1.9.5"))
.getAttributeValues()[0]
.toASN1Primitive();
System.out.println(Time.getInstance(value).getTime());
N.B. время в UTC P.S. для проверки файла подписи лицензия не нужна в JCP |
|
 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Спасибо, добрый человек! Через комплект jar из Java CSP получилось реализовать получение Времени подписи по данному OID. Немного только иначе, но суть та же. Ниже код в котором немного "разложил" получение каждого из объектов чтобы было понятнее на данном этапе и было ясно что необходимо подключить в проект. Может быть кому-то однажды пригодиться. Код:System.out.println("Прочитаем файл и декодируем!");
FileInputStream file = new FileInputStream("D:\\Sign\\XXXXXXXXX.pdf.sig");
byte[] sign = (new Decoder()).decodeBuffer(file);
System.out.println("Декодировали!");
System.out.println("Создадим CAdESSignature");
CAdESSignature cAdESSignature = new CAdESSignature(sign, null, null);
System.out.println("Создали!");
System.out.println("Прочитаем информацию из подписи!");
CAdESSigner[] signers = cAdESSignature.getCAdESSignerInfos();
System.out.println("Подписантов = "+ String.valueOf(signers.length));
for (int i=0; i<signers.length; i++) {
System.out.println("Подписант "+ String.valueOf(i));
AttributeTable attrTbl = signers[i].getSignerSignedAttributes();
System.out.println("Получили таблицу атрибутов");
Attribute attr = attrTbl.get(new ASN1ObjectIdentifier("1.2.840.113549.1.9.5"));
System.out.println("Получили атрибут ");
ASN1Encodable[] asn1Enc = attr.getAttributeValues();
ASN1Primitive value = asn1Enc[0].toASN1Primitive();
System.out.println(Time.getInstance(value).getTime());
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Единственно, в процессе выполнения кода идёт обращение к записям реестра, видимо Java CSP это необходимо, и пишет в консоль предпреждения (см. ниже). Но Java CSP не устанавливал и не планируется ещё отдельно его ставить пользователям или на сервер. Jar-ы подключаются в проект как есть, плюс используется своя JVM, а не те которые ставятся в Windows. Может можно что-то где передать как параметр, чтобы не было обращения в реестр? Код:мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences <init>
ПРЕДУПРЕЖДЕНИЕ: Could not create windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.03.2022(UTC) Сообщений: 10   Сказал «Спасибо»: 2 раз
|
Также вопрос в продолжение темы. Может известно, какие именно функции из каких dll можно было-бы подключить в проект на VB, чтобы провернуть тоже самое? Приведу пример: Код:Declare Function SetWindowPosition Lib "user32.dll" Alias "SetWindowPos"(Byval hWnd As Long, Byval hWndInsertAfter As Long, Byval X As Integer, Byval Y As Integer, Byval w As Integer, Byval h As Integer, Byval uFlags As Long) As Integer
Declare Function SetCursorPosition Lib "user32.dll" Alias "SetCursorPos" (Byval x As Long, Byval y As Long) As Long
А дальше в коде уже можно воспользоваться данными функциями для дальнейшей работы. Использовать то скорее всего нужно " cadescom.dll". А вот что в ней, пока не понял, если подскажете или намекнёте, будет просто отлично.
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Автор: SlangID  Также вопрос в продолжение темы. Может известно, какие именно функции из каких dll можно было-бы подключить в проект на VB, чтобы провернуть тоже самое? А дальше в коде уже можно воспользоваться данными функциями для дальнейшей работы.
Использовать то скорее всего нужно "cadescom.dll". А вот что в ней, пока не понял, если подскажете или намекнёте, будет просто отлично. Да, интересный вопрос. Однако, с учетом замечания выше "через Com не выйдет", то, полагаю, подключив cadescom.dll попадете на те же грабли. Ну в худшем случае конечно можно подключить asn1 библиотеки, так что подход не совсем уж безнадежный.
|
 1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,228  Сказал(а) «Спасибо»: 105 раз Поблагодарили: 292 раз в 272 постах
|
Автор: SlangID  Единственно, в процессе выполнения кода идёт обращение к записям реестра, видимо Java CSP это необходимо, и пишет в консоль предпреждения (см. ниже). Но Java CSP не устанавливал и не планируется ещё отдельно его ставить пользователям или на сервер. Jar-ы подключаются в проект как есть, плюс используется своя JVM, а не те которые ставятся в Windows. Может можно что-то где передать как параметр, чтобы не было обращения в реестр? Код:мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences <init>
ПРЕДУПРЕЖДЕНИЕ: Could not create windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
ПРЕДУПРЕЖДЕНИЕ: Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002.
мар 11, 2022 5:05:42 PM java.util.prefs.WindowsPreferences openKey
ПРЕДУПРЕЖДЕНИЕ: Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
видимо вы используете java8. там необходимо элевация прав до админа.либо хотябы раз запустить от админа. эти ошибки уйдут, но появятся другие. но их тоже можно решить. попробуйте java10+ (java-csp-A) настройки будут в контексте пользователя |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close