Для работы с WS-Security в Python (особенно при взаимодействии с SOAP-сервисами) можно использовать следующие библиотеки и инструменты:
---
### 1. Zeep + WSSE Plugins
- Zeep — популярная библиотека для работы с SOAP-сервисами.
- Для поддержки WS-Security используется плагин zeep-wsse.
- Что умеет:
- Подпись SOAP-запросов (XML Signature).
- Шифрование данных.
- Добавление токенов безопасности (UsernameToken, Timestamp).
- Пример установки:
pip install zeep
pip install zeep-wsse
- Пример кода:
from zeep import Client
from zeep.wsse.username import UsernameToken
from zeep_wsse.signature import Signature
# Создание клиента с WS-Security
client = Client(
wsdl='https://example.com/service?wsdl',
wsse=Signature(
key_file='private_key.pem',
certfile='certificate.pem',
username_token=UsernameToken('user', 'pass')
)
)
response = client.service.SomeMethod()
---
### 2. xmlsec
- xmlsec — низкоуровневая библиотека для подписи и шифрования XML (используется в связке с lxml).
- Подходит, если требуется ручная работа с XML и WS-Security.
- Установка:
pip install xmlsec lxml
- Пример подписи XML:
from lxml import etree
import xmlsec
# Загрузка XML-шаблона
template = etree.parse('soap_template.xml')
signature_node = xmlsec.template.create(template, xmlsec.Transform.EXCL_C14N, xmlsec.Transform.RSA_SHA1)
# Настройка ключей
key = xmlsec.Key.from_file('private_key.pem', xmlsec.KeyFormat.PEM)
signature_node = template.find('//ds:Signature', namespaces={'ds': xmlsec.DSigNs})
xmlsec.template.add_reference(signature_node, xmlsec.Transform.SHA1, uri='#Body')
xmlsec.template.add_reference(signature_node, xmlsec.Transform.SHA1, uri='#Timestamp')
# Подпись XML
ctx = xmlsec.SignatureContext()
ctx.key = key
ctx.sign(signature_node)
---
### 3. pywsse
- Специализированная библиотека для работы с WS-Security.
- Установка:
pip install pywsse
- Пример:
from pywsse import WSSE
wsse = WSSE()
wsse.set_username_token('user', 'password')
signed_xml = wsse.sign(xml_data, 'private_key.pem', 'certificate.pem')
---
### 4. suds (устаревшая, но иногда используется)
- suds — старая библиотека для SOAP, но с поддержкой WS-Security через плагины.
- Пример с плагином suds-wsse:
pip install suds-wsse
from suds.client import Client
from suds.wsse import Security, UsernameToken
security = Security()
token = UsernameToken('user', 'pass')
security.tokens.append(token)
client = Client('https://example.com/service?wsdl', wsse=security)
---
### Советы:
1. Сертификаты и ключи:
- Для подписи и шифрования потребуются PEM-файлы сертификатов и приватных ключей.
- Убедитесь, что формат ключей совместим с библиотекой (например, RSA, а не EC).
2. Документация сервиса:
- Проверьте требования целевого SOAP-сервиса (алгоритмы подписи, порядок элементов в Security Header).
3. Тестирование:
- Используйте инструменты вроде SoapUI или Postman для проверки корректности подписи.
Если у вас есть конкретный сценарий, уточните — помогу с примером! 😊
DeepSeek