golang/goxmldig - 签名验证失败

标签 go xml-signature

我试图签署一个实体描述 rune 件,但签名总是不正确。 xmlsectool 指出签名是预期的摘要与实际摘要不同。

xmlsectool-2.0.0/xmlsectool.sh --verifySignature --certificate saml.crt --inFile example.xml
INFO  XMLSecTool - Reading XML document from file 'example.xml'
INFO  XMLSecTool - XML document parsed and is well-formed.
WARN  Reference - Verification failed for URI "#id1234"
WARN  Reference - Expected Digest: D+SEh34cA7/atdQ8ojV9rzUcJcJSAslFZ0aOIwplGfI=
WARN  Reference - Actual Digest: EYun0wngsN35ci20wRziCXs0Io7J4bZN+NYRnnTR5QM=
ERROR XMLSecTool - XML document signature verification failed

我遵循了 goxmldsig 上的 README 示例创建以下代码。完整示例在 pastebin 上(stackoverflow 不允许我在此处发布)。

xmlBytes := []byte(`<></>`)
keyPair, err := tls.X509KeyPair(certBytes, keyBytes)
failOnError(err, "invalided to load keypair")

keyStore := dsig.TLSCertKeyStore(keyPair)

signingContext := dsig.NewDefaultSigningContext(keyStore)
signingContext.Canonicalizer = dsig.MakeC14N10ExclusiveCanonicalizerWithPrefixList("")
err = signingContext.SetSignatureMethod(dsig.RSASHA256SignatureMethod)
failOnError(err, "failed to set signature method")

readXMLDoc := etree.NewDocument()
err = readXMLDoc.ReadFromBytes(xmlBytes)
failOnError(err, "cannot parse xml")

elementToSign := readXMLDoc.Root()
elementToSign.CreateAttr("ID", "id1234")

signedElement, err := signingContext.SignEnveloped(elementToSign)
failOnError(err, "failed to sign envelop")

var signedAssertionBuf []byte
{
    readXMLDoc.SetRoot(signedElement)
    signedAssertionBuf, err = readXMLDoc.WriteToBytes()
    failOnError(err, "failed to convert doc to bytes")
}

ioutil.WriteFile("/tmp/test/example.xml", signedAssertionBuf, 0775)

最佳答案

问题似乎与在您的某些元素中包含此属性有关:

xml:lang="en"

例如:

<OrganizationName xml:lang="en">Your Identities</OrganizationName>

如果您删除所有元素的 xml:lang="en",生成的签名将变为有效且经过正确验证。

据我所知,当您包含该属性时,写在实际 XML 文档上的元素似乎变成了这样:

<OrganizationName xmlns:xml="http://www.w3.org/XML/1998/namespace" xml:lang="en">Your Identities</OrganizationName>

这使得签名无效。

关于golang/goxmldig - 签名验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45655516/

相关文章:

c# - 无法验证 XML 文件的签名,包括 c# 中的注释

c# - 在 SOAP 请求中添加 KeyInfo 引用

c# - 如何使用 <x509certificate>(不是证书文件)在 C# 中验证 XML 文件的签名?

go - 无法为 SAML 响应创建正确的签名

go - 这是 Go 中组合的有效实现吗?

go - GoBuffalo CSRF生产上的问题

c# - 不带参数的 RSASSA-PSS 使用 SHA-256 .Net 4.5 支持

templates - 戈朗 : Help registering a function into templates

go - 如何在Go中依赖 fork 的第三方依赖关系

go - 如何操作 Hyper-v WMI 类和方法