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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Kaboom5124  
#1 Оставлено : 25 декабря 2023 г. 15:51:44(UTC)
Kaboom5124

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

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

Всем привет!

Появилась задача интегрироваться со СМЭВ3, прочитал кучу доков, статей - нигде нет какого-то нормального решения для Python. Адаптер использовать не хочется из-за его перегруженности и сложности с поддержкой в дальнейшем.

Пробую следующее:

1) Беру базовые запросы отсюда: https://info.gosuslugi.r...0%A1%D0%9C%D0%AD%D0%923/

2) Подписываю их

3) Отправляю на валидацию в ЛК УВ: https://lkuv.gosuslugi.r...#/xml/message/validation

Еще ни один раз валидация не прошла успешно. Самая частая ошибка:
Цитата:

Электронная подпись должна быть подтверждена
ЭЦП не подтверждена: #SIGNED_BY_CALLER Ошибка проверки ЭП: Нарушена целостность ЭП



Пример:

1. Берем из базовых примеров запросов файл GetRequestRequestWithFilter.xml
2. Копируем блок <ns2:MessageTypeSelector:


Код:
<ns2:MessageTypeSelector xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2" xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CALLER"><ns2:NamespaceURI>urn://qa/8.0.0</ns2:NamespaceURI><ns2:RootElementLocalName>DataRequest</ns2:RootElementLocalName><ns2:Timestamp>2014-02-11T17:10:03.616+04:00</ns2:Timestamp></ns2:MessageTypeSelector>


3. Берем наш код для подписания, подписываем XML:
Код:

import pycades
import lxml

crypto_store = pycades.Store()
crypto_store.Open(pycades.CADESCOM_CURRENT_USER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)

certificates = crypto_store.Certificates
certificate = certificates.Item(3)

signer = pycades.Signer()
signer.Certificate = certificate
signer.CheckCertificate = True

signedXML = pycades.SignedXML()
signedXML.SignatureMethod = pycades.XmlDsigGost3410Url2012256
signedXML.DigestMethod = pycades.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
signedXML.SignatureType = pycades.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED #pycades.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE # pycades.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED # pycades.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING


content_to_sign = """<ns2:MessageTypeSelector xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2" xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CALLER"><ns2:NamespaceURI>urn://qa/8.0.0</ns2:NamespaceURI><ns2:RootElementLocalName>DataRequest</ns2:RootElementLocalName><ns2:Timestamp>2014-02-11T17:10:03.616+04:00</ns2:Timestamp></ns2:MessageTypeSelector>"""

signedXML.Content = content_to_sign

signature = signedXML.Sign(signer).replace('\n', '')
print(signature)


4. Получаем результат, из него копируем DigestValue, SignatureValue, X509Certificate: (при необходимости, убираем доп. переносы строк вручную)

Код:

