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



你能帮我找出为什么这两个库(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生成的输出文档中缺少Issuer details标记,在xmlsec生成的输出中有两个Reference URI和digest方法和值,但在signxml上只看到一个。我如何制作signxml来生成和验证签名,并能够成功地进行SOA API调用?

XMLSec代码:Refhttps://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/.具有签名的有效负载也能够从远程服务器获得响应。

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

相关内容

  • 没有找到相关文章

最新更新