Здравствуйте!
С помощью утилиты openssl, дополненной gost engine (https://github.com/gost-engine/engine/)
была создана откреплённая подпись для xml файла. Для подписи использовались алгоритмы
gost2012_256.
При создании сертификата и ключа выполнялись следующие команды:
Код:
openssl req -newkey gost2012_256 -nodes -pkeyoptparamset:A -out c.csr -keyout example.key
openssl x509 -req -in c.csr -out example.pem -signkey example.key -days 365
При создании откреплённой подписи выполнялись следующие команды:
Код:
openssl dgst -binary -md_gost12_256 path_to/canonicalizated.xml #получение digest
openssl dgst -sign private_key -binary -md_gost12_256 digest_value #получение значения signature,
#private_key - ключ, digest_value - полученное ранее значение digest
Для канонизации xml использовался метод lxml.etree.tostring Python.
Значения digest и signature, а также сертификата использовались для формирования
откреплённой подписи xml.
Прикрепляю архив с исходными файлами:

example.zip
(2kb) загружен 10 раз(а)., где:
example.pem - сертификат
in_simple.xml - xml файл для подписи
in_simple.xml_utf-8_sign_file.xml - xml файл с откреплённой подписью для файла in_simple.xml
Далее, пробую произвести проверку откреплённой подписи, как в примере, поставляемым с CryptoPro.Net SDK (simple.zip-
xml\vb\Verify.vb), с небольшими модификациями:
Код:
Public Shared Sub Main(ByVal args As String())
' Разбираем аргументы
If args.Length < 2 Then
Console.WriteLine("Xml.Verify <document> ...")
Return
End If
' Создаем новый XML документ в памяти.
Dim xmlDocument As XmlDocument = New XmlDocument()
Dim xmlSgn As XmlDocument = New XmlDocument()
' Сохраняем все пробельные символы, они важны при проверке
' подписи.
xmlDocument.PreserveWhitespace = True
xmlSgn.PreserveWhitespace = True
' Загружаем подписанный документ из файла.
xmlDocument.Load(args(0))
xmlSgn.Load(args(1))
' Ищем все node "Signature" и сохраняем их в объекте XmlNodeList
Dim nodeList As XmlNodeList = xmlSgn.GetElementsByTagName(
"Signature", SignedXml.XmlDsigNamespaceUrl)
Console.WriteLine("Найдено:{0} подпис(ей).", nodeList.Count)
' Проверяем все подписи.
For curSignature As Integer = 0 To nodeList.Count - 1
' Создаем объект SignedXml для проверки подписи документа.
Dim signedXml As SignedXml = New SignedXml(xmlDocument)
' Загружаем узел с подписью.
signedXml.LoadXml(nodeList(curSignature))
' Проверяем подпись и выводим результат.
Dim result As Boolean = signedXml.CheckSignature()
' Выводим результат проверки подписи в консоль.
If result Then
Console.WriteLine("XML подпись[{0}] верна.", curSignature + 1)
Else
Console.WriteLine("XML подпись[{0}] не верна.", curSignature + 1)
End If
Next
End Sub
Однако, проверку не проходит, т.е.
в результате выполнения кода:
Код:Dim result As Boolean = signedXml.CheckSignature()
Скажите пожалуйста, корректно ли проверять так откреплённую подпись
xml файла?
Если нет, то как правильно это делать?
Если да, то, может нужно другие SignatureMethod Algorithm
и(или) DigestMethod Algorithm использовать при формировании
xml файла с откреплённой подписью? Или же методы канонизации
Python и Net. Framework отличаются? Или что-то другое...