Мне нужна помощь в использовании 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 для разработки).
Мне нужна помощь в использовании Zeep для создания XML-сообщения, которое включает в себя BinarySecurityTokens и шифрует определенные части сообщения (а именно: UsernameToken и Body) Сценарий: [list] [*]Проект, над которым я работаю, включает корпоративную конечную точку SOAP (Oracle SOA). Здесь используется SOAP 1.2.
[*]Через SoapUI у меня есть полный набор требований, которые мне нужно воспроизвести. В частности, исходящая безопасность:
Должен иметь токен временной метки с точностью до миллисекунды.
[*]Должен иметь токен имени пользователя с одноразовым номером.
[*]Должен иметь подпись (BinarySecurityToken с использованием единого сертификата для подписи и элемента подписи в заголовке безопасности для UsernameToken, Timestamp и Body — с использованием определенной пары секретный ключ/сертификат.
[*]Должно быть зашифровано с использованием открытого ключа сервера (который у меня есть), а симметричный ключ должен быть зашифрован в EncryptedKey — в частности, необходимо зашифровать токен имени пользователя и текст.
[/list]
[*]Существует входящая безопасность, поскольку ну, значит, сообщение придется расшифровать с помощью открытого ключа сервера.
Проблема: [list] [*]Я совершенно не понимаю, как мне воспроизвести это на Python. Тестовая среда (которая не использует учетные данные) отлично работает с Zeep, поэтому я знаю, что структура моего сообщения в порядке, но Zeep не поддерживает. mustUnderstand, и я не могу понять, как мне зашифровать части XML. РЕДАКТИРОВАТЬ: я смог сделать это через _soapHeaders в клиентском вызове.
[*]Я думал о написании выходных плагинов Zeep для обработки шифрования частей, но я столкнулся с проблемой ниже, выходные плагины запускаются до заполнения заголовков безопасности.
[*]Suds-Community — еще один высоко оцененный вариант, поддерживающий дополнительные настройки безопасности, но я не думаю, что он будет работать, поскольку для этого требуется SOAP 1.2, а Suds-Community, похоже, поддерживает только SOAP 1.1. Он также, похоже, не поддерживает BinarySecurityTokens без py-wsse, и py-wsse не может быть установлен из pip.
[/list] Возьмите этот кодовый блок: [code]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) [/code] Это работает, но явно не хватает элемента шифрования. Он передает токен имени пользователя и обычный текст тела и не подписывает метку времени или тело. Я думал, что смогу сделать это с помощью плагина, но плагин, похоже, запускается до компонента WSSE - заголовок безопасности не содержит блок имени пользователя или пароля для шифрования. Кроме того, у меня нет очевидного способа заставить XMLSEC изменить его через client.service.myServiceEndpoint, поскольку он одновременно генерирует сообщение и отправляет его - так что я не могу сгенерировать XML, изменить его и затем отправить (хотя я думаю, что есть create_message, который я мог бы затем изменить и отправить вручную с помощью запросов, поскольку это все равно все, что Zeep там делает). Другой сервис, написанный и использующий его, использует Apache Axis 2 с Rampart, но мне это не помогает. У меня есть файл policy.xml, но, похоже, нет способа использовать эту информацию в Python. Есть ли какой-либо другой подход, который я мог бы использовать, чтобы вручную создать запрос XML? В идеале решение должно использовать Python и быть дружественным к Mac (наша компания использует Mac для разработки).