<?xml version="1.0"?><ns2:MessageTypeSelector xmlns:ns2="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2" xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2" Id="SIGNED_BY_CALLER"><ns2:N
amespaceURI>urn://qa/8.0.0</ns2:NamespaceURI><ns2:RootElementLocalName>DataRequest</ns2:RootElementLocalName><ns2:Timestamp>2014-02-11T17:10:03.616+04:00</ns2:Timestamp><Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="Signa
ture1-ee3df574c-24b5-48e2-b50b-45a5fa86052"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><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/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="urn:ietf:params:
xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><DigestValue>7jFUKxfsoZMm8o/ysafaiUzuHCYVi16qjWkgCL7Ne7A=</DigestValue></Reference></SignedInfo><SignatureValue>TjUv0fSGkJePnjDeKV2jmP70kBqVSD1IfKygGJ5vDWIjC4GvOTsOSgS8n6g7jHEBgrCpEzMvA
4M/RN3hChiV1w==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIJvjCCCWugAwIBAgIRAKeR2pPMJJW76j1rPGeC8VswCgYIKoUDBwEBAwIwggFXMSAwHgYJKoZIhvcNAQkBFhF1Y19ma0Byb3NrYXpuYS5ydTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRUwEwYFKoUDZAQSCjc3
MTA1Njg3NjAxGDAWBgUqhQNkARINMTA0Nzc5NzAxOTgzMDFgMF4GA1UECQxX0JHQvtC70YzRiNC+0Lkg0JfQu9Cw0YLQvtGD0YHRgtC40L3RgdC60LjQuSDQv9C10YDQtdGD0LvQvtC6LCDQtC4gNiwg0YHRgtGA0L7QtdC90LjQtSAxMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCwMQswCQYDVQQGEwJSVTEu
MCwGA1UECgwl0JrQsNC30L3QsNGH0LXQudGB0YLQstC+INCg0L7RgdGB0LjQuDEuMCwGA1UEAwwl0JrQsNC30L3QsNGH0LXQudGB0YLQstC+INCg0L7RgdGB0LjQuDAeFw0yMzExMTcwODQxMDBaFw0yNTAyMDkwODQxMDBaMIICqzELMAkGA1UEBhMCUlUxLDAqBgNVBAgMI9Cc0L7RgdC60L7QstGB0LrQsNGP
INC+0LHQu9Cw0YHRgtGMMXQwcgYDVQQJDGvQnNC+0YHQutC+0LLRgdC60LDRjyDQvtCx0LvQsNGB0YLRjCwg0LMuINCa0YDQsNGB0L3QvtCz0L7RgNGB0LosINCx0YPQu9GM0LLQsNGAINCh0YLRgNC+0LjRgtC10LvQtdC5LCDQtC4gMTEfMB0GA1UEBwwW0JrRgNCw0YHQvdC+0LPQvtGA0YHQujGBvjCBuwYD
VQQKDIGz0JzQmNCd0JjQodCi0JXQoNCh0KLQktCeINCT0J7QodCj0JTQkNCg0KHQotCS0JXQndCd0J7Qk9CeINCj0J/QoNCQ0JLQm9CV0J3QmNCvLCDQmNCd0KTQntCg0JzQkNCm0JjQntCd0J3Qq9ClINCi0JXQpdCd0J7Qm9Ce0JPQmNCZINCYINCh0JLQr9CX0Jgg0JzQntCh0JrQntCS0KHQmtCe0Jkg0J7Q
kdCb0JDQodCi0JgxGDAWBgUqhQNkARINMTA3NTAyNDAwMDI0ODEVMBMGBSqFA2QEEgo1MDI0MDg1MTU0MSQwIgYJKoZIhvcNAQkBFhVnb3JjaGFrb3ZldkBtb3NyZWcucnUxgb4wgbsGA1UEAwyBs9Cc0JjQndCY0KHQotCV0KDQodCi0JLQniDQk9Ce0KHQo9CU0JDQoNCh0KLQktCV0J3QndCe0JPQniDQo9Cf
0KDQkNCS0JvQldCd0JjQrywg0JjQndCk0J7QoNCc0JDQptCY0J7QndCd0KvQpSDQotCV0KXQndCe0JvQntCT0JjQmSDQmCDQodCS0K/Ql9CYINCc0J7QodCa0J7QktCh0JrQntCZINCe0JHQm9CQ0KHQotCYMGYwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIDQwAEQLw9QmW/+gb4A1ElCcrE7aaU
mosqE22brOseeD9BG4ik2+oUQYK5XtDX5xUnZK0Zd/YJlB3P5qHM+AfYb8kMhSijggSxMIIErTAOBgNVHQ8BAf8EBAMCA/gwJwYDVR0lBCAwHgYIKwYBBQUHAwIGCCsGAQUFBwMIBggrBgEFBQcDCTATBgNVHSAEDDAKMAgGBiqFA2RxATAMBgUqhQNkcgQDAgEBMC0GBSqFA2RvBCQMItCa0YDQuNC/0YLQvtCf
0YDQviBDU1AgKDUuMC4xMjAwMCkwggGjBgUqhQNkcASCAZgwggGUDIGH0J/RgNC+0LPRgNCw0LzQvNC90L4t0LDQv9C/0LDRgNCw0YLQvdGL0Lkg0LrQvtC80L/Qu9C10LrRgSBWaVBOZXQgUEtJIFNlcnZpY2UgKNC90LAg0LDQv9C/0LDRgNCw0YLQvdC+0Lkg0L/Qu9Cw0YLRhNC+0YDQvNC1IEhTTSAyMDAw
UTIpDGjQn9GA0L7Qs9GA0LDQvNC80L3Qvi3QsNC/0L/QsNGA0LDRgtC90YvQuSDQutC+0LzQv9C70LXQutGBIMKr0K7QvdC40YHQtdGA0YIt0JPQntCh0KLCuy4g0JLQtdGA0YHQuNGPIDQuMAxO0KHQtdGA0YLQuNGE0LjQutCw0YIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNGPIOKEltCh0KQvMTI0LTM3NDMg
0L7RgiAwNC4wOS4yMDE5DE7Ql9Cw0LrQu9GO0YfQtdC90LjQtSDQvdCwINGB0YDQtdC00YHRgtCy0L4g0KPQpiDihJYxNDkvNy82LzIxMyDQvtGCIDMwLjAzLjIwMjMwZgYDVR0fBF8wXTAuoCygKoYoaHR0cDovL2NybC5yb3NrYXpuYS5ydS9jcmwvdWNma18yMDIzLmNybDAroCmgJ4YlaHR0cDovL2NybC5m
ay5sb2NhbC9jcmwvdWNma18yMDIzLmNybDB3BggrBgEFBQcBAQRrMGkwNAYIKwYBBQUHMAKGKGh0dHA6Ly9jcmwucm9za2F6bmEucnUvY3JsL3VjZmtfMjAyMy5jcnQwMQYIKwYBBQUHMAKGJWh0dHA6Ly9jcmwuZmsubG9jYWwvY3JsL3VjZmtfMjAyMy5jcnQwHQYDVR0OBBYEFJ/liu9p1XCBc3QYL4hAeQNF
GEDTMIIBdwYDVR0jBIIBbjCCAWqAFKcLlShvn+RLilGAsoUfiUr85/CcoYIBQ6SCAT8wggE7MSEwHwYJKoZIhvcNAQkBFhJkaXRAZGlnaXRhbC5nb3YucnUxCzAJBgNVBAYTAlJVMRgwFgYDVQQIDA83NyDQnNC+0YHQutCy0LAxGTAXBgNVBAcMENCzLiDQnNC+0YHQutCy0LAxUzBRBgNVBAkMStCf0YDQtdGB
0L3QtdC90YHQutCw0Y8g0L3QsNCx0LXRgNC10LbQvdCw0Y8sINC00L7QvCAxMCwg0YHRgtGA0L7QtdC90LjQtSAyMSYwJAYDVQQKDB3QnNC40L3RhtC40YTRgNGLINCg0L7RgdGB0LjQuDEYMBYGBSqFA2QBEg0xMDQ3NzAyMDI2NzAxMRUwEwYFKoUDZAQSCjc3MTA0NzQzNzUxJjAkBgNVBAMMHdCc0LjQvdGG0LjRhNGA0Ysg0KDQvtGB0YHQuNC4ggsA8KniiQAAAAAHnjAKBggqhQMHAQEDAgNBAPMgjxclqCHQYug9bNt5ScAdPpMz6Dh7n/J8WnPm9YJbhJQDWyLfd5MM3/TQwsA/nt1yq9NpGIq7cbwo1rmZFcg=</X509Certificate></X509Data></KeyInfo></Signature></ns2:MessageTypeSelector>


5. Проверяем файл в ЛК УВ, получаем ошибку: Электронная подпись должна быть подтверждена
ЭЦП не подтверждена: #SIGNED_BY_CALLER Ошибка проверки ЭП: Нарушена целостность ЭП


Пробовал:
1. Убирать/оставлять символы переноса строк
2. Изменять состав подписываемого XML (убирать Xpath, ID и тд)
3. Доп. каноникализацию с помощью lxml, но судя по всему, эти примеры уже представлены в каноничном виде.


Проблемы, которые я увидел:
1. pyCades каждый раз генерирует разное значение для аттрибута <ds:SignatureValue>
2. DigestValue отличается от того, что указано в примерах
3. Добавляется много лишних символов переноса строк (они нужны?)


Пожалуйста, подскажите, в чем может быть проблема?



Wanna join the discussion?! Login to your Форум КриптоПро forum account. Новые регистрации запрещены.

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