我需要使用 SAML2 从第三方在 python 中实现身份验证。我调查过pysaml2并发现这很令人困惑,并决定给予M2Crypto我发现之后有机会这个问题 by Ennael.
我收到的 SAML 令牌可以在这里找到。我已经从其中提取了我需要的所有信息Assertion
标签(用户的 SSN、IP 和 SAML 令牌过期窗口),但我无法获取verify_signature
来自 Ennael 的函数(以及修改后的代码 from 埃兹拉·努格罗霍) 返回 True。我也曾尝试过改变verify_EVP.reset_context(md='sha1')
to verify_EVP.reset_context(md='sha256')
但这也不起作用。
我想我的错误一定是在signed_info部分。我要传递什么verify_signature
对于那部分?我必须以任何方式对其进行预处理吗?我一直在研究 Transform 标签,但不知道下一步该看哪里。
任何帮助将不胜感激。如果有人需要混淆前的 XML 来测试并帮助我,请私信我。
EDIT这是我的代码(与我链接到的代码非常相似。主要功能位于底部):
def verify_signature(signed_info, cert, signature):
from M2Crypto import EVP, RSA, X509, m2
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)
return verify_EVP.verify_final(signature.decode('base64'))
def decode_response(resp):
return base64.b64decode(resp)
def get_xmldoc(xmlstring):
return XML(xmlstring)
def get_signature(doc):
return doc.find('{http://www.w3.org/2000/09/xmldsig#}Signature')
def get_signed_info(signature):
signed_info = signature.find(
'{http://www.w3.org/2000/09/xmldsig#}SignedInfo')
signed_info_str = tostring(signed_info)
# return parse(StringIO(signed_info_str))
return signed_info_str
def get_cert(signature):
ns = '{http://www.w3.org/2000/09/xmldsig#}'
keyinfo = signature.find('{}KeyInfo'.format(ns))
keydata = keyinfo.find('{}X509Data'.format(ns))
certelem = keydata.find('{}X509Certificate'.format(ns))
return certelem.text
def get_signature_value(signature):
return signature.find(
'{http://www.w3.org/2000/09/xmldsig#}SignatureValue').text
def parse_saml(saml):
dec_resp = decode_response(saml)
xml = get_xmldoc(dec_resp)
signature = get_signature(xml)
signed_info = get_signed_info(signature)
cert = get_cert(signature)
signature_value = get_signature_value(signature)
is_valid = verify_signature(signed_info, cert, signature_value)
UPDATE:我是否需要第三方身份验证提供商提供更多信息?我需要私钥才能完成这些操作吗?