Статус: Участник
Группы: Участники
Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
|
Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384. Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом. Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC) Сообщений: 1,534 Откуда: КРИПТО-ПРО
Сказал(а) «Спасибо»: 36 раз Поблагодарили: 496 раз в 352 постах
|
Автор: Dmitrii F  Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384. Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом. Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net. Кстати, да, безотносительно ГОСТа попробовать -- хорошая мысль. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
|
Откреплённые подписи, созданные средствами openssl, на основе алгоритмов rsa-sha256, rsa-sha384, проверку функцией не прошли. Ключ и сертификат 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
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 тут не причем
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
|
По всей видимости, нужно посмотреть в исходный код функции , чтобы выястить в чём дело и какие дополнительные "флаги" указывать openssl.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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
Вот только отладить нормально не получается.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close