Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dmitriy32546  
#1 Оставлено : 27 мая 2021 г. 12:23:40(UTC)
Dmitriy32546

Статус: Новичок

Группы: Участники
Зарегистрирован: 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?
Offline Санчир Момолдаев  
#2 Оставлено : 27 мая 2021 г. 13:20:00(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,038
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
Добрый день.
лучше приложите конечную xml подпись которую хотите получить.
у вас все выглядит как копипаст.
вы пытаетесь подписать по шаблону, но не передаете шаблон.
никаких узлов нет. но вы пытаетесь их найти. и.... не находите
Техническую поддержку оказываем тут
Наша база знаний
Offline Dmitriy32546  
#3 Оставлено : 27 мая 2021 г. 14:02:58(UTC)
Dmitriy32546

Статус: Новичок

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Dmitriy32546  
#4 Оставлено : 28 мая 2021 г. 7:50:18(UTC)
Dmitriy32546

Статус: Новичок

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Санчир Момолдаев  
#5 Оставлено : 28 мая 2021 г. 13:13:46(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,038
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
по шаблону означает что вы подаете xml с уже сформированными узлами digest value signature value и другими необходимыми.
просто именно эти узлы должны быть пустыми, а также узел с сертификатом.
приложите конечную xml которую хотите получить. убираете значения у этих узлов и пробуйте подписать по шаблону
Техническую поддержку оказываем тут
Наша база знаний
Offline Dmitriy32546  
#6 Оставлено : 28 мая 2021 г. 14:02:57(UTC)
Dmitriy32546

Статус: Новичок

Группы: Участники
Зарегистрирован: 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).crt
OCSP URL : http://testca.cryptopro.ru/ocsp/ocsp.srf
CDP : http://testca.cryptopro....Test%20Center%202(1).crl

Отредактировано пользователем 28 мая 2021 г. 14:03:37(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#7 Оставлено : 29 мая 2021 г. 9:18:45(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,038
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
такой шаблон подпишется, без 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> 
Техническую поддержку оказываем тут
Наша база знаний
Offline Dmitriy32546  
#8 Оставлено : 31 мая 2021 г. 11:38:21(UTC)
Dmitriy32546

Статус: Новичок

Группы: Участники
Зарегистрирован: 26.05.2021(UTC)
Сообщений: 9
Мужчина

Цитата:
такой шаблон подпишется, без xpath

Спасибо! подпись работает
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.