Мне нужно проверить подпись xml, содержащуюся в ответе на запрос POST.
Подпись определяется как:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>htti3M3ikfm2RooDTNo3Kv7g0K2ongShUfCDUAWpytc=</DigestValue>
</Reference>
</SignedInfo>
и относится к пользовательскому CA.
У меня нет возможности изменить ответ (он выдается государственным агентством), и все мои попытки сверки с сертификатом, который якобы использовался для подписи, привели к ошибкам.
Одна из моих попыток былаиспользуя следующую короткую тестовую программу:
#!/usr/bin/python3
import signxml
cf = 'certificate.cer'
with open(cf, 'r') as fi:
cer = fi.read()
ver = signxml.XMLVerifier()
f = 'response.xml'
with open(f, 'rb') as fi:
xml = fi.read()
try:
vd = ver.verify(xml, x509_cert=cer)
print('OK')
except signxml.exceptions.InvalidSignature as e:
print(e)
Это приводит к:
Signature verification failed: wrong signature length
Другие варианты имеют различные ошибки, включая:
Signature verification failed: invalid padding
и:
unable to get local issuer certificate
Я опытный программист, но НЕ специалист по криптографии, так что вполне вероятно, что я забыл что-то тривиальное (для знающих).Пожалуйста, направьте меня в правильном направлении.
Примечание: : при необходимости я могу привести полный пример (сбоя), поскольку сертификат / ответ не являются "секретными".