golang/goxmldig - 签名验证失败

3

我试图签署一个实体描述文件,但签名一直不正确,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)

你能确认saml.crt文件的内容与你放在pastebin上的PEM块内容完全相同吗?如果我使用goxmldsig进行验证,它会按预期执行。 - fuglede
@fuglede 是的,它们是相同的。 - smokedice
1个回答

2
似乎问题与在某些元素中包含此属性有关:
xml:lang="en"

For example in:

<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>

这使得签名无效。

非常好的发现!你知道这是为什么吗?这个例子来自于shibboleth网站,xml:lang属性也在官方XSD中有描述。 - smokedice
@smokedice:我不确定为什么会发生这种情况。看起来是github.com/russellhaering/goxmldsig的问题。值得向他们报告一个问题以供调查。 - eugenioy
1
请查看以下 GitHub 问题链接:https://github.com/russellhaering/goxmldsig/issues/28 - smokedice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接