Как мне использовать библиотеку Python Zeep для связи с безопасным API SOAP, который требует шифрования определенных тегPython

Программы на Python
Ответить
Anonymous
 Как мне использовать библиотеку Python Zeep для связи с безопасным API SOAP, который требует шифрования определенных тег

Сообщение Anonymous »

Мне нужна помощь в использовании Zeep для создания XML-сообщения, которое включает в себя BinarySecurityTokens и шифрует определенные части сообщения (а именно: UsernameToken и Body)
Сценарий:
  • Проект, над которым я работаю, включает корпоративную конечную точку SOAP (Oracle SOA). Здесь используется SOAP 1.2.
  • Через SoapUI у меня есть полный набор требований, которые мне нужно воспроизвести. В частности, исходящая безопасность:

    Должен иметь токен временной метки с точностью до миллисекунды.
  • Должен иметь токен имени пользователя с одноразовым номером.
  • Должен иметь подпись (BinarySecurityToken с использованием единого сертификата для подписи и элемента подписи в заголовке безопасности для UsernameToken, Timestamp и Body — с использованием определенной пары секретный ключ/сертификат.
  • Должно быть зашифровано с использованием открытого ключа сервера (который у меня есть), а симметричный ключ должен быть зашифрован в EncryptedKey — в частности, необходимо зашифровать токен имени пользователя и текст.
[*]Существует входящая безопасность, поскольку ну, значит, сообщение придется расшифровать с помощью открытого ключа сервера.


Проблема:
  • Я совершенно не понимаю, как мне воспроизвести это на Python. Тестовая среда (которая не использует учетные данные) отлично работает с Zeep, поэтому я знаю, что структура моего сообщения в порядке, но Zeep не поддерживает. mustUnderstand, и я не могу понять, как мне зашифровать части XML. РЕДАКТИРОВАТЬ: я смог сделать это через _soapHeaders в клиентском вызове.
  • Я думал о написании выходных плагинов Zeep для обработки шифрования частей, но я столкнулся с проблемой ниже, выходные плагины запускаются до заполнения заголовков безопасности.
  • Suds-Community — еще один высоко оцененный вариант, поддерживающий дополнительные настройки безопасности, но я не думаю, что он будет работать, поскольку для этого требуется SOAP 1.2, а Suds-Community, похоже, поддерживает только SOAP 1.1. Он также, похоже, не поддерживает BinarySecurityTokens без py-wsse, и py-wsse не может быть установлен из pip.
Возьмите этот кодовый блок:

Код: Выделить всё

timestamp_token = WSU.Timestamp()
today_datetime = datetime.datetime.today()
expires_datetime = today_datetime + datetime.timedelta(minutes=5)
timestamp_elements = [
WSU.Created(today_datetime.strftime("%Y-%m-%dT%H:%M%SZ")),
WSU.Expires(expires_datetime.strftime("%Y-%m-%dT%H:%M%SZ")),
]
timestamp_token.extend(timestamp_elements)
token=UsernameToken(username, password, timestamp_token=timestamp_token)
signature = Signature(private key, cert, password=privatekeypass)
client = Client(wsdl=url,
settings=self.get_settings,
transport=self.get_Transport,
wsse=[token, signature],
plugins=[EncryptionPlugin], #Will speak to this in a moment
)
client.service.myServiceEndpoint(my=params)
Это работает, но явно не хватает элемента шифрования. Он передает токен имени пользователя и обычный текст тела и не подписывает метку времени или тело.
Я думал, что смогу сделать это с помощью плагина, но плагин, похоже, запускается до компонента WSSE - заголовок безопасности не содержит блок имени пользователя или пароля для шифрования. Кроме того, у меня нет очевидного способа заставить XMLSEC изменить его через client.service.myServiceEndpoint, поскольку он одновременно генерирует сообщение и отправляет его - так что я не могу сгенерировать XML, изменить его и затем отправить (хотя я думаю, что есть create_message, который я мог бы затем изменить и отправить вручную с помощью запросов, поскольку это все равно все, что Zeep там делает).
Другой сервис, написанный и использующий его, использует Apache Axis 2 с Rampart, но мне это не помогает. У меня есть файл policy.xml, но, похоже, нет способа использовать эту информацию в Python. Есть ли какой-либо другой подход, который я мог бы использовать, чтобы вручную создать запрос XML? В идеале решение должно использовать Python и быть дружественным к Mac (наша компания использует Mac для разработки).

Подробнее здесь: https://stackoverflow.com/questions/798 ... pi-which-r
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»