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

Уведомление

Icon
Error

10 Страницы«<78910>
Опции
К последнему сообщению К первому непрочитанному
Offline Dmitriy32546  
#161 Оставлено : 26 мая 2021 г. 19:51:50(UTC)
Dmitriy32546

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

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

Добрый день.
Задача - подписать конкретный тег 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?

Версии:
debian 10
pycades 0.1.22769
Offline Санчир Момолдаев  
#162 Оставлено : 27 мая 2021 г. 13:22:33(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 65 раз
Поблагодарили: 158 раз в 154 постах
Автор: Dmitriy32546 Перейти к цитате
Добрый день.
Задача - подписать конкретный тег 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?

Версии:
debian 10
pycades 0.1.22769


дубликат
Техническую поддержку оказываем тут
Наша база знаний
Offline jacob_levit  
#163 Оставлено : 21 июля 2021 г. 15:56:00(UTC)
jacob_levit

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

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

Здравствуйте! Подскажите, пожалуйста, как найти сертификат в хранилище методом Find? Что ему надо передать?
Цитата:
cert = certs.Find().

И почему, когда делаю:
Цитата:
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_OTHER_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)

на выходе получаю один сертификат в хранилище, когда в хранилище AddressBook ничего нет.
Offline Ситдиков Денис  
#164 Оставлено : 22 июля 2021 г. 11:30:57(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
Автор: jacob_levit Перейти к цитате
Здравствуйте! Подскажите, пожалуйста, как найти сертификат в хранилище методом Find? Что ему надо передать?
Цитата:
cert = certs.Find().

И почему, когда делаю:
Цитата:
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_OTHER_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)

на выходе получаю один сертификат в хранилище, когда в хранилище AddressBook ничего нет.


Добрый день!
1) Параметры аналогичны методу ICertificates2::Find.
В этом примере аналогичный код для javascript.
2) Вы открываете хранилище CADESCOM_CONTAINER_STORE, который открывает все сертификаты с привязкой к закрытому ключу. При этом он может находиться не в хранилище AddressBook.
Offline jacob_levit  
#165 Оставлено : 22 июля 2021 г. 13:11:23(UTC)
jacob_levit

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

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

Цитата:
Добрый день!
1) Параметры аналогичны методу ICertificates2::Find.
В этом примере аналогичный код для javascript.
2) Вы открываете хранилище CADESCOM_CONTAINER_STORE, который открывает все сертификаты с привязкой к закрытому ключу. При этом он может находиться не в хранилище AddressBook.

Добрый день! Спасибо за помощь.
1. А параметры поиска нельзя комбинировать? Например, найти сертификат по ISSUER_NAME и ROOT_NAME?
2. И ещё пару вопросиков, если позволите... метод Find возвращает объект:
Цитата:
<pycades.Certificates object>
Как обратиться к его полям? Например, проверить, то ли он вернул, правильный сертификат ли нашёл?
3. Как подписать или зашифровать файл? В примерах только текстовые строки.

Отредактировано пользователем 22 июля 2021 г. 13:55:52(UTC)  | Причина: Не указана

Offline Ситдиков Денис  
#166 Оставлено : 22 июля 2021 г. 14:24:12(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
Автор: jacob_levit Перейти к цитате
Цитата:
Добрый день!
1) Параметры аналогичны методу ICertificates2::Find.
В этом примере аналогичный код для javascript.
2) Вы открываете хранилище CADESCOM_CONTAINER_STORE, который открывает все сертификаты с привязкой к закрытому ключу. При этом он может находиться не в хранилище AddressBook.

Добрый день! Спасибо за помощь.
1. А параметры поиска нельзя комбинировать? Например, найти сертификат по ISSUER_NAME и ROOT_NAME?
2. И ещё пару вопросиков, если позволите... метод Find возвращает объект:
Цитата:
<pycades.Certificates object>
Как обратиться к его полям? Например, проверить, то ли он вернул, правильный сертификат ли нашёл?
3. Как подписать или зашифровать файл? В примерах только текстовые строки.


1. Find возвращает объект Certificates. Можете последовательно 2 раза вызвать, сперва отобрать по ISSUER_NAME, потом по ROOT_NAME.
2. Здесь документация на объект Certificates, можете проверить количество найденных сертификатов и перебрать все.
3. Специального интерфейса для работы с файлами нет, единственный вариант сконвертировать содержимое в BASE64 и работать как со строкой. Пример для javascript.
Offline jacob_levit  
#167 Оставлено : 22 июля 2021 г. 15:12:53(UTC)
jacob_levit

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

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

