День добрый! 1С УПП, последняя версия.
Пытаюсь загрузить документ приемки ИС МП из честного знака. 1С думает и вываливает ошибку: HTTP-запрос не отправлен.
Ошибка работы с Интернет: Превышено время ожидания.
Разбираюсь и вижу, 1с посылает запрос на получение кодов по id документа:
api/v3/true-api/documents/35fde8ba-c72b-4285-8fac-4ec1f3908a85/info?pg=shoes&limit=300&order=DESC&orderColumn=uit_code
т.е. с порцией в 300 кодов. Далее вроде как посылает запрос на получение следующей порции
api/v3/true-api/documents/35fde8ba-c72b-4285-8fac-4ec1f3908a85/info?pg=shoes&limit=300&order=DESC&orderColumn=uit_code&orderedColumnValue=010463008025061121-5%3BA%3F0l.-50%3F%2A&pageDir=NEXT
Но этот запрос возвращает результат такой же, как и первый. И вообщем получается бесконечный цикл этого запроса, пока не свалится по таймауту.
В документе около 500 кодов. временно решил проблему, увеличив лимит до 3000 кодов на получение за один раз. Но получается это косяк, никто не сталкивался?
Перейти к содержанию
На чтение 1 мин. Просмотров 1.5k. Опубликовано
При недоступности ресурса Честный Знак при заходе в личный кабинет или через API во время продолжающихся DDoS-атак, воспользуйтесь этими рекомендациями.
1. Очистите кэш DNS.
Если у вас возникают сложности с заказом кодов маркировки или другими операциями в системе, а так же если отсутствует доступ к личному кабинету Честного Знака, попробуйте очистить кэш DNS с компьютеров и других устройств для работы с маркировкой.
Краткая инструкция по очистки кэша доступна по ссылке https://markirovvka.ru/vopros-otvet/kak-otchistit-kesh-dns.html
2. Настройте резервный DNS в настройках вашего модема.
Рекомендуем поставить в настройках ПО DNS сервер Яндекс, как резервный. Адрес DNS Яндекса — 77.88.8.8
3. Перейдите на работу по протоколу HTTPS.
В рамках повышения безопасности информационного обмена произведено отключение протокола HTTP при работе с API.
4. Обратитесь в службу поддержки, если заблокирован ваш интернет провайдер или ip адрес.
В связи с усиленной защитой от атак возможны блокировки со стороны провайдеров.
Уровень сложности
Средний
Время на прочтение
5 мин
Количество просмотров 6.1K
Привет, habr!
Хочу поделиться опытом работы с API системой маркировки товаров «Честный Знак» (ЧЗ) / МДЛП (маркировка лекарственных препаратов), в части аутентификация и авторизация пользователей.
Не раз сталкивался с интеграцией различных источников данных в аналитические системы, но конкретно эта задача показалась достойной публикации по той причине, что в процессе работы особо не нашлось готовых гайдов в интернете, хотя такой инструмент в бизнесе может быть довольно широко востребован – и при этом его реализация может наткнуться на некоторые подводные камни.
Задача: авторизоваться и забрать в ЧЗ статистические данные (информация о движении единиц продукции между юридическими лицами, статистика конечных продаж с адресами, и тп.)
В рамках данной статьи опускается вопрос о том, что такое система «Честный знак», и каковы основы ее работы – если вы начали читать эту статью, наверняка основы вам уже известны.
Итак, по порядку…
Для работы нам понадобится:
-
КРИПТОГРАФИЧЕСКОЕ ПО — в нашем случае — КриптоПро. Включает в себя следующие элементы:
-
КриптоПро CSP 5.0 ссылка https://cryptopro.ru/products/csp
-
плагин КриптоПро ЭЦП Browser plug-in ссылка https://www.cryptopro.ru/products/cades/plugin
-
расширение для браузера CryptoPro Extension for CAdES Browser Plug-in
Чтобы проверить, все ли стоит на нашем компе ЧЗ предоставляет небольшую страничку для проверки https://markirovka.crpt.ru/plugins/cryptopro
-
Сам сертификат КЭП. И не просто сертификат, а тот который зарегистрирован в ЧЗ.
-
Ну и Python. Хотя в большинстве своем мы обращаемся к com-Объектам и х можно дергать из любого языка который вам по душе.
Собственно, решение вопросов с КЭП – это основное, чем хочу поделиться в рамках данной статьи.
В нашем примере КЭП уже есть (она не простая, а открепляемая, что позволило установить триальную версию КриптоПро на разработческий контур). При импорте сертификата рекомендую устанавливать его в личное хранилище.
После того, как вы установили Сертификат, КриптоПро и все его плагины, было бы не лишним перейти в личный кабинет (ЛК) на сайте, поскольку оттуда нам необходимо взять креды для авторизации. На текущий момент в документации (https://mdlp.crpt.ru/static/document/api_mdlp_ru.pdf) к API сказано, что для авторизации вам необходимо client_id, client_secret, user_id, первые два мы как раз таки смотрим в ЛК в разделе Администрирование – Учетные Системы:
Рекомендую также скопировать серийный номер, он нам тоже вскоре понадобиться.
Теперь переходим к самому интересному — аутентификация и авторизация. Происходит это чудо в 3 этапа. Сначала мы получаем «код аутентификации» потом подписываем его сертификатом и отправляем обратно в ЧЗ и потом можем получить авторизационный токен.
Отдельно отметим, что в документации к API ЧЗ нет ни слова о том, как подписывать этот «код аутентификации».
Тут нам пришлось идти в документацию от КриптоПро https://docs.cryptopro.ru/cades/usage
И так если ваш проект на Ubuntu вам повезло для вас сделали «Сборку расширения для языка Python», что там они насобирали и работает ли оно я не проверял. Ну а если вы на Windows далее актуально для вас.
В документации от КриптоПро есть раздел «Интерфейс COM» он то нам и нужен там даже есть примеры на VBScript, которые помогли нам отчасти. Для авторизации на нужны следующие объекты:
-
«CAdESCOM.Store» – поможет в поиске нужного сертификата в хранилище сертификатов
-
«CAdESCOM.CPSigner» – объект для подписания
-
«CAdESCOM.CPAttribute» – объект который добавляет атрибут к подписи
-
«CAdESCOM.CadesSignedData» – объект усовершенствованной подписи
Для работы нам нужно установить библиотеку win32com, установка pywin32, которую написал Mark Hammond храни его Господь. Еще одна рекомендация: держите под рукой ссылку на страницу Tim Golden http://timgolden.me.uk/python/ на этом ресурсе есть еще много подробностей о том, как использовать Python в Windows для автоматизации и других административных задач.
И так по порядку что нужно сделать чтобы получить токен или, как он называется в документации ЧЗ, «Ключ сессии»
-
Импортируем нужные библиотеки
import win32com.client
import os, sys
import json
import datetime
import base64
-
Объявляем константы для методов КриптоПро
CADES_BES = 1
CADES_DEFAULT = 0
CAPICOM_ENCODE_BASE64 = 0
CAPICOM_CURRENT_USER_STORE = 2
CAPICOM_MY_STORE = 'My'
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2
-
Ищем нужный сертификат в хранилище. Тут то нам и нужно передать, сохранённый ранее, серийный номер
oStore = win32com.client.Dispatch("CAdESCOM.Store")
oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
for val in oStore.Certificates:
if val.SerialNumber == sSerialNumber:
oCert = val
oStore.Close
-
Вызываем объект для подписания и объект передачи атрибутов
oSigner = win32com.client.Dispatch(CAdESCOM.CPSigner")
oSigner.Certificate = oCert
oSigningTimeAttr = win32com.client.Dispatch("CAdESCOM.CPAttribute")
oSigningTimeAttr.Name = 0
oSigningTimeAttr.Value = datetime.datetime.now()
oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr)
-
Получаем код аутентификации, а вот тут важно заменить особенность что нам не удалось достучаться до ЧЗ через всем известную библиотеку requests, на этом этапе мы потеряли немало времени, пока не догадались, что нужно использовать COM объекты Windows «WinHTTP.WinHTTPRequest.5.1»
url = "https://api.mdlp.crpt.ru/api/v1/auth"
params = {
'client_id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'client_secret':'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'user_id':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
'auth_type':'SIGNED_CODE'
}
win_http = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
win_http.Open("POST", url, False)
win_http.SetRequestHeader("Content-Type","application/json;charset=UTF-8")
win_http.SetRequestHeader("Accept","application/json;charset=UTF-8")
win_http.Send(json.dumps(params))
win_http.WaitForResponse()
print(win_http.ResponseText)
items = json.loads(win_http.ResponseText)
CodeAuth = items['code']
-
Далее вызываем объект усовершенствованной подписи и её создание. Данный пункт у нас тоже отнял не мало сил и поэтому я перечислю наши ошибки, чтобы вы их не повторили:
-
Обязательно убедитесь, что вы передали в переменную из полученного ответа сам код, а не весь json, потому что вы с легкостью подпишете его, а потом в ответ раз за разом вам будет прилетать ошибка авторизации.
-
Обязательно закодируйте в base64 код
-
И проверьте настройки времени, которые атрибутом добавляются к подписи на предыдущем шаге
oSignedData = win32com.client.Dispatch("CAdESCOM.CadesSignedData")
oSignedData.ContentEncoding = 1
message = CodeAuth
message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')
oSignedData.Content = base64_message
sSignedData = oSignedData.SignCades(oSigner, CADES_BES, False, CAPICOM_ENCODE_BASE64)
-
Ну и заключительный шаг — получение ключа сессии
url = "https://api.mdlp.crpt.ru/api/v1/token"
paramskey ={
'code': CodeAuth,
'signature': sSignedData
}
print(json.dumps(paramskey))
win_http.Open("POST", url, False)
win_http.SetRequestHeader("Content-Type","application/json;charset=UTF-8")
win_http.SetRequestHeader("Accept","application/json;charset=UTF-8")
win_http.Send(json.dumps(paramskey))
win_http.WaitForResponse()
print(win_http.ResponseText)
Если в результате вы получили:
{«token»:»0d90d966-5027-416f-a0cd-0697db8c79f3″,»life_time»:600}
— поздравляю, вы сделали все верно!
В данной статье не стоит цель переписать всю документацию КриптоПро и ЧЗ, а только рассказать о решении тех проблем, которые заняли у нас больше всего времени. Если у кого-то остались вопросы – буду рад ответить в комментариях.
Здравствуйте!
Кто-нибудь, в теме, что сейчас происходит с API «Честного знака» — ?
Как я понял, их прошло «миллион» версий, одна другой круче…
Короче, вопрос — закрывается магазинчик, и хочется обнулить остатки марок(ТАБАЧКА!) в ЧЗ в «0»…
Когда только появилась маркировка, я успешно разобрался с имеющимся на тот момент API в части получения доступа(генерация токена), и запросом на «дезагрегацию» упаковок(блоков, так, как поставщики в мелкие розничные магазины отгружают именно блоками, и их ШК указывают в УПД) сигарет, длв использования их GTIN пачек в учетной системе в качестве ЕАН пачек для продажи через кассы.
На тот момент, этого мне вполне хватало, и все это функционирует в нескольких торговых точках по сей день.
Но, вчера сунулся дописать запрос остатков марок в ЧЗ — и «сел в лужу»…
Запросы остатков марок по тому API, через который делал получение токена и дезагрегацию, оказывается не работают — что-бы не отправлял, везде 404… Хотя, эти функции продолжают работать.
Кто-то делал нечто подобное сейчас? Какие там «правильные» параметры запроса, URL, и т.п. — ?
Если у кого-то есть пример рабочего на текущий момент запроса — поделитесь плиз, буду безмерно признателен…
PS В принципе, мне для моей задачи, достаточно получить список марок со статусом «в обороте», далее их можно сохранить в Эксель, и в ЛК скормить документу списание. Делать это по API, я не собираюсь, задача разовая, «игра не стоит свеч». Но, получить этот список без API — не реально, их довольно много, в ручную, на несколько дней работа… А в ЛК я не нашел способа выгрузить их в файл.
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Нужна помощь в авторизации по API в Честном знаке. Система авторизации там такая Код:
Код:
Далее Код:
Как подписать эту строку на удаленном Linux сервере. Я установил там КриптоПро для Linux certmgr В вебинаре Честного знака сказали что-то про «экспорт сертификата». |
|
|
Андрей * |
|
Статус: Сотрудник Группы: Участники Сказал «Спасибо»: 461 раз |
Здравствуйте. Контейнер (папка с .key файлами или в каком виде имеется?) перенесён на сервер? Сертификат установили в хранилище? Цитата: как заставить удаленный сервак подписать эту строку, необходимую для авторизации ? Подписание: file.txt — содержит текстовую строку file.txt.p7s — будет содержать присоединенную подпись (данные из file.txt, сертификат, подпись) далее прочитать file.txt.p7s, закодировать в base64 и отправить запрос через curl |
Техническую поддержку оказываем тут |
|
|
WWW |
Андрей * |
|
Статус: Сотрудник Группы: Участники Сказал «Спасибо»: 461 раз |
либо другой вариант, через php — собрать расширение и подписывать\отправлять из php |
Техническую поддержку оказываем тут |
|
|
WWW |
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Автор: Андрей * либо другой вариант, через php — собрать расширение и подписывать\отправлять из php Спасибо большое. Да, это то, что нужно. |
|
|
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Автор: Андрей * либо другой вариант, через php — собрать расширение и подписывать\отправлять из php Пробовал собрать, не работает |
|
|
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Автор: Андрей * Здравствуйте. Контейнер (папка с .key файлами или в каком виде имеется?) перенесён на сервер? Сертификат установили в хранилище? Цитата: как заставить удаленный сервак подписать эту строку, необходимую для авторизации ? Подписание: file.txt — содержит текстовую строку file.txt.p7s — будет содержать присоединенную подпись (данные из file.txt, сертификат, подпись) далее прочитать file.txt.p7s, закодировать в base64 и отправить запрос через curl Устанавливаю сертификат для пользователя www-root Пытаюсь подписать файл CryptCP 5.0 (c) «Crypto-Pro», 2002-2022. The following certificate will be used: Folder ‘/var/www/www-root/data/’: Где взять этот закрытый ключ, и как его установить (в контейнер, видимо). И, если все это так, что как создать этот самый контейнер ? Отредактировано пользователем 22 июля 2022 г. 2:16:53(UTC) |
|
|
two_oceans |
|
Статус: Эксперт Группы: Участники Сказал(а) «Спасибо»: 110 раз |
Добрый день. По вопросу — есть еще и облачные подписи, в таком случае на физический объект флешка не понадобится. Поддерживаются в КриптоПро с 5 версии. Насчет копирования ключа на сервер (допустим, в своей стране) важно знать: |
|
|
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Автор: two_oceans Добрый день. По вопросу — есть еще и облачные подписи, в таком случае на физический объект флешка не понадобится. Поддерживаются в КриптоПро с 5 версии. Насчет копирования ключа на сервер (допустим, в своей стране) важно знать: Нашел, как вытащить закрытый ключ с рутокена. Скопировал 6 .key файлов в папку. root@server0:/opt/cprocsp/bin/amd64# /opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn но упорно не хочет брать из него ключ root@server0:/opt/cprocsp/bin/amd64# sudo -u www-root /opt/cprocsp/bin/amd64/cryptcp -sign -thumbprint e07bcb550e38222ea9d0142c4c574bdd471df28f «/var/www/www-root/data/test.txt» «/var/www/www-root/data/test.txt.p7s» -nochain -norev The following certificate will be used: Folder ‘/var/www/www-root/data/’: |
|
|
two_oceans |
|
Статус: Эксперт Группы: Участники Сказал(а) «Спасибо»: 110 раз |
Автор: Vlady84 Контейнер видит Добрый день. Это уже детали процедуры установки сертификата, которые чуть не в каждом руководстве по установке сертификата на Linux описываются. Конечно лишний раз повторить не помешает. Во-первых, важно, чтобы команды были от одного пользователя. Выше одна команда без sudo то есть от самого пользователя root, а вторая (если я правильно понимаю) от www-root. Если root контейнер HDIMAGE ищется в папке /var/opt/cprocsp/keys/root/ Если www-root контейнер HDIMAGE ищется в папке /var/opt/cprocsp/keys/www-root/ У соответствующего пользователя должны быть права на нужную папку — чтение и запись. (Для видимости всем по идее еще какая-то папка, но используется нечасто, так что точно не знаю.) Таким образом, в одном случае контейнер увидится, в другом нет. Тем не менее, обычно в такой ситуации из функций нижнего уровня «выскакивает» другая ошибка — «Набор ключей не существует» и делается попытка его сгенерировать. Другой код ошибки вероятно указывает, что еще с чем-то не все в порядке. Во-вторых, если при подписании указывается не имя контейнера, а сертификат или реквизиты (отпечаток в командной строке выше) сертификата, то сертификат должен быть: а) установлен в хранилище сертификатов — выше можно увидеть в выводе что нашелся, показало его срок действия; б) при установке в хранилище должен быть указан контейнер для этого сертификата. Проверить можно командой (от нужного пользователя) вроде такой sudo -u www-root /opt/cprocsp/bin/amd64/certmgr -list -store uMy где uMy — имя хранилища, ищем строку PrivateKey: Yes и совпадение строки Container: с тем, что выдало csptest -keyset -enum_cont -verifycontext -fqcn , то есть \\.\HDIMAGE\d57b44fd-7ac9-4479-bf9a-b6be6d111eca-1 Если PrivateKey: No или неверное имя контейнера, то нужно переустановить сертификат в хранилище. Отредактировано пользователем 5 сентября 2022 г. 7:41:24(UTC) |
|
|
Vlady84 |
|
Статус: Новичок Группы: Участники
|
Автор: two_oceans Автор: Vlady84 Контейнер видит Добрый день. Это уже детали процедуры установки сертификата, которые чуть не в каждом руководстве по установке сертификата на Linux описываются. Конечно лишний раз повторить не помешает. Во-первых, важно, чтобы команды были от одного пользователя. Выше одна команда без sudo то есть от самого пользователя root, а вторая (если я правильно понимаю) от www-root. Если root контейнер HDIMAGE ищется в папке /var/opt/cprocsp/keys/root/ Если www-root контейнер HDIMAGE ищется в папке /var/opt/cprocsp/keys/www-root/ У соответствующего пользователя должны быть права на нужную папку — чтение и запись. (Для видимости всем по идее еще какая-то папка, но используется нечасто, так что точно не знаю.) Таким образом, в одном случае контейнер увидится, в другом нет. Тем не менее, обычно в такой ситуации из функций нижнего уровня «выскакивает» другая ошибка — «Набор ключей не существует» и делается попытка его сгенерировать. Другой код ошибки вероятно указывает, что еще с чем-то не все в порядке. Во-вторых, если при подписании указывается не имя контейнера, а сертификат или реквизиты (отпечаток в командной строке выше) сертификата, то сертификат должен быть: а) установлен в хранилище сертификатов — выше можно увидеть в выводе что нашелся, показало его срок действия; б) при установке в хранилище должен быть указан контейнер для этого сертификата. Проверить можно командой (от нужного пользователя) вроде такой sudo -u www-root /opt/cprocsp/bin/amd64/certmgr -list -store uMy где uMy — имя хранилища, ищем строку PrivateKey: Yes и совпадение строки Container: с тем, что выдало csptest -keyset -enum_cont -verifycontext -fqcn , то есть \\.\HDIMAGE\d57b44fd-7ac9-4479-bf9a-b6be6d111eca-1 Если PrivateKey: No или неверное имя контейнера, то нужно переустановить сертификат в хранилище. Спасибо большое за ваш труд. root@server0:~# sudo -u www-root /opt/cprocsp/bin/amd64/certmgr -inst -all -store uMy -file /home/cert.p7b -cont ‘\\.\HDIMAGE\d57b44fd-7ac9-4479-bf9a-b6be6d111eca-1’ показывает данные серта и пишет The data is invalid. Я удалял серт и контейнер и создавал заново /var/opt/cprocsp/keys/www-root/ — .key файлы залил, владельца поменял на www-root /opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn показывают контейнеры для обоих пользователей Как переустановить сертификат в хранилище, чтобы этот приватлинк привязался ? |
|
|
Пользователи, просматривающие эту тему |
Guest |
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.