在python中从SOAP请求复制/验证XMLDSig

2024-06-09 23:14:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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示例总是将元素显示为根元素,或者从来没有显示到底消化了什么


Tags: orghttp元素datawwwdsroot制表符
1条回答
网友
1楼 · 发布于 2024-06-09 23:14:52

在联系gSOAP支持人员之后,我被告知要使用未缩进的XML,因为缩进的XML的行为非常不可预测

此外,我最终使用了signxml.XMLVerifier().verify并在signedInfo变量得到验证之前抓取它。基本上,这里的方法是在xml上构建一个etree,并在那里提取SignedInfo元素。不知道它与字节(子)字符串到底有什么不同,但这使得M2Crypto验证工作正常

相关问题 更多 >