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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Dmitrii F  
#11 Оставлено : 1 июня 2020 г. 18:40:20(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384.
Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом.
Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net.
Offline Дмитрий Пичулин  
#12 Оставлено : 1 июня 2020 г. 19:57:07(UTC)
pd

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

Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC)
Сообщений: 1,442
Откуда: КРИПТО-ПРО

Сказал(а) «Спасибо»: 31 раз
Поблагодарили: 412 раз в 306 постах
Автор: Dmitrii F Перейти к цитате
Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384.
Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом.
Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net.

Кстати, да, безотносительно ГОСТа попробовать -- хорошая мысль.
Знания в базе знаний, поддержка в техподдержке
Offline Dmitrii F  
#13 Оставлено : 1 июня 2020 г. 20:10:52(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Откреплённые подписи, созданные средствами openssl,
на основе алгоритмов rsa-sha256, rsa-sha384,
проверку функцией
Код:
CheckSignature()

не прошли.

Ключ и сертификат rsa-sha256 рассчитывались следующим образом:
Код:

   openssl req -newkey rsa:2048  -nodes -out c_rsa_sha256.csr -keyout example_rsa_sha256.key
   openssl req -x509 -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365



Рассчёт Digest и Signature:

Код:
openssl dgst -binary -sha_256 c.xml #получение значения digest, c.xml - канонизированный xml
openssl dgst -sign private_key -binary -sha_256 digest_value #получение значения signature, 
#private_key - ключ, digest_value - полученное ранее значение digest


Аналогичным образом, для rsa-sha384

Канонизация проводилась в соответвии со спецификацией:
Код:
http://www.w3.org/2001/10/xml-exc-c14n#WithComments

методами библиотеки lxml.etree Python

Описание алгоритмов в xml, в соответвии с спецификацией
К примеру, для rsa-sha384:

Код:

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"/>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"/>



Значения Digest и Signature - в виде строкового представления base64:
Код:

DigestValue.base64.b64encode.decode('utf8')
SignValue.base64.b64encode.decode('utf8')


Проверка производилась для Net.v4









Offline Dmitrii F  
#14 Оставлено : 1 июня 2020 г. 22:28:47(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Если производить обратное действие, т.е.
рассчитывать Signature и Digest средствами Net.,
то, как указано здесь для алгоритма sha1, верификация Signature публичным ключём в openssl, проходит успешно.
Поэтому, предполаю, что всё-таки дело в канонизации, а не в различным с .Net вычислении Digest и Signature средствами openssl
(Если только это не работает исключительно в одном направлении, т.е. .Net--->openssl , но не openssl--->.Net)

Следующим шагом надо будет получить в Net. каноническое представление xml документа и рассчитывать Digest и Signature средствами openssl, наверное, даже для rsa-sha1, чтобы наверняка.
И проверить его.

Ещё, можно дополнительно рассчитать Digest средствами Net. и сравнить его со значением, получаемым в openssl.

Отредактировано пользователем 1 июня 2020 г. 23:05:48(UTC)  | Причина: pkcs12 тут не причем

Offline Dmitrii F  
#15 Оставлено : 1 июня 2020 г. 23:32:04(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Итак, код для расчёта канонической формы xml документа и значения Digest (sha256, gost3411_2012_256),
а также, последующей их записи в отдельные файлы,
средствами .Net VB такой:

Код:

        'Create and load source xml document
        Dim xmlDocument As XmlDocument = New XmlDocument()
        xmlDocument.PreserveWhitespace = True
        xmlDocument.Load(args(0))

        Dim c14 As XmlDsigExcC14NWithCommentsTransform = New XmlDsigExcC14NWithCommentsTransform()
        c14.LoadInput(xmlDocument)


        'Digest value
        'sha256
        Dim digestBase64String As String = Convert.ToBase64String(c14.GetDigestedOutput(SHA256.Create()))
        File.WriteAllText(args(0) + "_DigestValue.dgst", digestBase64String)

        'Gost3411_2012_256
        Dim digestBase64String_gost3411 As String  =Convert.ToBase64String(c14.GetDigestedOutput(Gost3411_2012_256.Create()))
        File.WriteAllText(args(0) + "_DigestValue_gost3411.dgst", digestBase64String_gost3411)

        'Canonicalization
        Dim sw As New StreamReader(DirectCast(c14.GetOutput(), MemoryStream))
        Dim canonicXML As String = sw.ReadToEnd()
        File.WriteAllText(args(0) + "_ExcC14NWithComments.xml", canonicXML)



Значение Digest (для sha256 и gost3411_2012_256) я проверил, оно идентично с рассчитанным средствами openssl + Python.lxml.etree
Из, этого, вероятнее всего, следует, что и канонические формы xml файла в .Net и Python.lxml.etree совпадают.
Ещё (чтобы наверняка), следует сравнить отдельно канонические формы xml файла.

Отредактировано пользователем 1 июня 2020 г. 23:43:14(UTC)  | Причина: добавил gost3411_2012_256