Автор: Ситдиков Денис Перейти к цитате

1. Find возвращает объект Certificates. Можете последовательно 2 раза вызвать, сперва отобрать по ISSUER_NAME, потом по ROOT_NAME.
2. Здесь документация на объект Certificates, можете проверить количество найденных сертификатов и перебрать все.
3. Специального интерфейса для работы с файлами нет, единственный вариант сконвертировать содержимое в BASE64 и работать как со строкой. Пример для javascript.

Спасибо ещё раз за ответы.
1. А можно выбрать какой-нибудь критерий, по которому можно однозначно идентифицировать сертификат? Например, его серийный номер. В метод Find что-то не передаётся такой параметр как серийный номер сертификата.
3. А если файл размером больше, чем оперативная память, то как быть?
Извините за нубские вопросы.

Отредактировано пользователем 22 июля 2021 г. 15:16:47(UTC)  | Причина: Не указана

Offline Ситдиков Денис  
#168 Оставлено : 22 июля 2021 г. 16:09:34(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
Автор: jacob_levit Перейти к цитате
Автор: Ситдиков Денис Перейти к цитате

1. Find возвращает объект Certificates. Можете последовательно 2 раза вызвать, сперва отобрать по ISSUER_NAME, потом по ROOT_NAME.
2. Здесь документация на объект Certificates, можете проверить количество найденных сертификатов и перебрать все.
3. Специального интерфейса для работы с файлами нет, единственный вариант сконвертировать содержимое в BASE64 и работать как со строкой. Пример для javascript.

Спасибо ещё раз за ответы.
1. А можно выбрать какой-нибудь критерий, по которому можно однозначно идентифицировать сертификат? Например, его серийный номер. В метод Find что-то не передаётся такой параметр как серийный номер сертификата.
3. А если файл размером больше, чем оперативная память, то как быть?
Извините за нубские вопросы.


1. Certificate.Thumbprint
2. Для шифрования есть методы CPEnvelopedData.StreamEncrypt/StreamDecrypt. Для подписи обычно используется отделенная подпись по хэш-значению.
Offline Андрей *  
#169 Оставлено : 22 июля 2021 г. 16:28:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 385 раз
Поблагодарили: 1562 раз в 1202 постах
Автор: jacob_levit Перейти к цитате

3. А если файл размером больше, чем оперативная память, то как быть?
Извините за нубские вопросы.


Подпись файла с использованием FileAPI и чтением файла по частям
Техническую поддержку оказываем тут
Наша база знаний
Offline Emin Aliev  
#170 Оставлено : 27 июля 2021 г. 17:45:23(UTC)
Emin Aliev

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

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

Добрый день
Возможно как-то самому библиотеку развернуть на винде?

Отредактировано пользователем 3 августа 2021 г. 10:38:25(UTC)  | Причина: Не указана

Offline Alexander5000  
#171 Оставлено : 23 августа 2021 г. 11:24:46(UTC)
Alexander5000

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день.
Через pycryptoprosdk можно получить altname сертификата. Есть ли возможность получить altname используя pycades?
Offline Ситдиков Денис  
#172 Оставлено : 23 августа 2021 г. 15:45:37(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
Добрый день!
CPCertificate.GetInfo подходит?
Offline Alexander5000  
#173 Оставлено : 23 августа 2021 г. 16:38:19(UTC)
Alexander5000

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Ситдиков Денис Перейти к цитате

CPCertificate.GetInfo подходит?


Из altname нужно будет получить ОГРНИП, а в GetInfo я ничего похожего не вижу. В pycryptoprosdk оно как-то через расширение сертификата достается. Или я все таки что-то не понимаю и это возможно?

Отредактировано пользователем 23 августа 2021 г. 16:54:45(UTC)  | Причина: Не указана

Offline Ситдиков Денис  
#174 Оставлено : 23 августа 2021 г. 17:52:06(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
К сожалению, ОГРНИП получить нельзя: в текущей реализации нет доступа к произвольным расширениям сертификата.
thanks 1 пользователь поблагодарил Ситдиков Денис за этот пост.
Alexander5000 оставлено 23.08.2021(UTC)
Offline Alexander5000  
#175 Оставлено : 23 августа 2021 г. 20:05:04(UTC)
Alexander5000

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

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

