【问题标题】:.NET SignedXml giving wrong digest value.NET SignedXml 给出错误的摘要值
【发布时间】:2020-01-02 18:14:31
【问题描述】:

我正在尝试制作一个签名的 XML 文档,而我将其发送到的 Web 服务拒绝它并声明签名无效。我在 php 中有一些其他代码,它可以工作,Web 服务接受 php 生成和签名的 xml,但不接受 vb.net 的。我已经使 php 和 vb.net 输入 xml 完全相等,但它们仍然生成不同的摘要值。我还尝试使用an online tool 来验证 xml 签名,并且 php 签名在那里是正确的,对于 vb.net,它说摘要值是错误的。这是我在 vb 中计算签名的函数:

Private Function PotpisiXml(cert As X509Certificate2, ByVal rsa As RSACryptoServiceProvider, ByVal xmlStream As MemoryStream) As XmlDocument
    xmlStream.Position = 0
    Dim xmlDoc As New XmlDocument()
    xmlDoc.Load(xmlStream)
    Dim signedXml As New SignedXml(xmlDoc)
    signedXml.SigningKey = rsa

    Dim reference As New Reference()
    reference.Uri = "#racunId"
    Dim env As New XmlDsigEnvelopedSignatureTransform()
    Dim ec14n As New XmlDsigExcC14NTransform()
    reference.AddTransform(env)
    reference.AddTransform(ec14n)
    signedXml.AddReference(reference)

    Dim keyInfo As New KeyInfo()
    Dim kdata As New KeyInfoX509Data(cert)
    Dim xserial As X509IssuerSerial
    xserial.IssuerName = cert.IssuerName.Name
    xserial.SerialNumber = cert.SerialNumber
    kdata.AddIssuerSerial(xserial.IssuerName, xserial.SerialNumber)
    keyInfo.AddClause(kdata)

    signedXml.ComputeSignature()
    signedXml.KeyInfo = keyInfo
    Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()

    xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature, True))
    Return xmlDoc
End Function

vb.net生成的xml:https://pastebin.com/jrzLsv4k

php生成的xml:https://pastebin.com/kbsE2PH7

用于签名的 xmlDoc 对于两个代码完全相同。双方编码均为 UTF-8。

【问题讨论】:

  • 我知道 Java 的默认填充模式与 c# 不同。怀疑php和java一样,vb.net和c#一样。您还必须知道加密是 32 位还是 64 位。有很多组合。加密与 TLS 非常相似,并且有一个很好的 wiki 站点显示所有组合:en.wikipedia.org/wiki/Transport_Layer_Security

标签: .net xml vb.net web-services rsa


【解决方案1】:

我已通过删除过程中各处的所有空格和换行符来解决此问题。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2015-05-17
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2021-06-30
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多