You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:53:25