Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ 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. Добавляется много лишних символов переноса строк (они нужны?)


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



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