2014-12-11 5 views
0

Аналогичный вопрос задан раньше, но информация об этом не была отправлена ​​для отладки.Отладка подтверждения утверждения SAML на Python

Если я работаю с этим кодом:

from lxml import etree 
import base64 
from M2Crypto import EVP, RSA, X509 

decoded_assertion = base64.b64decode(assertion) 

root = etree.XML(decoded_assertion) 
signature_node = root.find('{http://www.w3.org/2000/09/xmldsig#}Signature') 
signature_value = signature_node.find('{http://www.w3.org/2000/09/xmldsig#}SignatureValue').text 
signed_info = signature_node.find('{http://www.w3.org/2000/09/xmldsig#}SignedInfo') 
signed_info_string_c14n = etree.tostring(signed_info,method="c14n") 

certificate_node = root.find('{http://www.w3.org/2000/09/xmldsig#}Signature')\ 
     .find('{http://www.w3.org/2000/09/xmldsig#}KeyInfo')\ 
     .find('{http://www.w3.org/2000/09/xmldsig#}X509Data')\ 
     .find('{http://www.w3.org/2000/09/xmldsig#}X509Certificate') 

x509 = X509.load_cert_string(base64.decodestring(certificate_node.text), 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_string_c14n) 
result = verify_EVP.verify_final(signature_value.decode('base64')) 

print result 

Есть ли способ сказать verify_EVP.verify_final сделать больше, чем просто возвращает значение 0, если проверка не пройдена? Я не знаю, с чего начать отлаживать.

ответ

1

У меня возникла проблема проверки утверждений SAML криптографически в Python и не найдено хорошего готового решения от m2crypto (которое, насколько мне известно, не поддерживается, не поддерживается, а не совместимо с Python 3), ни в другом библиотеки. Поэтому я написал свою собственную библиотеку SignXML (https://github.com/kislyuk/signxml). Вот основная схема проверки утверждения SAML с ним:

from lxml import etree 
from base64 import b64decode 
from signxml import xmldsig 

with open("metadata.xml", "rb") as fh: 
    cert = etree.parse(fh).find("//ds:X509Certificate").text 

assertion_data = xmldsig(b64decode(assertion_body)).verify(x509_cert=cert) 
Смежные вопросы