Python elementtree 查找函数将签名读取为空 (None)
Python elementtree find function reads Signature as empty (None)
我正在尝试使用 ElementTree 从 Python 中已签名的 XML 中读取 Signature、SignatureValue 和 SignedInfo,但它显示为 None。
其他 xml 属性读取正常。如何读取 Signature、SignatureValue 和 SignedInfo?
这是我的代码片段:
xml_file = open(settings.STATIC_ROOT + '/file/test.xml', 'rt').read()
response_xml = xml_et.fromstring(xml_file.encode('utf-8'))
print response_xml.find('Signature') # prints None
print response_xml.find('SignatureValue') # prints None
print response_xml.find('SignedInfo') # prints None
print response_xml.find('OrderID').text # works fine
这是我的测试 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Message date="08/09/2016 06:47:20">
<Version>1.0</Version>
<OrderID>ABCD:123456</OrderID>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>blabla=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>blabla==</SignatureValue>
<KeyInfo>
<KeyName>Public key of certificate</KeyName>
<KeyValue>
<RSAKeyValue>
<Modulus>blabla==</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
<X509Data>
<X509Certificate>blabla</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</Message>
这是因为您在 Signature 元素上有命名空间,
您可以做的是找到具有命名空间
的元素
print response_xml.find('{http://www.w3.org/2000/09/xmldsig#}Signature')
然后你将不得不获取签名元素并从中找到所有子元素
像这样:
namespace = "{http://www.w3.org/2000/09/xmldsig#}"
signature_elem = response_xml.find(namespace +'Signature')
print signature_elem
print signature_elem.find(namespace+'SignatureValue')
print signature_elem.find(namespace+'SignedInfo')
我正在尝试使用 ElementTree 从 Python 中已签名的 XML 中读取 Signature、SignatureValue 和 SignedInfo,但它显示为 None。 其他 xml 属性读取正常。如何读取 Signature、SignatureValue 和 SignedInfo?
这是我的代码片段:
xml_file = open(settings.STATIC_ROOT + '/file/test.xml', 'rt').read()
response_xml = xml_et.fromstring(xml_file.encode('utf-8'))
print response_xml.find('Signature') # prints None
print response_xml.find('SignatureValue') # prints None
print response_xml.find('SignedInfo') # prints None
print response_xml.find('OrderID').text # works fine
这是我的测试 XML:
<?xml version="1.0" encoding="UTF-8"?>
<Message date="08/09/2016 06:47:20">
<Version>1.0</Version>
<OrderID>ABCD:123456</OrderID>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>blabla=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>blabla==</SignatureValue>
<KeyInfo>
<KeyName>Public key of certificate</KeyName>
<KeyValue>
<RSAKeyValue>
<Modulus>blabla==</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
</KeyValue>
<X509Data>
<X509Certificate>blabla</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</Message>
这是因为您在 Signature 元素上有命名空间, 您可以做的是找到具有命名空间
的元素print response_xml.find('{http://www.w3.org/2000/09/xmldsig#}Signature')
然后你将不得不获取签名元素并从中找到所有子元素
像这样:
namespace = "{http://www.w3.org/2000/09/xmldsig#}"
signature_elem = response_xml.find(namespace +'Signature')
print signature_elem
print signature_elem.find(namespace+'SignatureValue')
print signature_elem.find(namespace+'SignedInfo')