gpt4 book ai didi

python - 使用 Python/M2Crypto 进行 SAML 签名验证

转载 作者:行者123 更新时间:2023-11-30 23:45:09 25 4
gpt4 key购买 nike

我正在尝试使用 M2Crypto 验证从我的 django/python 应用程序中的 SSO/SAML 提供商返回的 XML 响应中包含的签名,但我似乎无法让它工作。

我的 XML 响应看起来有点像第二个示例 here .

预计到达时间: 以及 here's我的实际 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 进行哈希处理,对各个部分进行编码/不编码,并为 signed_info 参数(SignedInfo 标记,响应标签,整个事情),我尝试使用 ElementTree/ElementC14N.py确保 XML 完全规范化,正如转换暗示应该完成的那样,但我没有得到积极的结果。

我在这里缺少什么?我是否尝试验证错误的 XML?我的验证技术有问题吗?

最佳答案

你们离得太近了!您应该将signed_info 传递给verify_update,然后将签名传递给verify_final。

在验证签名之前,您确实需要确保您的signed_info 已正确规范化。

正确的方法是:

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(signed_info)
result = verify_EVP.verify_final(signature.decode('base64'))

return result

关于python - 使用 Python/M2Crypto 进行 SAML 签名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com