Подписание Python XML, плохая подпись при использовании отдельногоPython

Программы на Python
Anonymous
Подписание Python XML, плохая подпись при использовании отдельного

Сообщение Anonymous »

Мы используем Python Signxml (https://pypi.org/project/signxml/) для подписи XML-сообщения, отправляемого на сервер Modirum MPI, однако мы получаем ошибку «плохая подпись» и можем Непонятно почему, поэтому буду благодарен за любую помощь.
Вот код:

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

import os
import base64
import requests
import signxml

from lxml import etree as lxml_ET
from signxml import XMLSigner, XMLVerifier, CanonicalizationMethod

TERM_URL = os.environ.get('TERM_URL', 'https://somedomain.url')
SELF_ENVIRONMENT = os.environ.get('SELF_ENVIRONMENT', 'staging')

POST_URL = 'https://modirumServerHere/url/things'

class ModiumSignXML:
def __init__(self, xml):
self.xml = xml

def sign_xml(self, xml, message_id):

cert, key = [open(f, "rb").read() for f in ("staging.cert.crt", "staging.private.key")]

reference_uri_link = f'''#{message_id}'''

temp = f'''
{xml}
'''

data = lxml_ET.fromstring(temp.encode('utf-8'))
signer = XMLSigner(method=signxml.methods.detached,
c14n_algorithm=signxml.CanonicalizationMethod.CANONICAL_XML_1_0)
signed_root = signer.sign(data, key=key, cert=cert, reference_uri=reference_uri_link)
data_serialized = lxml_ET.tostring(signed_root)

temp = temp.replace('', data_serialized.decode('utf-8') + '')

# data_parsed = lxml_ET.fromstring(temp)
XMLVerifier().verify(temp.encode('utf-8'), x509_cert=cert, id_attribute=reference_uri_link)

return temp

def process(self, pan, expiry, amount, exponent, description, currency, term_url, transaction_id, merchant_id,
merchant_name):

# message_id = f"{merchant_name}{transaction_id}"
message_id = "M1561102563170" #Hardcoded for testing

xid = str(transaction_id).zfill(20).encode('utf-8')
xid = base64.b64encode(xid).decode('utf-8')

to_encrypt = f'''




{pan}
{expiry}
0
{amount}
{exponent}
{description}
{currency}
{term_url}

01

{xid}



'''

xml = self.sign_xml(to_encrypt, message_id)

print("REQUEST")
print("=========="*10)
print(xml)
print("=========="*10)
print("")
print("")
print("")

return xml

def post_xml(self, xml):
headers = {'Content-Type': 'application/xml'}

r = requests.post(POST_URL, data=xml, headers=headers)

print("RESPONSE")
print("=========="*10)
print(r.text)
print("=========="*10)
print("")
print("")
print("")

def main():
pan = '4111111111111111'
expiry = '2312'
amount = '100'
exponent = '2'
description = 'Test'
currency = '710'
term_url = TERM_URL
transaction_id = '90010'
merchant_id = '123456'
merchant_name = 'TestMerchant'

test = ModiumSignXML('')
xml = test.process(pan=pan, expiry=expiry, amount=amount, exponent=exponent, description=description,
currency=currency, term_url=term_url, transaction_id=transaction_id, merchant_id=merchant_id,
merchant_name=merchant_name)
test.post_xml(xml)

if __name__ == "__main__":
main()
По сути, функция Sign_xml выполняет подпись, а затем проверку - и именно здесь возникает ошибка. Согласно спецификации, это должна быть отдельная подпись, появляющаяся после последнее «сообщение» и до конца XML-тега .
Мы сравнили выведенный код со спецификациями и другими рабочими журналами и не смогли видите что-то другое, но наша проверка не удалась как локально, так и на сервере MPI. Так что любая помощь будет огромной!
Мы пробовали разные вещи, в том числе разные методы подписи, и ни один из них не понравился. Мы повторно проверили сертификат и ключ, они оба в порядке и были извлечены из одного и того же файла PFX.

Подробнее здесь: https://stackoverflow.com/questions/782 ... g-detached

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