Автор: Андрей * Здравствуйте.
c#?
Полностью код\проект, который воспроизодит проблему?
..
Visual Basic
Вроде бы ничего необычного, переделывал проект под библиотеку CAdESCOM по примерам с этого сайта.
' Пример подписи и проверки подписи всего xml документа.
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Imports System.Text
Imports System.Xml
Module Module1
Const CAPICOM_CURRENT_USER_STORE = 2
Const CAPICOM_MY_STORE = "My"
Const CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2
Const CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1
Const CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED = 0
Const CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING = 1
Const XmlDsigGost3410UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
Const XmlDsigGost3411UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr3411"
Const XmlDsigGost3410Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"
Const XmlDsigGost3411Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"
<STAThread()>
Sub Main(ByVal args As String())
' Разбираем аргументы
If (args.Length < 1) Then
Console.WriteLine("ConsoleXMLDSigApp2.exe <CertificateSerialNumberWithoutBlanks>")
Return
End If
run(args(0))
Console.ReadKey()
End Sub
Function GetCertificateBySubjectName(certSerialNumber)
Dim Store = CreateObject("CAdESCOM.Store")
Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
Dim Cert
Dim Certificates = Nothing
For Each Cert In Store.Certificates
If Cert.SerialNumber = certSerialNumber Then
Certificates = Cert
Exit For
End If
Next
If Store.Certificates.Count = 0 Then
Console.WriteLine("Certificate not found: " + certSerialNumber)
Exit Function
End If
Dim Certificate = Store.Certificates.Item(1)
Store.Close()
Return Certificate
End Function
Function SignCreate(Certificate, dataToSign)
' Создаем объект CAdESCOM.CPSigner
Dim Signer = CreateObject("CAdESCOM.CPSigner")
Signer.Certificate = Certificate
' Создаем объект CAdESCOM.SignedXML
Dim SignedXML = CreateObject("CAdESCOM.SignedXML")
SignedXML.Content = dataToSign
' Указываем тип подписи - в данном случае вложенная
SignedXML.SignatureType = CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED
' Указываем алгоритм подписи
SignedXML.SignatureMethod = XmlDsigGost3410Url
' Указываем алгоритм хэширования
SignedXML.DigestMethod = XmlDsigGost3411Url
Dim SignedMessage As String = ""
Try
SignedMessage = SignedXML.Sign(Signer)
Catch ex As Exception
Console.WriteLine("Failed to create signature. Error: " + ex.Message)
Exit Function
End Try
Return SignedMessage
End Function
Function Verify(SignedMessage)
' Создаем объект CAdESCOM.SignedXML
Dim SignedXML = CreateObject("CAdESCOM.SignedXML")
Try
SignedXML.Verify(SignedMessage)
Catch ex As Exception
Console.WriteLine("Failed to verify signature. Error: " + ex.Message)
Return False
End Try
Return True
End Function
Function run(CertName As String)
If ("" = CertName) Then
Console.WriteLine("Введите имя сертификата (CN).")
Exit Function
End If
' Ищем сертификат для подписи
Dim Certificate = GetCertificateBySubjectName(CertName)
Dim Content As String = SourceDocument
Dim signedMessage = SignCreate(Certificate, Content)
Console.WriteLine(signedMessage)
Dim verifyResult = Verify(signedMessage)
If (verifyResult) Then
Console.WriteLine("Signature verified")
End If
End Function
' Тестовый документ для подписи / проверки.
Dim SourceDocument As String = "" &
"<ЭДПФР xmlns = ""http://пф.рф/СЗВ-ТД/2020-09-26"" xmlns:АФ5=""http://пф.рф/АФ/2018-12-07"" xmlns:УТ2=""http://пф.рф/УТ/2017-08-21"">" &
" <СЗВ-ТД>" &
" <Работодатель>" &
" <УТ2:РегНомер>099-099-154154</УТ2:РегНомер>" &
" <НаименованиеОрганизации>_тест_Демо организация 1</НаименованиеОрганизации>" &
" <УТ2:ИНН>9676756170</УТ2:ИНН>" &
" <УТ2:КПП>999901001</УТ2:КПП>" &
" </Работодатель>" &
" <ЗЛ>" &
" <УТ2:ФИО>" &
" <УТ2:Фамилия>Иванов</УТ2:Фамилия>" &
" <УТ2:Имя>Иван</УТ2:Имя>" &
" <УТ2:Отчество>Иванович</УТ2:Отчество>" &
" </УТ2:ФИО>" &
" <ДатаРождения>1990-01-01</ДатаРождения>" &
" <УТ2:СНИЛС>175-577-998 44</УТ2:СНИЛС>" &
" <ТрудоваяДеятельность>" &
" <Мероприятие>" &
" <UUID>cdb7cac6-31e1-4d3d-bb84-6a70be6bccc6</UUID>" &
" <Дата>2021-08-13</Дата>" &
" <Вид>1</Вид>" &
" <Сведения>Прием на работу</Сведения>" &
" <Должность>Сотрудник</Должность>" &
" <ВидПР>Страховые агенты</ВидПР>" &
" <КодВФпоОКЗ>3321.8</КодВФпоОКЗ>" &
" <Основание>" &
" <Наименование>Приказ</Наименование>" &
" <Дата>2021-08-13</Дата>" &
" <Номер>102</Номер>" &
" <Серия>102</Серия>" &
" </Основание>" &
" </Мероприятие>" &
" </ТрудоваяДеятельность>" &
" </ЗЛ>" &
" <ДатаЗаполнения>2021-08-16</ДатаЗаполнения>" &
" <Руководитель>" &
" <УТ2:ФИО>" &
" <УТ2:Фамилия>Евсеев</УТ2:Фамилия>" &
" <УТ2:Имя>Юстин</УТ2:Имя>" &
" <УТ2:Отчество>Тестович</УТ2:Отчество>" &
" </УТ2:ФИО>" &
" <УТ2:Должность>бухгалтер</УТ2:Должность>" &
" </Руководитель>" &
" </СЗВ-ТД>" &
" <СлужебнаяИнформация>" &
" <АФ5:GUID>cea9cb8b-9080-4d14-8ab2-7540cbcc1a6d</АФ5:GUID>" &
" <АФ5:ДатаВремя>2021-08-16T15:52:01+03:00</АФ5:ДатаВремя>" &
" </СлужебнаяИнформация>" &
"</ЭДПФР>"
End Module