你能帮我找出为什么两个库(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)
我将感谢任何人在这方面的任何帮助。
最后,我能够生成由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())