2012-03-14 66 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