我需要通過使用SAML2從第三方在python中實現身份驗證。我查看了pysaml2,發現相當混亂,並且在this question發現Ennael後決定給M2Crypto一個機會。驗證python中的SAML簽名
我收到的SAML令牌can be found here。我已經從Assertion
標記(用戶的SSN,IP和SAML令牌到期窗口)中提取了所需的全部信息,但我無法從Ennael獲得verify_signature
函數(和revised code從Ezra Nugroho)返回True。我也嘗試將verify_EVP.reset_context(md='sha1')
更改爲verify_EVP.reset_context(md='sha256')
,但是這也不起作用。
我想我的錯誤必須在signed_info部分。那部分我通過verify_signature
什麼?我必須以任何方式預處理它嗎?我一直在研究Transform標籤,但不知道接下來的位置。
任何幫助將不勝感激。如果有人在混淆之前需要使用XML來測試並幫助我完成下一步操作。
編輯這是我的代碼(非常相似,我掛東西的主要功能是在底部):
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:是否有可能我需要一些更多的信息第三方身份驗證提供程序?我需要私鑰嗎?
您可能想顯示您的代碼,以便有人可以幫助您。 – hughdbrown
完成 - 認爲鏈接就夠了。 –
你不需要第三方提供商提供的任何東西,你也不需要私鑰來檢查簽名 –