2012-03-14 12 views
1

私のdjango/pythonアプリケーションで、私のSSO/SAMLプロバイダから返されたXML応答に含まれる署名をM2Cryptoを使って検証しようとしていますが、作業。Python/M2Cryptoを使用したSAML署名の確認

私のXML応答は、2番目の例のように見えますhere

ETA:here's実際のXMLのペーストビン。

私が検証を試みるように、このようないくつかのコードを使用しています:

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 

私は引くことができますので、私は成功した応答から名前IDを取得することができますし、私は成功した証明書をロードしています知っています発行者などがそれに含まれています。

しかし、私は、渡されたXMLをハッシュし、様々な部分をエンコードしないで、signed_infoパラメータ(SignedInfoタグ、Responseタグ、全体私はElementTree/ElementC14N.pyを使用して、XMLが独占的に正規化されていることを確認しようとしました。これは、Transformの実行が必要であることを意味しますが、肯定的な結果は得られません。

私はここで何が欠けていますか?間違った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

はFYI、私はあなたと同じ問題に直面していた、とPythonで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

関連する問題