Мне нужно реализовать аутентификацию на python от стороннего пользователя с помощью SAML2. Я просмотрел pysaml2 и нашел, что это довольно запутанно, и решил дать M2Crypto шанс после того, как я нашел this question от Ennael.Проверка подписи SAML в python
Значок SAML принимаю can be found here. Я уже извлек всю необходимую мне информацию из тега Assertion
(имя пользователя SSN, IP и окно выхода токенов SAML), но я не могу получить функцию verify_signature
от Ennael (и revised code от Ezra Nugroho), чтобы вернуть True. Я также попытался изменить verify_EVP.reset_context(md='sha1')
на verify_EVP.reset_context(md='sha256')
, но это тоже не сработало.
Я думаю, что моя ошибка должна быть в разделе signed_info. Что я перехожу на verify_signature
для этой части? Должен ли я препроцитировать его каким-либо образом? Я смотрел в тег Transform, но не знаю, где тоже смотреть дальше.
Любая помощь будет принята с благодарностью. Если кому-то нужен XML перед запутыванием, чтобы проверить и помочь мне просто PM мне.
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: Возможно ли мне нужно больше информации от сторонний поставщик аутентификации? Мне нужен секретный ключ для любого из этого?
Возможно, вы захотите показать свой код, чтобы кто-то мог вам помочь. – hughdbrown
Готово - думал, ссылок будет достаточно. –
вам не нужно ничего от стороннего провайдера, и вам не нужен секретный ключ для проверки подписей. –