Подписать ответ SAML в Python

#python-3.x #saml-2.0 #onelogin

#python-3.x #saml-2.0 #onelogin

Вопрос:

Мне нужно было бы подписать утверждение SAML, как это можно сделать на этой странице: https://www.samltool.com/sign_response.php

Со своей стороны, я использую Python, и мой SAML находится в виде строки.

Что бы вы посоветовали?

С наилучшими пожеланиями,

Нико.

Ответ №1:

Я, наконец, сделал это, используя библиотеку signxml.

Просто чтобы напомнить, я хотел подписать утверждение SAML.

Я получаю неподписанный SAML из файла. Затем я помещаю этот тег <ds:Signature xmlns:ds=»http://www.w3.org/2000/09/xmldsig #» Id=»заполнитель»></ds:Подпись> между тегом эмитента и тегом темы, как это рекомендовано библиотекой signxml. И, наконец, я подписываю свой 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)