0

每次我尝试将 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/的说明

4

1 回答 1

0

原来保存文档时是换行符。我在保存 .xml 文件之前将 .PreserveWhitespace 属性设置为 true ,但它似乎没有工作。

于 2019-06-17T20:30:04.493 回答