【问题标题】:Sign SAML Response in Python在 Python 中签署 SAML 响应
【发布时间】:2020-10-10 16:13:54
【问题描述】:

我需要签署一个 SAML 断言,因为可以在此页面上执行此操作: https://www.samltool.com/sign_response.php

就我而言,我使用的是 Python,而我的 SAML 位于字符串中。

你有什么建议?

最好的问候,

尼科。

【问题讨论】:

    标签: python-3.x saml-2.0 onelogin


    【解决方案1】:

    我终于使用signxml lib 成功了。

    提醒一下,我想签署 SAML 断言。

    我从文件中获取未签名的 SAML。然后我将这个标签 放在 Issuer 标签和 Subject 标签之间,正如signxml lib推荐的那样。最后,我签署我的 SAML 并验证签名。请注意,我更改了 c14n_algorithm 以与我的服务兼容。

    代码如下:

    import re
    from lxml import etree
    from signxml import XMLSigner, XMLVerifier
    
    with open('saml_to_sign.xml', 'r') as file :
        data_to_sign = file.read()
    with open("/vagrant/my_cert.crt", "r") as cert,\
            open("/vagrant/my_key.key", "r") as key:
        certificate = cert.read()
        private_key = key.read()
    
    p = re.search('<Subject>', data_to_sign).start()
    tmp_message = data_to_sign[:p]
    tmp_message = tmp_message +\
                  '<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="placeholder"></ds:Signature>'
    data_to_sign = tmp_message + data_to_sign[p:]
    print(data_to_sign)
    
    saml_root = etree.fromstring(data_to_sign)
    signed_saml_root = XMLSigner(c14n_algorithm="http://www.w3.org/2001/10/xml-exc-c14n#")\
        .sign(saml_root, key=private_key, cert=certificate)
    verified_data = XMLVerifier().verify(signed_saml_root, x509_cert=certificate).signed_xml
    signed_saml_root_str = etree.tostring(signed_saml_root, encoding='unicode')
    print(signed_saml_root_str)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      相关资源
      最近更新 更多