Статус: Новичок
Группы: Участники
Зарегистрирован: 26.05.2021(UTC) Сообщений: 9
|
Добрый день. Задача - подписать конкретный тег xml документа. Нашел несколько примеров, например тут: https://www.cryptopro.ru...aspx?g=posts&t=11923И для java тут: https://github.com/alfa-...entSignatureExample.javaКод функции: Код:def sign_xmldsig():
STATEMENT_SIGNATURE_ELEMENT_XPATH=("/*[local-name()='Document' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
+"/*[local-name()='AcctRptgReq' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
+"/*[local-name()='SplmtryData' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
+"/*[local-name()='Envlp' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
+"/*[local-name()='SngtrSt' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']")
try:
doc = etree.parse('/home/py-app/xml_for_sign.xml', etree.XMLParser(encoding='ISO-8859-1', ns_clean=True, recover=True))
store = pycades.Store()
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
certs = store.Certificates
signer = pycades.Signer()
signer.Certificate = certs.Item(1)
signer.CheckCertificate = True
signer.KeyPin='...'
signedXML = pycades.SignedXML()
signedXML.Content = etree.tostring(doc, pretty_print=False, encoding='unicode') #xml_data
#signedXML.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED | pycades.CADESCOM_XADES_BES
signedXML.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE | pycades.CADESCOM_XADES_BES
signature = signedXML.Sign(signer) #, STATEMENT_SIGNATURE_ELEMENT_XPATH)
return web.Response(text=signature, content_type="text/xml")
except Exception as ex:
print(ex)
Получаю ошибку: 'Cannot find object or property. (0x80092004)' Если добавляю XPATH в метод Sign signedXML.Sign(signer, STATEMENT_SIGNATURE_ELEMENT_XPATH) Получаю ошибку: 'The parameter is incorrect. (0x80070057)' xml: Код:<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.060.001.03" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<AcctRptgReq>
<GrpHdr>
<MsgId>00000000000000000000001</MsgId>
<CreDtTm>2001-01-01T00:00:00</CreDtTm>
</GrpHdr>
<SplmtryData>
<Envlp>
<SngtrSt>
</SngtrSt>
</Envlp>
</SplmtryData>
</AcctRptgReq>
</Document>
Подскажите как правильно подписать тег на pycades?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,040 Сказал(а) «Спасибо»: 88 раз Поблагодарили: 226 раз в 213 постах
|
Добрый день. лучше приложите конечную xml подпись которую хотите получить. у вас все выглядит как копипаст. вы пытаетесь подписать по шаблону, но не передаете шаблон. никаких узлов нет. но вы пытаетесь их найти. и.... не находите |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.05.2021(UTC) Сообщений: 9
|
Спасибо за ответ. Цитата:лучше приложите конечную xml подпись которую хотите получить. XML полностью. Код:<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.060.001.03" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<AcctRptgReq>
<GrpHdr>
<MsgId>00000000000000000000001</MsgId>
<CreDtTm>2001-01-01T00:00:00</CreDtTm>
</GrpHdr>
<RptgReq>
<Id>00000000000000000000001</Id>
<ReqdMsgNmId>HMQSTASCF</ReqdMsgNmId>
<Acct>
<Id>
<Othr>
<Id>40702810901300013000</Id>
</Othr>
</Id>
</Acct>
<AcctOwnr>
<Pty>
<Nm>ООО Рога и Копыта</Nm>
</Pty>
</AcctOwnr>
<RptgPrd>
<FrToDt>
<FrDt>2001-01-01</FrDt>
<ToDt>2001-01-01</ToDt>
</FrToDt>
<FrToTm>
<FrTm>00:00:00</FrTm>
<ToTm>24:00:00</ToTm>
</FrToTm>
<Tp>ALLL</Tp>
</RptgPrd>
</RptgReq>
<SplmtryData>
<Envlp>
<SngtrSt>
</SngtrSt>
</Envlp>
</SplmtryData>
</AcctRptgReq>
</Document>
Взял отсюда как пример подписи для банка, она тестовая но рабочие будут аналогичные. Цитата:вы пытаетесь подписать по шаблону, но не передаете шаблон Как указать шаблон? В документации видел только скудное описание метода sign с параметром xpath и установкой SignatureType=TEMPLATE. Честно говоря я думал что xpath это и есть темплайт. Может есть более подробное описание подписи по шаблону ? Отредактировано пользователем 28 мая 2021 г. 10:06:45(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.05.2021(UTC) Сообщений: 9
|
Еще раз прошерстил форум, нашел похожую ситуацию с Альфа банком на PHP. https://www.cryptopro.ru...aspx?g=posts&t=11568Там закончилось тем что: "Плагин не умеет делать <ds:Transforms><ds:Transform Algorithm="urn://smev-gov-ru/xmldsig/transform"/> такой трансформ." Подскажите, это проблема с pycades? Приведу полностью функция на python. В коде перепробовал разные xpath, все они прошли проверку на http://xpather.com/ для примера xml файла (приводил выше). Код:
from lxml import etree
import datetime
import pycades
def sign_xmldsig():
STATEMENT_SIGNATURE_ELEMENT_XPATH="//*[local-name()='SngtrSt' and position()=last()]"
#'//SngtrSt[1]'
#"/*[local-name()='Document' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']/*[local-name()='AcctRptgReq']/*[local-name()='SplmtryData']/*[local-name()='Envlp']"
# "/*[local-name()='Document' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
# +"/*[local-name()='AcctRptgReq']")
# +"/*[local-name()='SplmtryData' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
# +"/*[local-name()='Envlp' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']"
# +"/*[local-name()='SngtrSt' and namespace-uri()='urn:iso:std:iso:20022:tech:xsd:camt.060.001.03']")
try:
doc = etree.parse('/home/py-app/xml_for_sign.xml', etree.XMLParser(encoding='ISO-8859-1', ns_clean=True, recover=True))
store = pycades.Store()
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
certs = store.Certificates
signer = pycades.Signer()
signer.Certificate = certs.Item(1)
signer.CheckCertificate = True
signer.KeyPin=''
signedXML = pycades.SignedXML()
print(etree.tostring(doc, pretty_print=False, encoding='unicode'))
signedXML.Content = etree.tostring(doc, pretty_print=False, encoding='unicode')
signedXML.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE | pycades.CADESCOM_XADES_BES
signature = signedXML.Sign(signer, STATEMENT_SIGNATURE_ELEMENT_XPATH)
return signature
except Exception as ex:
print(ex)
Получаю ошибку : 'The parameter is incorrect. (0x80070057)' Отредактировано пользователем 28 мая 2021 г. 7:51:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,040 Сказал(а) «Спасибо»: 88 раз Поблагодарили: 226 раз в 213 постах
|
по шаблону означает что вы подаете xml с уже сформированными узлами digest value signature value и другими необходимыми. просто именно эти узлы должны быть пустыми, а также узел с сертификатом. приложите конечную xml которую хотите получить. убираете значения у этих узлов и пробуйте подписать по шаблону |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.05.2021(UTC) Сообщений: 9
|
Цитата:по шаблону означает что вы подаете xml с уже сформированными узлами digest value signature value и другими необходимыми. Поменял XML на основе ранее подписанного примера от банка: Код:<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.06">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>203_MSG</MsgId>
</GrpHdr>
<SplmtryData>
<Envlp>
<SgntrSt>
<Signature>
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
<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#WithComments"/>
</Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<DigestValue></DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>
</SignatureValue>
<KeyInfo>
</KeyInfo>
</Signature>
</SgntrSt>
</Envlp>
</SplmtryData>
</CstmrCdtTrfInitn>
</Document>
Код остался тот же с небольшими изменениями, пробовал и xpath и без него, добавлял signedXML.DigestMethod и signedXML.SignatureMethod. Получаю ошибку:'Cannot find object or property. (0x80092004)' Код:
def sign_xmldsig():
STATEMENT_SIGNATURE_ELEMENT_XPATH='//Signature[1]'
try:
doc = etree.parse('/home/py-app/xml_for_sign.xml', etree.XMLParser(encoding='ISO-8859-1', ns_clean=True, recover=True))
store = pycades.Store()
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
certs = store.Certificates
signer = pycades.Signer()
signer.Certificate = certs.Item(1)
signer.CheckCertificate = True
signer.KeyPin=''
signedXML = pycades.SignedXML()
#signedXML.DigestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256'
#signedXML.SignatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256'
print(etree.tostring(doc, pretty_print=False, encoding='unicode'))
signedXML.Content = etree.tostring(doc, pretty_print=False, encoding='unicode')
signedXML.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE
signature = signedXML.Sign(signer) #, STATEMENT_SIGNATURE_ELEMENT_XPATH)
return signature
except Exception as ex:
print(ex)
Данные ключа на вский случай: 1------- Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2 Subject : E=ivan@ivan.ivan, CN=Ivanov2, OU=IT, O=OOO, L=Moscow, S=Moscow, C=RU Serial : 0x12005425174E346F2F7497941B000100542571 SHA1 Hash : 39babe9fe594b63af141be7969577757ba92ac36 SubjKeyID : 2a0cd510a8a8a3631533fac0138cb19084a92620 Signature Algorithm : ГОСТ Р 34.11/34.10-2001 PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits) Not valid before : 26/05/2021 10:51:49 UTC Not valid after : 26/08/2021 11:01:49 UTC PrivateKey Link : Yes Container : HDIMAGE\\pfx-55ab.000\C407 Provider Name : Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider Provider Info : Provider Type: 80, Key Spec: 1, Flags: 0x0 CA cert URL : http://testca.cryptopro....Test%20Center%202(1).crtOCSP URL : http://testca.cryptopro.ru/ocsp/ocsp.srfCDP : http://testca.cryptopro....Test%20Center%202(1).crlОтредактировано пользователем 28 мая 2021 г. 14:03:37(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,040 Сказал(а) «Спасибо»: 88 раз Поблагодарили: 226 раз в 213 постах
|
такой шаблон подпишется, без xpath Код:<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.06">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>203_MSG</MsgId>
</GrpHdr>
<SplmtryData>
<Envlp>
<SgntrSt>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
<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#WithComments"/>
</Transforms>
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>
<DigestValue/>
</Reference>
</SignedInfo>
<SignatureValue/>
<KeyInfo/>
</Signature>
</SgntrSt>
</Envlp>
</SplmtryData>
</CstmrCdtTrfInitn>
</Document>
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.05.2021(UTC) Сообщений: 9
|
Цитата:такой шаблон подпишется, без xpath Спасибо! подпись работает
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close