Python签名XML时设置签名标签无命名空间致验证失败求助
解决XML签名无命名空间时验证失败的问题
问题出在签名时指定了默认命名空间为ds,但验证时未同步该设置,导致验证过程中对SignedInfo等元素的规范化(C14N)处理结果和签名时不一致,最终触发"bad signature"错误。
解决方案:验证时同步设置命名空间映射
在创建XMLVerifier实例后,同样设置namespaces属性,与签名时的配置保持一致:
import signxml from lxml import etree root = etree.parse('...') with open('...', 'r') as f: cert = f.read() with open('...', 'r') as f: key = f.read() # 签名部分保持原有配置 signer = signxml.XMLSigner( method=signxml.methods.enveloped, c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments' ) signer.namespaces = {None: signxml.namespaces.ds} signed_root = signer.sign(root, key=key, cert=cert) # 验证部分添加命名空间映射配置 verifier = signxml.XMLVerifier() verifier.namespaces = {None: signxml.namespaces.ds} verifier.verify(signed_root, ca_pem_file='...').signed_xml
原理说明
当你设置signer.namespaces = {None: signxml.namespaces.ds}时,所有DSIG相关元素(如<Signature>、<SignedInfo>)都会被放在默认命名空间下(不带前缀)。验证过程中,XMLVerifier需要识别这些元素属于DSIG命名空间才能正确执行规范化和签名校验——如果不设置相同的命名空间映射,验证器会将这些元素视为无命名空间的普通元素,导致生成的规范化字节流与签名时的不一致,最终验证失败。
内容的提问来源于stack exchange,提问作者Uncle Sam
相关产品推荐
相关产品推荐