Offline Dmitrii F  
#16 Оставлено : 2 июня 2020 г. 0:01:02(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
По всей видимости, нужно посмотреть
в исходный код функции
Код:
CheckSignature()
,
чтобы выястить в чём дело и какие дополнительные "флаги"
указывать openssl.
Offline Dmitrii F  
#17 Оставлено : 2 июня 2020 г. 10:46:39(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Сравнил канонические формы Python lxml.extree и .Net. в kdiff3
Они оказались идентичны:
Код:
Files A and B are binary equal


Проверку публичным ключем Signature проходит:
Код:

openssl x509 -pubkey -in example_rsa_sha256.pem>example_rsa_sha256_pub.key #Создание публичного ключа (вместе с сертификатом) на основании сертификата
openssl dgst -sha256 -verify example_rsa_sha256_pub.key -signature in_file.sign in_file.digest #Верификация Signature in_file.sign, созданной на основе Digest -  in_file.digest

Отредактировано пользователем 2 июня 2020 г. 10:48:40(UTC)  | Причина: Не указана

Offline Dmitrii F  
#18 Оставлено : 2 июня 2020 г. 11:50:49(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
В .Net сертификат проверяется дополнительно:
(Из документации)
Цитата:
If an XML document was signed with an X.509 signature, the CheckSignature method will search the "AddressBook" store for certificates suitable for the verification. For example, if the certificate is referenced by a Subject Key Identifier (SKI), the CheckSignature method will select certificates with this SKI and try them one after another until it can verify the certificate.


И здесь исходный код проверки


Здесь указано, что сертификат :


  • проверяется на наличие расширений keyUsage, если есть, то должны быть digitalSignature и(или) nonRepudiation
  • проверяется вся цепочка до корневого CA - сертификата
  • проверяется, не был ли сертификат отозван
  • проверяется не истёк ли срок действия сертифката на данный момент
  • проверяется, что ни один из сертификатов в цепочке до корневого CA не был запрещён в ОС

Отредактировано пользователем 2 июня 2020 г. 12:29:29(UTC)  | Причина: Не указана

Offline Dmitrii F  
#19 Оставлено : 2 июня 2020 г. 21:32:26(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Включил логирование проверки Xml,
вывод (часть):
Код:

System.Security.Cryptography.Xml.SignedXml Information: 14 : [SignedXml#00245fb7, VerifySignedInfo] Проверка SignedInfo с использованием ключа RSACryptoServiceProvider#01475d71, описания подписи RSAPKCS1SHA256SignatureDescription, алгоритма хэширования SHA256Cng и модуля удаления формата асимметричной подписи RSAPKCS1SignatureDeformatter.
System.Security.Cryptography.Xml.SignedXml Verbose: 14 : [SignedXml#00245fb7, VerifySignedInfo] Фактическое хэш-значение: f1d10cdb0bacc7b910cc62a56b688b26ebfad1de640a507475674bd76910d533
System.Security.Cryptography.Xml.SignedXml Verbose: 14 : [SignedXml#00245fb7, VerifySignedInfo] Исходная подпись: 29c2df6dd571b6855b6f5ec20e59144cc4829ed8f599c3c024470a31e698758d33686298421445576db160bf700ab81bc55b4aa54f7540b6a000cb7929eaea92f90a5611229ef63918f3da461f0143fc5ccc6f84a60af6937c56c93a4db1ce96ed4e7809645c2dd9b4d58dc99a3738917c0f9d953e0c0ff28ec7b2e07ea21df688ea552befa6cb6ae7c466cf9031b7f5994fb9b241f0c138c9b0aff35bbc07c3c976edbc1e12adc14306f3898b9cc4c31c5c46215510eb3b660ffa1ca4f800ba1b3107904fe25eec9ec71d015240c415f852152e8e2e8cb0db053f686edd323337ec2335f534926af62d4359353d70ee635b11e37e248aef1d34db01909866da
System.Security.Cryptography.Xml.SignedXml Information: 12 : [SignedXml#00245fb7, VerificationFailure] Проверка SignedInfo не прошла.
System.Security.Cryptography.Xml.SignedXml Information: 9 : [SignedXml#00245fb7, SignatureVerificationResult] Проверка с ключом RSACryptoServiceProvider#01475d71 не прошла.


Похоже, что проверку не проходит в функции
Код:
SignedXml.CheckSignedInfo


Вот только отладить нормально не получается.

Offline Dmitrii F  
#20 Оставлено : 3 июня 2020 г. 1:07:52(UTC)
Dmitrii F

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

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

Сказал(а) «Спасибо»: 1 раз
Упаковав сертификат rsa-sha256 с закрытым ключём в формат pkcs12,
создал откреплённую подпись для xml документа средствами .Net
, импортировав сертификат и ключ:
Код:

Dim cert As X509Certificate2 = New X509Certificate2("cert.p12", "password")
Dim Key As AsymmetricAlgorithm = cert.PrivateKey

Единственный момент, что в данном случае, алгоритм рассчёта Signature:rsa-sha256
не подошёл (исключение) почему-то, хотя я и создавал сертификат rsa-sha256:

Код:

openssl x509 -req -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365


Поэтому, пришлось вручную выставить алгоритм rsa-sha1:
Код:

SignedXML_.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url


Такая подпись проверку прошла.
Значит, сертификат валидный для .Net.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.