Проверка подписи SAML в python

Мне нужно реализовать аутентификацию в Python от стороннего производителя с использованием SAML2. Я смотрел вpysaml2 и обнаружил, что это довольно запутанно, и решил датьM2Crypto шанс после того, как я нашелэтот вопрос поEnnael.

Токен SAML, который я получаюможно найти здесь, Я уже извлек всю необходимую информацию изAssertion тег (SSN, IP-адрес пользователя и окно истечения срока действия токенов SAML), но я не могу получитьverify_signature функция от Эннаэль (ипересмотренный код изЭзра Нугрохо) чтобы вернуть True. Я также пытался изменитьverify_EVP.reset_context(md='sha1') вverify_EVP.reset_context(md='sha256') но это тоже не сработало.

Я думаю, что моя ошибка должна быть в подписанной части. Что я передаю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)

ОБНОВИТЬ: Возможно ли мне нужно больше информации от стороннего поставщика аутентификации? Нужен ли мне закрытый ключ для всего этого?

Ответы на вопрос(2)

Ваш ответ на вопрос