我尝试使用WS-Security从gSOAP web服务复制XMLDSig,但是签名永远不匹配。该服务使用rsa-sha1,我可以访问公钥和私钥
我通过regex获取元素的bytestring,包括后面的制表符(b'\t'),因此它与原始的逐字节相同,我尝试使用相同的私钥对其进行签名(或者,我尝试使用公钥验证签名),但没有效果
目前,我正在尝试移除制表符(b'\t'),使其与XML根目录齐平:
def extractSigInfFromHttp(data):
f = io.BytesIO(data)
root = etree.parse(f)
data = c14n(nodes=root, algorithm='http://www.w3.org/2001/10/xml-exc-c14n#')
filtered = re.search(b'<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">\n([\s\S]+)</ds:SignedInfo>', data)
if(filtered):
sig = filtered.group(1)
newsig = re.sub(b'\t\t\t\t', b'', sig)
return newsig + b'</ds:SignedInfo>'
正如您在代码中看到的,在签名/验证之前,我也在做c14n
但是签名从来没有匹配/验证过。。。有没有人能告诉我元素是以哪种形式的gSOAP WSS或WSS进行一般处理的?我可以在网上找到的XMLDSig示例总是将元素显示为根元素,或者从来没有显示到底消化了什么
在联系gSOAP支持人员之后,我被告知要使用未缩进的XML,因为缩进的XML的行为非常不可预测
此外,我最终使用了
signxml.XMLVerifier().verify
并在signedInfo变量得到验证之前抓取它。基本上,这里的方法是在xml上构建一个etree
,并在那里提取SignedInfo元素。不知道它与字节(子)字符串到底有什么不同,但这使得M2Crypto验证工作正常相关问题 更多 >
编程相关推荐