我正在尝试使用 M2Crypto 来验证从我的 django/python 应用程序中的 SSO/SAML 提供程序返回的 XML 响应中包含的签名,但我似乎无法让它工作。
我的 XML 响应看起来有点像第二个示例here http://www.codeproject.com/Articles/18664/Security-Assertion-Markup-Language-SAML2-0.
ETA: And here's http://pastebin.com/SqisS4Qv我的实际 XML 的粘贴箱。
我正在使用类似这样的代码来尝试验证:
def verify_signature(signed_info, cert, signature):
from M2Crypto import EVP, RSA, X509
x509 = X509.load_cert_string(base64.decodestring(cert), X509.FORMAT_DER)
pubkey = x509.get_pubkey().get_rsa()
verify_EVP = EVP.PKey()
verify_EVP.assign_rsa(pubkey)
verify_EVP.reset_context(md='sha1')
verify_EVP.verify_init()
verify_EVP.verify_update(signature.decode('base64'))
result = verify_EVP.verify_final(signed_info)
return result
我可以从响应中成功获取 NameID,并且我知道我已成功加载证书,因为我可以从中提取颁发者等。
不过,至于签名,我尝试对传入的 XML 进行哈希处理,对各个部分进行编码/不编码,并传入 XML 的各个位signed_info
参数(SignedInfo 标签、Response 标签、整个事情),我尝试使用 ElementTree/元素C14N.py https://bitbucket.org/effbot/et-2009-provolone/src/35607128f5bb/elementtree/elementtree/ElementC14N.py确保 XML 完全规范化,正如转换暗示应该完成的那样,但我没有得到积极的结果。
我在这里缺少什么?我是否尝试验证错误的 XML?我的验证技术有问题吗?