Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline SlangID  
#1 Оставлено : 10 марта 2022 г. 11:45:15(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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?
Offline SlangID  
#2 Оставлено : 10 марта 2022 г. 13:37:31(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline SlangID  
#3 Оставлено : 10 марта 2022 г. 13:52:36(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 10.03.2022(UTC)
Сообщений: 10
Мужчина
Российская Федерация

Сказал «Спасибо»: 2 раз
Можно было бы подумать, что в AuthenticatedAttributes2 на самом дле не заполнен параметр для oid 1.2.840.113549.9.5 (Время подписания), но если вызвать Call SignedData.Display(), отобразится оконо со свойствами подписи, где атрибут "Время подписания" заполнен.
Offline SlangID  
#4 Оставлено : 11 марта 2022 г. 3:46:51(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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 декодер :).
Offline Санчир Момолдаев  
#5 Оставлено : 11 марта 2022 г. 6:30:24(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 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
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
SlangID оставлено 11.03.2022(UTC)
Offline SlangID  
#6 Оставлено : 11 марта 2022 г. 13:04:51(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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());
          }
Offline SlangID  
#7 Оставлено : 11 марта 2022 г. 13:10:41(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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.
Offline SlangID  
#8 Оставлено : 11 марта 2022 г. 13:17:27(UTC)
SlangID

Статус: Участник

Группы: Участники
Зарегистрирован: 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". А вот что в ней, пока не понял, если подскажете или намекнёте, будет просто отлично.
Offline two_oceans  
#9 Оставлено : 11 марта 2022 г. 14:56:49(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Автор: SlangID Перейти к цитате
Также вопрос в продолжение темы.
Может известно, какие именно функции из каких dll можно было-бы подключить в проект на VB, чтобы провернуть тоже самое?
А дальше в коде уже можно воспользоваться данными функциями для дальнейшей работы.

Использовать то скорее всего нужно "cadescom.dll". А вот что в ней, пока не понял, если подскажете или намекнёте, будет просто отлично.
Да, интересный вопрос. Однако, с учетом замечания выше "через Com не выйдет", то, полагаю, подключив cadescom.dll попадете на те же грабли. Ну в худшем случае конечно можно подключить asn1 библиотеки, так что подход не совсем уж безнадежный.

thanks 1 пользователь поблагодарил two_oceans за этот пост.
SlangID оставлено 11.03.2022(UTC)
Offline Санчир Момолдаев  
#10 Оставлено : 11 марта 2022 г. 23:52:01(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 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) настройки будут в контексте пользователя
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.