2016-07-19 3 views
0

У меня есть веб-приложение Python Flask. Я интегрирую OKTA SAML в это приложение для аутентификации.Проверка подписи SAML с флагом Python

Я следовал шаги:

Однако проверка всегда терпит неудачу. Когда я запускаю verify_signature(), он всегда дает мне 0.

Мой код:

def verify_signature(signed_info, cert, signature): 
    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='sha256') 
    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.fromstring(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 = str(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 

# Main Function 
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) 
print is_valid # ALWAYS PRINTS 0. 
+0

Добро пожаловать в переполнение стека! Какие ошибки вы получаете? –

+0

Я не получаю сообщение об ошибке. Все успешно, но проверка всегда терпит неудачу. т.е.: is_valid ВСЕГДА ВОЗВРАЩАЕТСЯ В НУЛЕ. У меня есть ответ SAML, подписанный sha256. –

ответ

0

Я хотел, чтобы направить вас к нашей инструкции для приложений Python: http://developer.okta.com/docs/guides/pysaml2 Кроме того, пожалуйста, следуйте примеру для PySAML2 здесь: https://github.com/jpf/okta-pysaml2-example У вас есть метод для обработки выхода из системы Запросы?

+0

Я получил свое приложение, используя pysaml2. Я также пытался выполнить проверку подписи вручную, для которой используется вышеуказанный код. Но он продолжает терпеть неудачу. –

1

Если у вас есть твердое понимание XML разбора, в XML Signature спецификации, криптографическое хэширование и шифрование с открытым ключом, я сильно призываю вас не написать собственную процедуру проверки SAML.

Для некоторых конкретных примеров того, насколько сложно правильно разобрать SAML, я предлагаю прочитать «On Breaking SAML: Be Whoever You Want to Be», который является отличной академической бумагой, охватывающей различные способы, которыми можно обойти проверку SAML. Кроме того, хороший недавний пример крупной компании, получившей неверную проверку SAML, - «The road to hell is paved with SAML Assertions».

На высоком уровне я предлагаю приложить усилия, чтобы изучить особенности установленной библиотеки проверки SAML, такой как PySAML2, таким образом вы можете извлечь выгоду из работы, которую другие сделали, чтобы избежать распространенных ошибок безопасности в SAML. Для PySAML2 метод validate_signature в файле saml2/sigver.py является хорошим местом для начала.

Если вы по-прежнему заинтересованы в проведении собственной проверки SAML после всех моих предупреждений, я предлагаю посмотреть библиотеку signxml или напрямую с помощью двоичного файла xmlsec1.

Смежные вопросы