Я хочу зашифровать тело 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
Зашифруйте XML-сообщение SOAP с помощью X509SubjectKeyIdentifier в Python ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Зашифруйте и дешифруйте базу данных комнаты с помощью биометрической библиотеки AndroidX.
Anonymous » » в форуме Android - 0 Ответы
- 55 Просмотры
-
Последнее сообщение Anonymous
-
-
-
На PHP зашифруйте строку секретным ключом, а на Mac расшифруйте ее с помощью сценария bash.
Anonymous » » в форуме Php - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
На PHP зашифруйте строку секретным ключом, а на Mac расшифруйте ее с помощью сценария bash.
Anonymous » » в форуме Php - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Зашифруйте параметр запроса во Flutter и расшифруйте в PHP, чтобы получить данные
Anonymous » » в форуме Php - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-