Ошибки api честный знак

День добрый! 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 системой маркировки товаров «Честный Знак» (ЧЗ) / МДЛП (маркировка лекарственных препаратов), в части аутентификация и авторизация пользователей.

Не раз сталкивался с интеграцией различных источников данных в аналитические системы, но конкретно эта задача показалась достойной публикации по той причине, что в процессе работы особо не нашлось готовых гайдов в интернете, хотя такой инструмент в бизнесе может быть довольно широко востребован – и при этом его реализация может наткнуться на некоторые подводные камни.

Задача: авторизоваться и забрать в ЧЗ статистические данные (информация о движении единиц продукции между юридическими лицами, статистика конечных продаж с адресами, и тп.)

В рамках данной статьи опускается вопрос о том, что такое система «Честный знак», и каковы основы ее работы – если вы начали читать эту статью, наверняка основы вам уже известны.

Итак, по порядку…

Для работы нам понадобится:

  1. КРИПТОГРАФИЧЕСКОЕ ПО — в нашем случае —  КриптоПро. Включает в себя следующие элементы:

  • КриптоПро 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

  1. Сам сертификат КЭП. И не просто сертификат, а тот который зарегистрирован в ЧЗ.

  2. Ну и 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 для автоматизации и других административных задач.

И так по порядку что нужно сделать чтобы получить токен или, как он называется в документации ЧЗ, «Ключ сессии»

  1. Импортируем нужные библиотеки

import win32com.client
import os, sys
import json
import datetime
import base64
  1. Объявляем константы для методов КриптоПро

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
  1. Ищем нужный сертификат в хранилище. Тут то нам и нужно передать, сохранённый ранее, серийный номер

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
  1. Вызываем объект для подписания и объект передачи атрибутов

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)
  1. Получаем код аутентификации, а вот тут важно заменить особенность что нам не удалось достучаться до ЧЗ через всем известную библиотеку 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']
  1. Далее вызываем объект усовершенствованной подписи и её создание. Данный пункт у нас тоже отнял не мало сил и поэтому я перечислю наши ошибки, чтобы вы их не повторили:

  • Обязательно убедитесь, что вы передали в переменную из полученного ответа сам код, а не весь 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)
  1. Ну и заключительный шаг — получение ключа сессии

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 — не реально, их довольно много, в ручную, на несколько дней работа… А в ЛК я не нашел способа выгрузить их в файл.


Offline

Vlady84

 


#1
Оставлено
:

