提问者:小点点

使用signxml时签名有效负载无效,但xmlsec one有效


你能帮我找出为什么两个库(signxml和xmlsec)不签名相同吗?服务器接受的签名是xmlsec。

代码符号signxml:

signer = XMLSigner(
    method=methods.enveloped,
    signature_algorithm="rsa-sha1",
    digest_algorithm='sha1',
    c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
ns = {}
ns[None] = signer.namespaces['ds']
signer.namespaces = ns

signed_root = signer.sign(xml_element, key=self.chave, cert=self.certificado, reference_uri=None)

但是签名的有效负载不正确,最终导致签名验证失败错误/获取错误消息以检查签名。当我使用xmlsec时,它以正确的方式生成。但是我必须使用signxml,因为它没有平台依赖关系。在这里附加了两个xml输出文件。

https://github.com/XML-Security/signxml/files/6207744/signs.zip

这里的有效载荷payload. txt

我看到Signxml生成的输出文档中缺少发行人详细信息标记,xmlsec生成的输出中有两个参考URI和摘要方法和值,但在signxml上只看到一个。如何使signxml生成并验证签名并能够成功SOAAPI调用?

XMLSec代码:参考https://github.com/orcasgit/py-wsse/blob/ff4fea90687606af31d4b31cbdb3e753154299a4/wsse/signing.py#L19

wsse = signing.sign(envelope=envelope, keyfile=key_path, certfile=cert_path)
signing.verify(envelope=wsse.decode(), certfile=cert_path)

我将感谢任何人在这方面的任何帮助。


共1个答案

匿名用户

最后,我能够生成由signxml. XMLVerifier()使用它验证的XML签名。之前无法验证生成的签名,但这确实成功了lxml.etree.tostring(signed_root)感谢您的精彩帖子:https://technotes.shemyak.com/posts/xml-signatures-with-python-elementtree/.带有签名的Payload也能够从远程服务器获得响应。

import lxml
import signxml
from xml.etree import ElementTree

key = open("key.pem").read()
cert = open("cert.pem").read()

root = ElementTree.fromstring(payload, parser=lxml.etree.XMLParser())

signed_root = signxml.XMLSigner(method=signxml.methods.enveloped).sign(root, key=key, cert=cert)
data_serialized = lxml.etree.tostring(signed_root)

# Now able to verify this
signxml.XMLVerifier().verify(data_serialized, x509_cert=cert)

#To get the signed XML
print(data_serialized.decode())