2012-03-14 99 views
1

我正在嘗試使用M2Crypto來驗證從我的django/python應用程序中從我的SSO/SAML提供程序返回的XML響應中包含的簽名,但我似乎無法得到它工作。SAML簽名驗證使用Python/M2Crypto

我的XML響應看起來有點像第二個示例here

ETA:here's我的實際XML的pastebin。

我使用一些像這樣的代碼來嘗試驗證:

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參數的各種XML位(SignedInfo標記,Response標記,整個事情),並且我嘗試過使用ElementTree/ElementC14N.py來確保XML是完全規範化的,因爲Transform暗示應該完成,但是我沒有得到正面結果。

我在這裏錯過了什麼?我想驗證錯誤的XML嗎?我的驗證技術有問題嗎?

+0

你有沒有想過@Ennael?你介意看看[我的問題](http://stackoverflow.com/questions/21209510/validating-saml-signature-in-python)? – 2014-01-20 12:43:05

回答

1

你太親近了!您應該傳遞verify_update signed_info,然後通過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 2013-07-05 18:55:47

1

僅供參考,我正面臨着同樣的問題,因爲你,並沒有發現任何有用的軟件在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 2017-04-17 11:24:04