Зашифруйте XML-сообщение SOAP с помощью X509SubjectKeyIdentifier в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Зашифруйте XML-сообщение SOAP с помощью X509SubjectKeyIdentifier в Python

Сообщение Anonymous »

Я хочу зашифровать тело XML-документа SOAP. Он отлично работает с SoapUI, где я использую сертификат, Идентификатор ключа субъекта в качестве типа идентификатора ключа, кодировку AES256-CBC и алгоритм шифрования RSA 1_5. . Я также установил флажок для создания зашифрованного ключа. Я хочу воссоздать настройки с помощью кода Python, используя следующий код:
from zeep.wsse.utils
import base64

import get_security_header
import xmlsec from lxml
import etree

def encrypt(envelope, certfile):
"""Encrypt body contents of given SOAP envelope using given X509 cert."""
doc = etree.fromstring(envelope)

security = get_security_header(doc)

# Create a keys manager and load the cert into it.
manager = xmlsec.KeysManager()
key = xmlsec.Key.from_file(certfile, xmlsec.KeyFormat.CERT_PEM, None)
manager.add_key(key)

body = doc.find(ns(SOAP_NS, 'Body'))

enc_data = xmlsec.template.encrypted_data_create(
body,
xmlsec.constants.TransformAes256Cbc,
type=xmlsec.EncryptionType.CONTENT,
ns='xenc',
)
xmlsec.template.encrypted_data_ensure_cipher_value(enc_data)
key_info = xmlsec.template.encrypted_data_ensure_key_info(
enc_data, ns='ds')

enc_key = xmlsec.template.add_encrypted_key(
key_info, xmlsec.constants.TransformRsaPkcs1)
#enc_key.append(create_key_info_ski(certfile))
xmlsec.template.encrypted_data_ensure_cipher_value(enc_key)

enc_ctx = xmlsec.EncryptionContext(manager)
# Generate a per-session AES key (will be encrypted using the cert).
enc_ctx.key = xmlsec.Key.generate(
xmlsec.constants.KeyDataAes, 256, xmlsec.constants.KeyDataTypeSession)

# Ask XMLSec to actually do the encryption.
enc_data = enc_ctx.encrypt_xml(enc_data, body)

# Move the EncryptedKey node up into the wsse:Security header.
security.append(enc_key)

# Create DataReference element
add_data_reference(enc_key, enc_data)

enc_data.remove(key_info)
return doc

def create_key_info_ski(certfile):
key_info = etree.Element(f"{{{DS_NS}}}KeyInfo", nsmap=namespaces)
security_token_reference = etree.Element(f"{{{WSSE_NS}}}SecurityTokenReference")

key_identifier = etree.Element(f"{{{WSSE_NS}}}KeyIdentifier",
ValueType="http://docs.oasis-open.org/wss/2004/01/ ... Identifier",
EncodingType="http://docs.oasis-open.org/wss/2004/01/ ... se64Binary")
key_identifier.text = extract_ski(certfile)
security_token_reference.append(key_identifier)
key_info.append(security_token_reference)
return key_info

Кажется, все в порядке, если я не использую X509SubjectKeyIdentifier. Итак, если я закомментирую строку
#enc_key.append(create_key_info_ski(certfile))

Я получаю следующую ошибку:
xmlsec.Error: (1, 'failed to encrypt xml')

Правильно ли используются ключи? Чего мне не хватает?
РЕДАКТИРОВАТЬ:
Пример входного конверта:







Ожидаемый результат:







...



...
















...






Подробнее здесь: https://stackoverflow.com/questions/785 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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