2012-03-14 2 views
1

내 django/python 앱에서 내 SSO/SAML 공급자로부터 반환 된 XML 응답에 포함 된 서명을 확인하기 위해 M2Crypto를 사용하려고 시도하고 있지만 얻을 수없는 것 같습니다. 작업.Python/M2Crypto를 사용하여 SAML 서명 확인

내 XML 응답은 두 번째 예제 here과 비슷합니다.

수신자 :here's 내 실제의 pastelistbin입니다.

내가 검증을 시도하기 위해이 같은 일부 코드를 사용하고 있습니다 : 나는 당겨 할 수 있기 때문에,

def verify_signature(signed_info, cert, signature): 
    from M2Crypto import EVP, RSA, X509 

    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(signature.decode('base64')) 
    result = verify_EVP.verify_final(signed_info) 

    return result 

내가 성공적으로 응답에서 NameID을 얻을 수 있고, 내가 성공적으로 인증서를로드하고있어 알고 발행인 등을 포함 할 수 있습니다.

비록 XML에서 전달 된 해시를 시도했으나 다양한 부분을 인코딩하지 않고 signed_info 매개 변수 (SignedInfo 태그, Response 태그, 전체 태그)에 대해 다양한 XML 비트를 전달했습니다.), 그리고 XML을 독점적으로 정규화되도록하려면 ElementTree/ElementC14N.py을 사용하여 변환을 시도 했으므로 시도했지만 긍정적 인 결과를 얻지는 못했습니다.

무엇이 여기에 있습니까? 잘못된 XML에 대해 유효성을 검사하려고합니까? 내 확인 기술에 문제가 있습니까?

+0

@Ennael을 알아 냈습니까? 당신은 [내 질문] (http://stackoverflow.com/questions/21209510/validating-saml-signature-in-python) 좀 봐 줄래? –

답변

1

너무 가까이에! signed_info를 verify_update로 전달한 다음 verify_final을 전달하여 서명을 전달해야합니다.

서명을 확인하기 전에 signed_info가 올바르게 표준화되어 있는지 확인해야합니다.

다음은 올바른 방법입니다 :

def verify_signature(signed_info, cert, signature): 
    from M2Crypto import EVP, RSA, X509 

    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) 
    result = verify_EVP.verify_final(signature.decode('base64')) 

    return result 
+0

감사합니다. 기회가 생기면 다시이 프로젝트로 돌아가서 시도해 보겠습니다. – Ennael

1

가 참고로, 난 당신과 같은 문제에 직면하였고, 파이썬에서 XML 서명의 유효성을 확인하는 데 유용한 소프트웨어를 찾을 수 없습니다, 그래서 새로운 라이브러리를 썼다 : https://github.com/kislyuk/signxml.

from lxml import etree 
from signxml import xmldsig 

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

root = ElementTree.fromstring(signature_data) 
xmldsig(root).verify(x509_cert=cert) 
+0

이 작업은 Windows에서 가능합니까? – digz6666