2 июля 2022 г. 14:05:38(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Нужна помощь в авторизации по API в Честном знаке.

Система авторизации там такая

Код:


curl -X GET "<url стенда v3>/auth/key"
-H "accept: application/json"

Код:


Ответ
{
   "uuid":"a63ff582-b723-4da7-958b-453da27a6c62", // Уникальный идентификатор сгенерированных случайных данных
   "data":"GNUFBAZBMPIUUMLXNMIOGSHTGFXZMT" // Случайная строка данных
}

Далее

Код:


curl -X POST "<url стенда v3>/auth/simpleSignIn"
-H "accept: application/json"
-H "Content-Type: application/json"

{
   "uuid":"string", // полученный id
   "data":"string" // Подписанные УКЭП зарегистрированного УОТ случайные данные в base64 (присоединённая ЭП)
}

Как подписать эту строку на удаленном Linux сервере.

Я установил там КриптоПро для Linux
Содержимое папки на сервере

certmgr
cpverify
cryptcp
csptest > csptestf
csptestf
csptestlite
curl
der2xer
genkpim
inittst
list_pcsc
wipefile

В вебинаре Честного знака сказали что-то про «экспорт сертификата».
Экспорт сертификата ИП я нашел, как сделать, из виндового приложения КриптоПро ноута, который работает с флешкой,
а как заставить удаленный сервак подписать эту строку, необходимую для авторизации ?


Вверх


Offline

Андрей *

 


#2
Оставлено
:

2 июля 2022 г. 15:03:34(UTC)

Андрей *

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

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,134
Мужчина
Российская Федерация

Сказал «Спасибо»: 461 раз
Поблагодарили: 1950 раз в 1508 постах

Здравствуйте.

Контейнер (папка с .key файлами или в каком виде имеется?) перенесён на сервер? Сертификат установили в хранилище?

Цитата:

как заставить удаленный сервак подписать эту строку, необходимую для авторизации ?

Подписание:
/opt/cprocsp/bin/amd64/cryptcp -sign -thumbprint отпечаток «/path/file.txt» «/path/file.txt.p7s» -nochain -norev

file.txt — содержит текстовую строку

file.txt.p7s — будет содержать присоединенную подпись (данные из file.txt, сертификат, подпись)

далее прочитать file.txt.p7s, закодировать в base64 и отправить запрос через curl

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#3
Оставлено
:

2 июля 2022 г. 15:13:21(UTC)

Андрей *

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

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,134
Мужчина
Российская Федерация

Сказал «Спасибо»: 461 раз
Поблагодарили: 1950 раз в 1508 постах

либо другой вариант, через php — собрать расширение и подписывать\отправлять из php

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Vlady84

 


#4
Оставлено
:

2 июля 2022 г. 16:49:43(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Автор: Андрей * Перейти к цитате

либо другой вариант, через php — собрать расширение и подписывать\отправлять из php

Спасибо большое. Да, это то, что нужно.


Вверх


Offline

Vlady84

 


#5
Оставлено
:

22 июля 2022 г. 1:03:45(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Автор: Андрей * Перейти к цитате

либо другой вариант, через php — собрать расширение и подписывать\отправлять из php

Пробовал собрать, не работает
eval `/opt/cprocsp/src/doxygen/CSP/../setenv.sh —64`; make -f Makefile.unix
постоянно выдает кучу разных ошибок. То файла .h какого то не хватает, по версия не та. Причем почти все из них обсуждались на форуме.
Пробовал патч, пробовал все версии. Бесполезно. Php 7.4
Snimok ehkrana 2022-07-22 010226.png (91kb) загружен 2 раз(а).


Вверх


Offline

Vlady84

 


#6
Оставлено
:

22 июля 2022 г. 1:05:22(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Автор: Андрей * Перейти к цитате

Здравствуйте.

Контейнер (папка с .key файлами или в каком виде имеется?) перенесён на сервер? Сертификат установили в хранилище?

Цитата:

как заставить удаленный сервак подписать эту строку, необходимую для авторизации ?

Подписание:
/opt/cprocsp/bin/amd64/cryptcp -sign -thumbprint отпечаток «/path/file.txt» «/path/file.txt.p7s» -nochain -norev

file.txt — содержит текстовую строку

file.txt.p7s — будет содержать присоединенную подпись (данные из file.txt, сертификат, подпись)

далее прочитать file.txt.p7s, закодировать в base64 и отправить запрос через curl

Устанавливаю сертификат для пользователя www-root
sudo -u www-root /opt/cprocsp/bin/amd64/certmgr -inst -all -store uMy -file /home/cert.p7b

Пытаюсь подписать файл
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

CryptCP 5.0 (c) «Crypto-Pro», 2002-2022.
Command prompt Utility for file signature and encryption.

The following certificate will be used:
RDN:хххххххххххххххххххххххххххххххххххххх
Valid from 01.02.2022 11:00:15 to 01.05.2023 11:10:15

Folder ‘/var/www/www-root/data/’:
/var/www/www-root/data/test.txt… Error: Can not get certificate private key.
../../../../CSPbuild/CSP/samples/CPCrypt/DSign.cpp:489: 0x20000136
[ErrorCode: 0x20000136]

Где взять этот закрытый ключ, и как его установить (в контейнер, видимо).
Ключ вроде как должен находиться на флешке синей (иначе, зачем она нужна каждый раз).
Но сервер находится в датацентре за границей и воткнуть ее туда невозможно.
Правильно ли я понимаю, что вытащить закрытый ключ из флешки невозможно и она обязательно нужна, как физической объект,
а следовательно, единственный способ автоматизировать подпись, это собрать комп на статическом ip, куда воткнуть эту флешку ?

И, если все это так, что как создать этот самый контейнер ?

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


Вверх


Offline

two_oceans

 


#7
Оставлено
:

1 августа 2022 г. 13:32:37(UTC)

two_oceans

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

Группы: Участники

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 389 раз в 364 постах

Добрый день.
Советовать насчет сервера за границей сложно, лучше бы что-то в пределах своей страны использовать для подписания. Могут быть разные «несоответствия» при передаче ключа через границу.

По вопросу — есть еще и облачные подписи, в таком случае на физический объект флешка не понадобится. Поддерживаются в КриптоПро с 5 версии.

Насчет копирования ключа на сервер (допустим, в своей стране) важно знать:
а) неизвлекаемый (неэкспортируемый) ли ключ и б) обычная флешка или токен.
1. Если флешка обычная, то достаточно скопировать контейнер (папку с именем вроде хххххххх.000 и с 6 файликами key) в определенную папку на сервере, примерно /var/opt/cprocsp/keys/root/ если запускаете под root. Далее установить сертификат с привязкой к контейнеру.
2. Если токен и ключ извлекаемый (экспортируемый), то можно штатно скопировать на обычную флешку средствами КриптоПро, далее как в предыдущем пункте.
3. Если токен и ключ неизвлекаемый (неэкспортируемый), — в активном или пассивном режиме создан ключ. Активный режим приговаривает к ситуации когда должен торчать конкретный физический носитель и больше никак. Пассивный режим означает, что токен только хранилище и в теории можно попробовать считать ключ, затем записать копию. «В теории», потому что штатные средства тут не помогут, а соответствующие форматы не афишируют. Поэтому более реально перевыпустить сертификат специально указав, что ключ должен быть экспортируемый.


Вверх


Offline

Vlady84

 


#8
Оставлено
:

5 сентября 2022 г. 1:51:23(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Автор: two_oceans Перейти к цитате

Добрый день.
Советовать насчет сервера за границей сложно, лучше бы что-то в пределах своей страны использовать для подписания. Могут быть разные «несоответствия» при передаче ключа через границу.

По вопросу — есть еще и облачные подписи, в таком случае на физический объект флешка не понадобится. Поддерживаются в КриптоПро с 5 версии.

Насчет копирования ключа на сервер (допустим, в своей стране) важно знать:
а) неизвлекаемый (неэкспортируемый) ли ключ и б) обычная флешка или токен.
1. Если флешка обычная, то достаточно скопировать контейнер (папку с именем вроде хххххххх.000 и с 6 файликами key) в определенную папку на сервере, примерно /var/opt/cprocsp/keys/root/ если запускаете под root. Далее установить сертификат с привязкой к контейнеру.
2. Если токен и ключ извлекаемый (экспортируемый), то можно штатно скопировать на обычную флешку средствами КриптоПро, далее как в предыдущем пункте.
3. Если токен и ключ неизвлекаемый (неэкспортируемый), — в активном или пассивном режиме создан ключ. Активный режим приговаривает к ситуации когда должен торчать конкретный физический носитель и больше никак. Пассивный режим означает, что токен только хранилище и в теории можно попробовать считать ключ, затем записать копию. «В теории», потому что штатные средства тут не помогут, а соответствующие форматы не афишируют. Поэтому более реально перевыпустить сертификат специально указав, что ключ должен быть экспортируемый.

Нашел, как вытащить закрытый ключ с рутокена. Скопировал 6 .key файлов в папку.
Контейнер видит

root@server0:/opt/cprocsp/bin/amd64# /opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn
CSP (Type:80) v5.0.10010 KC1 Release Ver:5.0.12500 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 39012595
\\.\HDIMAGE\d57b44fd-7ac9-4479-bf9a-b6be6d111eca-1
OK.
Total: SYS: 0.000 sec USR: 0.000 sec UTC: 0.010 sec
[ErrorCode: 0x00000000]

но упорно не хочет брать из него ключ

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
CryptCP 5.0 (c) «Crypto-Pro», 2002-2022.
Command prompt Utility for file signature and encryption.

The following certificate will be used:
RDN:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from 01.02.2022 11:00:15 to 01.05.2023 11:10:15

Folder ‘/var/www/www-root/data/’:
/var/www/www-root/data/test.txt… Error: Can not get certificate private key.
../../../../CSPbuild/CSP/samples/CPCrypt/DSign.cpp:489: 0x20000136
[ErrorCode: 0x20000136]
root@server0:/opt/cprocsp/bin/amd64#


Вверх


Offline

two_oceans

 


#9
Оставлено
:

5 сентября 2022 г. 7:38:15(UTC)

two_oceans

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

Группы: Участники

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

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 389 раз в 364 постах

Автор: Vlady84 Перейти к цитате

Контейнер видит
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

Добрый день. Это уже детали процедуры установки сертификата, которые чуть не в каждом руководстве по установке сертификата на 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)
 | Причина: Не указана


Вверх


Offline

Vlady84

 


#10
Оставлено
:

5 сентября 2022 г. 22:41:28(UTC)

Vlady84

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

Группы: Участники

Зарегистрирован: 02.07.2022(UTC)
Сообщений: 8
Российская Федерация
Откуда: Moscow

Автор: two_oceans Перейти к цитате

Автор: Vlady84 Перейти к цитате

Контейнер видит
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

Добрый день. Это уже детали процедуры установки сертификата, которые чуть не в каждом руководстве по установке сертификата на 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’

показывает данные серта
PrivateKey Link : No
Identification Kind : Personal presence

и пишет
Installing multiple certificates with private key link is not allowed

The data is invalid.

Я удалял серт и контейнер и создавал заново

/var/opt/cprocsp/keys/www-root/ — .key файлы залил, владельца поменял на www-root

/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn
и
sudo -u www-root /opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -verifycontext -fqcn

показывают контейнеры для обоих пользователей

Как переустановить сертификат в хранилище, чтобы этот приватлинк привязался ?


Вверх

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Понравилась статья? Поделить с друзьями:
  • Ошибки api wildberries
  • Ошибки bmw e63
  • Ошибки ecu джон дир
  • Ошибки 1с зкгу
  • Ошибки anr что это