Сказал(а) «Спасибо»: 1 раз
Жаль. Спасибо за ответ.
Offline uishnik  
#176 Оставлено : 24 августа 2021 г. 10:01:15(UTC)
uishnik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 1 раз
Автор: Ситдиков Денис Перейти к цитате
К сожалению, ОГРНИП получить нельзя: в текущей реализации нет доступа к произвольным расширениям сертификата.

А можно рассчитывать, что когда-нибудь такая возможность появится?
Offline Ситдиков Денис  
#177 Оставлено : 24 августа 2021 г. 11:27:53(UTC)
Ситдиков Денис

Статус: Администратор

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

Поблагодарили: 20 раз в 18 постах
Да, запрос завели, но по срокам не сориентируем. В ближайшее время доработки ждать не стоит.
Offline Dmitriy Chernyshov  
#178 Оставлено : 3 сентября 2021 г. 18:35:32(UTC)
Dmitriy Chernyshov

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

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

Сказал(а) «Спасибо»: 2 раз
Добрый день!

Подскажите, пожалуйста, как можно подписать xml в кодировке windows-1251. Сейчас происходит ошибка при следующих действиях:
Код:


import pycades

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

content_to_sign = "<?xml version=\"1.0\" encoding=\"windows-1251\"?><EXTRWT><WTFORMAT VERSION=\"2.8\"><DOCAZKREQUESTS><DOCAZKREQUEST ADVANCE_PAYMENT=\"0\" BUDGETNAME=\"\" CHECKFIO=\"\" CHECKFIOBOSSNAME=\"\" CHECKFIOGLAVBUHNAME=\"\" CHECKPAY=\"1\" CHECKPOSITION=\"\" CHECKPOSITIONBOSSNAME=\"\" CHECKPOSITIONGLAVBUHNAME=\"\" DOCCLASS=\"11\" DOCUMENTDATE=\"\" DOCUMENTNUMBER=\"\" ESTIMATENAME=\"\" GRBSCODE=\"711\" NDS=\"0.00\" OPERKINDID=\"01\" PAYERACCOUNTNUMBER=\"\" PAY_FOR_LIVE=\"0\" QUEUEKIND=\"5\" RECEIVERACCOUNTNUMBER=\"40101810800000010001\" RECEIVERBANKBRANCHNAME=\"\" RECEIVERBIC=\"049205001\" RECEIVERINN=\"1655005361\" RECEIVERKPP=\"165501001\" RECEIVERNAME=\"\"><LINES><LINE AMOUNT=\"6615.00\" BUDGRECEIVERINN=\"1654019570\" BUDGRECEIVERKPP=\"165545001\" BUDGRECEIVERNAME=\"Тестовая организация\" FUNDSSOURCECODE=\"1\" FUNDSSOURCETYPENAME=\"\" KCSR=\"1800102040\" KDE=\"000001\" KDF=\"11101\" KDR=\"219\" KFSR=\"0106\" KIF=\"1\" KVR=\"121\" KVSR=\"711\" PERMITDATE=\"2021-08-13\" PERMITNUMBER=\"1\" /></LINES></DOCAZKREQUEST></DOCAZKREQUESTS></WTFORMAT></EXTRWT>"

signedXML = pycades.SignedXML()
signedXML.Content = content_to_sign
signature = signedXML.Sign(signer)


В результате получаем:
Цитата:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: The system was unable to parse the requested XML data. (0x800705B9)


Если удалить "Тестовая организация", то подписание проходит. Если сменить кодировку на utf-8, то подписание проходит. Если выполнить подписание через https://www.cryptopro.ru...des_xmldsig_sample.html, то оно тоже проходит.

Какие еще магические настройки нужно сделать? Заранее спасибо
Offline two_oceans  
#179 Оставлено : 6 сентября 2021 г. 6:57:32(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,289
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 85 раз
Поблагодарили: 298 раз в 281 постах
Добрый день.
Разберем по порядку.
1) Насколько я знаю, плагин (на основе которого построены расширения php и питон) принимает строковые данные в кодировке Юникод либо utf-8 (в зависимости от ОС). Соответствующее преобразование неявно делает браузер, увидев кодировку страницы с одной стороны (у страницы проверки плагина по ссылке легко видим
Код:
<meta ... charset="utf-8" />
) и по спецификации расширений с другой стороны. Поэтому сказать, что в плагине подписывается именно windows-1251 будет неверно. Для сравнения, двоичное содержимое при подписи cades Вы можете закодировать в Base64 и выставить соответствующий параметр, что содержимое закодировано (это предотвращает преобразования браузера, так как строка Base64 в любой кодировке не меняется).

