VB.Net signatureXml «Недопустимый символ в строке Base-64» - PullRequest
0 голосов
/ 17 июня 2019

Я получаю сообщение об ошибке каждый раз, когда пытаюсь загрузить файл XML на определенный сервер. Возвращает «Недопустимый символ в строке Base-64». Вот код, который я использую для подписи:

 Public Sub Assinar03(ByVal strArqXMLAssinar As String, ByVal strUri As String, ByVal x509Certificado As X509Certificate2, ByVal strArqXMLAssinado As String)
    Dim SR As StreamReader = Nothing
    SR = File.OpenText(strArqXMLAssinar)
    Dim vXMLString As String = SR.ReadToEnd()
    SR.Close()
    Dim _xnome As String = String.Empty
    Dim _serial As String = String.Empty
    If x509Certificado IsNot Nothing Then
        _xnome = x509Certificado.Subject.ToString()
        _serial = x509Certificado.SerialNumber
    End If
    Dim _X509Cert As New X509Certificate2()
    Dim store As New X509Store("MY", StoreLocation.CurrentUser)
    store.Open(OpenFlags.[ReadOnly] Or OpenFlags.OpenExistingOnly)
    Dim collection As X509Certificate2Collection = DirectCast(store.Certificates, X509Certificate2Collection)
    Dim collection1 As X509Certificate2Collection = DirectCast(collection.Find(X509FindType.FindBySerialNumber, _serial, False), X509Certificate2Collection)
    If collection1.Count > 0 Then
        _X509Cert = Nothing
        For i As Integer = 0 To collection1.Count - 1
            If DateTime.Now < collection1(i).NotAfter OrElse Not _X509Cert Is Nothing AndAlso _X509Cert.NotAfter < collection1(i).NotAfter Then
                _X509Cert = collection1(i)
            End If
        Next
        If _X509Cert Is Nothing Then _X509Cert = collection1(0)
        Dim doc As New XmlDocument()
        doc.PreserveWhitespace = False

        doc.LoadXml(vXMLString)
        Dim qtdeRefUri As Integer = doc.GetElementsByTagName(strUri).Count

        Dim reference As New Reference()
        Dim keyInfo As New KeyInfo()
        Dim signedXml As New SignedXml(doc)
        signedXml.SigningKey = _X509Cert.PrivateKey
        Dim _Uri As XmlAttributeCollection = doc.GetElementsByTagName(strUri).Item(0).Attributes
        For Each _atributo As XmlAttribute In _Uri
            If _atributo.Name.ToLower.Trim = "Id".ToLower.Trim Then
                reference.Uri = "#" + _atributo.InnerText
            End If
        Next
        If reference.Uri Is Nothing Then reference.Uri = ""
        reference.DigestMethod = SignedXml.XmlDsigSHA1Url
        '--------------------------------------------------
        Dim env As New XmlDsigEnvelopedSignatureTransform()
        env.Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature"
        reference.AddTransform(env)
        '--------------------------
        Dim c14 As New XmlDsigC14NTransform(False)
        c14.Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
        reference.AddTransform(c14)
        '--------------------------
        signedXml.AddReference(reference)
        keyInfo.AddClause(New KeyInfoX509Data(_X509Cert))
        '--------------------------
        signedXml.KeyInfo = keyInfo
        signedXml.ComputeSignature()
        '--
        Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
        XMLDoc = New XmlDocument()
        XMLDoc.PreserveWhitespace = False
        XMLDoc = doc
        Me.vXMLStringAssinado = XMLDoc.OuterXml
        '-----------
        Dim SW_2 As StreamWriter = File.CreateText(strArqXMLAssinado)
        SW_2.Write(Me.vXMLStringAssinado)
        SW_2.Close()
        '-----------
    End If
    SR.Close()
End Sub

Что-то еще, что я должен добавить к коду? Руководство говорит мне следовать инструкциям от https://www.w3.org/TR/xmldsig-core/

1 Ответ

0 голосов
/ 17 июня 2019

Оказывается, это был разрыв строки при сохранении документа.Я установил для свойства .PreserveWhitespace значение true перед сохранением файла .xml, и, похоже, он не работает.

...