2) Для каноникализации в алгоритме подписи xmldsig/xades документ все равно преобразуется в utf-8, то есть хэш сумма для фрагмента в xmldsig/xades никак не зависит от исходной кодировки документа (если указан трансформ каноникализации). В итоге, подписывая документ не в utf-8, Вы вместо явного преобразования в utf-8 полагаетесь на неявное. Предположу, что сообщение об ошибке возникает как раз при неявном преобразовании.

3) Расширения php и питон распространяются для *nix систем, где все не гладко с поддержкой кодировки Windows-1251 и преобразование кодировки скорее проблема ОС. Там еще надо смотреть какую кодировку имеет консоль приложения с точки зрения *nix.

Учитывая 2), Вы можете создать (перекодировать любым способом, который не крашится) документ в utf-8 (соответствующе изменив
Код:
<?xml encoding="windows-1251"?>
на utf-8), подписать, затем перекодировать документ в нужную кодировку (само собой кодировка должна содержать все символы использующиеся в документе плюс указать корректное новой значение encoding) и после этого документ все еще должен проходить проверку (в средствах проверки, в которых конвертация кодировки не крашится).
thanks 1 пользователь поблагодарил two_oceans за этот пост.
Dmitriy Chernyshov оставлено 09.09.2021(UTC)
Offline Dmitriy Chernyshov  
#180 Оставлено : 9 сентября 2021 г. 11:10:16(UTC)
Dmitriy Chernyshov

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

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

Сказал(а) «Спасибо»: 2 раз
Автор: two_oceans Перейти к цитате
Добрый день.
Разберем по порядку.
1) Насколько я знаю, плагин (на основе которого построены расширения php и питон) принимает строковые данные в кодировке Юникод либо utf-8 (в зависимости от ОС). Соответствующее преобразование неявно делает браузер, увидев кодировку страницы с одной стороны (у страницы проверки плагина по ссылке легко видим
Код:
<meta ... charset="utf-8" />
) и по спецификации расширений с другой стороны. Поэтому сказать, что в плагине подписывается именно windows-1251 будет неверно. Для сравнения, двоичное содержимое при подписи cades Вы можете закодировать в Base64 и выставить соответствующий параметр, что содержимое закодировано (это предотвращает преобразования браузера, так как строка Base64 в любой кодировке не меняется).

2) Для каноникализации в алгоритме подписи xmldsig/xades документ все равно преобразуется в utf-8, то есть хэш сумма для фрагмента в xmldsig/xades никак не зависит от исходной кодировки документа (если указан трансформ каноникализации). В итоге, подписывая документ не в utf-8, Вы вместо явного преобразования в utf-8 полагаетесь на неявное. Предположу, что сообщение об ошибке возникает как раз при неявном преобразовании.

3) Расширения php и питон распространяются для *nix систем, где все не гладко с поддержкой кодировки Windows-1251 и преобразование кодировки скорее проблема ОС. Там еще надо смотреть какую кодировку имеет консоль приложения с точки зрения *nix.

Учитывая 2), Вы можете создать (перекодировать любым способом, который не крашится) документ в utf-8 (соответствующе изменив
Код:
<?xml encoding="windows-1251"?>
на utf-8), подписать, затем перекодировать документ в нужную кодировку (само собой кодировка должна содержать все символы использующиеся в документе плюс указать корректное новой значение encoding) и после этого документ все еще должен проходить проверку (в средствах проверки, в которых конвертация кодировки не крашится).



Большое спасибо за ответы!

Разобрались с кодировками и прочими связанными ошибками.

После долгих разборов выяснили, что на принимающей стороне нужен xmldsig detached. После изучения информации появилось понимание, что detached в случае с xml - это лишь вопрос положения тегов документа и подписи относительно друг друга. Но судя по комментариям разработки принимающего продукта, у них формирование происходит именно по изначальному документа. Учитывая, что у них используется JCP, судя по всему выполняется что-то подобное JCPxml.dsig.internal.xmldsigri.tests.SignFileExample.

Вопрос: можно ли что-то аналогичное реализовать на pycades?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
10 Страницы«<78910>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.