Публикация № 1701504
ЭЦП Такском КриптоПро Crypto-Pro
Исправление ошибок
КриптоПро. Ошибка. Не удалось создать подпись из-за ошибки: Время ожидания операции истекло(0x80072EE2)
HTTP error occurred during sending request (0xC2110100).
Т.к. ЭЦП применяется и в конфигурациях на платформе 1С, решил тут опубликовать небольшую заметку, чтобы облегчить людям жизнь.
Клиент столкнулся с проблемой подписания документов на портале ДО.
– КриптоПро. Ошибка. Не удалось создать подпись из-за ошибки: Время ожидания операции истекло(0x80072EE2)
– HTTP error occurred during sending request (0xC2110100)
В свойствах сертификата находим поле OCSP сервера, вбиваем его в браузер и проверяем доступность.
В моём случае это был сервер такскома – http://ocsp2012.taxcom.ru/ocsp/ocsp.srf
При открытии данного URL в браузере на сервере клиента ничего не происходит – сервер не отвечает.
Проверяем телнетом – telnet ocsp2012.taxcom.ru 80
Ответа тоже нет.
Проверка с другого IP проходит: сервер отдаёт файл, телнет подключается.
Следовательно, делаем вывод о том, что блокировка происходит либо по вине провайдера, либо по вине Такскома.
Звоним в Техподдержку Taxcom – сообщаем свой IP, уточняем проблему, удостоверяемся, что IP находится в чёрном списке, и просим разблокировать.
Через 20 минут подписание документов работает без ошибок.
Специальные предложения
(1)
Мда. RTFM.
С чего вы вообще решили, что МенеджерКриптографии.Подписать выдаст вам подпись в формате xmldsig?
Это так не работает. Вот вообще.
Что делаю не правильно?
Да собственно, все делаете не правильно.
Платформа не умеет подписывать в формате xmldsig.
Но в БСП есть внешняя компонента, которая умеет.
6.
wtlz
Сейчас в теме
(4) собственно по этому и спрашиваю, что мат. часть по этому вопросу со стороны 1с освещена слабо, а пример с ИТС получается вообще не к этому относится.
Можете ссылку на описание ВК? Или хотя бы ее наименование?
(1)По поводу ошибки при подписи.
При таком создании сертификата провайдер может быть разный, его надо указать явно.
Microsoft Software Key Storage Provider
Microsoft Smart Card Key Storage Provider
Microsoft Platform Crypto Provider
Microsoft Strong Cryptographic Provider
Microsoft Enhanced Cryptographic Provider v1.0
Microsoft Enhanced RSA and AES Cryptographic Provider
Microsoft Base Cryptographic Provider v1.0
The name of a third party KSP or CSP
У вас создался сертификат с провайдером Microsoft Software Key Storage Provider, а вы создаете менеджер криптографии для провайдера Microsoft Enhanced Cryptographic Provider v1.0, поэтому и ошибка.
7.
wtlz
Сейчас в теме
(5) исходя из (4) текущему коду это исправление не поможет, верно?
9.
wtlz
Сейчас в теме
(8) спасибо, буду пробовать. Видел этот метод в конфе, но не смог подумать, что он мне подойдёт.
10.
wtlz
Сейчас в теме
(8) попробовал, проблема с сертификатами.
Вопрос – делали ли уже такую процедуру сами? Если да, то сертификат самовыпущенный? Если да, то как его создавали?
(10)Как-то пробовал, в тот раз не разобрался что передать, чтобы заработало. Больше не пробовал.
Но то что оно работает у других, это точно.
У меня есть сертификат крипто-про.
Самовыпущенные сертификаты не использовал.
Код получения сертификатов и подписи с ИТС
А если взять за исходный материал не ИТС, а
вот эту разработку
13.
wtlz
Сейчас в теме
(12)пробовал , не получается, ошибки те же, т.к. код По сути тот же что и на итс
15.
wtlz
Сейчас в теме
(14) спасибо за ссылку, буду пробовать, обязательно отпишусь по результату
22.
wtlz
Сейчас в теме
24.
wtlz
Сейчас в теме
(23) сходил, добавил для сертификата права всем пользователям – ничего не изменилось, та же ошибка (
В том числе и USR1CV8, или как там у вас называется пользователь, от имени которого запускается 1С?
А что показывает certmgr.msc в свойствах этого сертификата? Есть для него закрытый ключ или нет?
26.
wtlz
Сейчас в теме
(25) да, для usr1cv8 тоже.
В свойствах закрытого ключа не нашёл – по картинками должен быть ключик на главной странице свойств и надпись. Но его нет (
Тогда результат из (22) закономерен – система не видит закрытого ключа и поэтому 1С никак не сможет ним работать.
28.
wtlz
Сейчас в теме
(27) не могу понять, как связать сертификат с закрытым ключом, и где его взять?
29.
uno-c
Сейчас в теме
(22) Картинка “на клиентском компьютере”. Так Вы где подпись собираетесь ставить, &НаКлиенте или &НаСервере?
30.
wtlz
Сейчас в теме
(29) собираюсь на сервере, а картинка в рдп сеансе под админом
31.
uno-c
Сейчас в теме
(30) 1) Команда PowerShell добавит самоподписанный с закрытым ключом в личное текущего пользователя ОС – в хранилище админа.
2) Далее его нужно экспортировать с закрытым ключом. Win+R certmgr.msc
3) Потом certmgr.msc нужно запустить под тем пользователем, под которым сервер 1С работает как служба (например USR1CV8), и в личное хранилище этого юзера импортировать файл из шага-2
32.
uno-c
Сейчас в теме
(30) У меня после того, как сертификат с закрытым ключом появился в личном хранилище сертификатов у пользователя USR1CV8 – начинает работать следующий код:
33.
uno-c
Сейчас в теме
(22) Если Вы генерировали сертификат по инструкции через certreq.exe -new template.txt outcert.cer – то он должен появиться в остнастке
Win+R
mmc
Ctrl+M
Сертификаты
Учетной записи компьютера
Экспортируем из остнастки этот сертификат с закрытым ключом в файл (название файла задаем, чтобы не перепутать с outcert.cer, т.к. outcert.cer это просто открытый сертификат без закрытого ключа), закрываем консоль. Открываем консоль снова под пользователем USR1CV8 (можно создать ярлык на рабочем столе certmgr.msc и запускать его от имени пользователя USR1CV8) В консоли импортируем файл с закрытым ключом в личное хранилище пользователя USR1CV8.
После всего этого МенеджерКриптографии.Подписать – сможет подписать данным ключом &НаСервере.
Приведенная Вами картинка относится к подписанию из личного хранилища текущего пользователя, НаКлиенте. Если хотите подписывать на клиенте с помощью МенеджераКриптографии – то нужно из файла импортировать сертификат с закрытым ключом в личное хранилище пользователя (админа) – тоже через остнастку certmgr.msc, запущенную от имени админа.
34.
wtlz
Сейчас в теме
(33) спасибо за подробное описание, буду пробовать
35.
uno-c
Сейчас в теме
(34) Это еще пока простая подпись. Потом Вам с xml – подписанием предстоят танцы. Можно попробовать сразу за него взяться. Я когда с COM КриптоПро работал (CAPICOM) – видел мимоходом в документации, что он это умеет.
Возможно, есть и без внешних компонент что-то. В принципе, XML сигнатура – это сначала каноникализация XML, потом его подписание и встраивание подписи в XML. Теоретически можно и на языке 1С написать с использованием менеджера криптографии. Может уже и написано.
2.
Oleg_nsk
Сейчас в теме
Попробуйте повторно связать сертификат с контейнером.
(2) можете подробнее описать, как это сделать?
16.
uno-c
Сейчас в теме
Если обычная подпись – работает так:
МенеджерКриптографии = Новый МенеджерКриптографии(“Microsoft Enhanced Cryptographic Provider v1.0″,””,1);
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификат = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(“A29655C5A2B7442F30DE66D3A328B6877D303D52”));
ДвоичнаяПодпись = МенеджерКриптографии.Подписать(“t: mpSignMe.txt”, Сертификат);
17.
uno-c
Сейчас в теме
(16) Тут еще нужно понимать, в чьё хранилище сертификатов помещаем сгенерированный сертификат и контейнер закрытого ключа. В примере выше я поместил их в персональное хранилище текущего пользователя ОС. Соответственно код 1С я делал НаКлиенте – и далее код 1С запускал под тем же пользователем ОС, в хранилище которого поместил сертификат с закрытым ключом.
19.
wtlz
Сейчас в теме
(17) да, это понятно – в моем случае все делаю на сервере, ключ в одном месте все время
21.
uno-c
Сейчас в теме
Ищите его сразу по отпечатку, который Вам PowerShell выдал.
Thumbprint
———-
A29655C5A2B7442F30DE66D3A328B6877D303D52
18.
wtlz
Сейчас в теме
(16) а можете для примера показать, что получается в результате подписи?
Xmldsign есть?
20.
uno-c
Сейчас в теме
36.
Just
Сейчас в теме
У меня такая ошибка была, пока в код с ИТС,
МенеджерКриптографии = Новый МенеджерКриптографии(“”, “”, 1);
Явно не указал ИмяМодуляКриптографии
МенеджерКриптографии = Новый МенеджерКриптографии(“Microsoft Enhanced Cryptographic Provider v1.0”, “”, 1);
Всем привет! Делаю интеграцию 1с с честным знаком. Задача получать входящие документы и их подписывать.
1. Ключ сессии (/api/v1/session) получаю вполне корректно, Честный знак принимает подпись
2. Входящие документы получаю корректно, но при попытке подписи документов (api/v1/incoming-documents/xml/upd/title) ошибка “Подпись не прошла проверку в crypto” (хотя при получении ключа сессии все нормально)
Ниже пример использования:
// sThumbprint – отпечаток сертификата, используемого для подписи; строка,
// представляющая отпечаток в шестнадцатеричном виде
// пример 195934d72dcdf69149901d6632aca4562d8806d8
// ТекстДляПодписи должен быть в Base64
// bDetached – Истина/Ложь – откреплённая(для подписания документов)/прикреплённая(для получения токена авторизации) подпись
Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached)
CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи
oSigner = Новый COMОбъект(“CAdESCOM.CPSigner”);
// Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.
oSigner.Certificate = ПолучитьСертификатПоОтпечатку(sThumbprint);
oSigningTimeAttr = Новый COMОбъект(“CAdESCOM.CPAttribute”);
oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
oSigningTimeAttr.Value = ТекущаяДата();
oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
oSignedData = Новый COMОбъект(“CAdESCOM.CadesSignedData”);
// Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
//oSignedData.propset_ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = СокрЛП(ТекстДляПодписи);
EncodingType = 0;
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE,
bDetached, EncodingType);
// Метод добавляет к сообщению усовершенствованную подпись.
sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ПС,””);
sSignedMessage = СтрЗаменить(sSignedMessage,Символы.ВК,””);
Возврат sSignedMessage; // Подпись в формате Base64
//Отпечаток – строка HEX
Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр)
//2 вариант: обходом по коллекции и сравнение с отпечатком
Для Каждого ТекСертификат Из oStore.Certificates Цикл
ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде
Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда Рез = ТекСертификат;
Прервать;
КонецЕсли;
КонецЦикла;
oStore.Close(); // Закрыть хранилище сертификатов и освободить объект 61
Возврат Рез;
ТекстДляПодписи – содержание XML файла
У клиента менялся сертификат, может быть в этом причина? Хотя при “ручном” подписании ошибок нет.
А штамп времени там реально нужен?
у меня есть образец рабочего кода такой фигни, но там простая подпись CADES_BES, без штампа времени. Здесь используется штамп времени, но я что-то не уверен, что он применяется у Честного знака, во всяком случае, упоминаний об этом я не нашел. Он там применяется или нет?
(2) добрый день! Хороший вопрос! Кол не мой. Предлагаете штамм времени опустить? У Вас что – то аналогичное используется в реализации?
(3) а ключ сессии вы этим же методом подписываете?
(4) ну да.bDetached Ложь только. Там в описании функции указано.
Куда сейчас документацию API выкладывают? Раньше в телеге выкладывали, сейчас – фиг разберешься.
Исходный xml отправляете ведь с подписанным? Через base64Строка прогнать и отправить?
(6) у нах сайт лёг кстати. Успел вытащить описание до санкций.
Да, файл покупателя уже с подписанным файлом от продавца. Вначале в base64, а потом уже подписываем.
Плюс в тело post запроса подпись самого файла от покупателя.
Решил отказаться от штамма времени в алгоритме при подписании документов:
CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
//CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи
// при подписании документов не используем штамп времени
Если Не bDetached Тогда
oSigningTimeAttr = Новый COMОбъект(“CAdESCOM.CPAttribute”);
oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
oSigningTimeAttr.Value = ТекущаяДатаСеанса();
oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
КонецЕсли;
Но ничего не изменилось. А Вы говорили, что у Вас есть рабочий код для подписи? Можете поделиться? Спасибо
H A D G E H O G s
Каждый раз читаю это и каждый раз благодарю судьбу, что мы отказались поддерживать ЧЗ.
Создателям этой жлыги можно пожелать встретить голландскую шхуну..
(9) В БСП 1 функция вызывается. Но у автора, видимо, свой велосипед
(11) Да понятно, что в БСП одна функция, но что-то иногда идет не так. И это не отменяет ебаклакизм ЧЗ, которые забили на запилить приложуху на стороне клиента или хотя бы dll.
Не всегда БСПшные функции работают корректно. Велосипед, да. Но нужно в нем разобраться.
Тут согласен полностью. Но имеем то, что имеем.
# —————————————————————————————————————
def sign(self, filename: str, prefix: str):
“””
подписывает файл с переданным именем
“””
cades_bes = 1
capicom_encode_base64 = 0
capicom_certificate_include_end_entity_only = 2
sign_filename = self.get_bin_filename(filename, prefix)
signer = win32com.client.Dispatch(“CADESCOM.CpSigner”)
signer.Certificate = self.cert
signer.Options = capicom_certificate_include_end_entity_only
signed_data = win32com.client.Dispatch(“CADESCOM.CadesSignedData”)
f_in = open(filename, ‘rb’)
signed_data.Content = f_in.read()
out_data = signed_data.SignCades(signer, cades_bes, True, capicom_encode_base64)
f_out = open(sign_filename, ‘wt’)
f_out.write(out_data)
f_in.close()
f_out.close()
(15)
Доброе утро! Что это за язык программирования? Думал пример на 1с 🙂
1. Поиск сертификата по sha-1 обязательно искать? У меня просто идёт поиск по коллекции сертификатов.
2.
А self, win32com и prefix что означают?
(16) это python.
Поиск сертификата есть и у вас, реализован практически точно так же как и в моем случае.
win32com.client это механизм для работы с COM-объектами на python, то же самое что Новый COMОбъект () в 1С.
prefix это строчка, которая добавляется слева к имени файла подписи, для ваших целей это вряд ли нужно.
(17)
Сам алгоритм то рабочий, сессию же я получаю без проблем. Проблемы с подписью документов.
(19) Для токена:
ПараметрыCMS = ЭлектроннаяПодписьКлиент.ПараметрыCMS();
ПараметрыCMS.Открепленная = Ложь;
Для Национальный каталог, True Api, ГИС МТ:
ПараметрыCMS.Открепленная = Истина;
(20)
Добрый день! А подробнее можно? Куда этот параметр CMS вставить?
Причем сверил сам отпечаток. Полностью совпадает с тем, как тут получают. Так что проблем серфикатом быть не должно
ДанныеСертификата = Сертификат.ДанныеСертификата.Получить();
ск = Новый СертификатКриптографии(ДанныеСертификата);
Отпечаток = ПолучитьHexСтрокуИзДвоичныхДанных(ск.Отпечаток);
Ниже код, как я заполняю справочников сертификатов (отдельный сделал, БСПшный не стал использовать):
ОбъектСертификат.Наименование = ВладелецСертификата;
ОбъектСертификат.ВладелецСертификата = ВладелецСертификата;
ОбъектСертификат.ДатаНачала = ТекСертификат.ValidFromDate;
ОбъектСертификат.ДатаОкончания = ТекСертификат.ValidToDate;
ОбъектСертификат.Контейнер = ТекСертификат.PrivateKey.UniqueContainerName;
ОбъектСертификат.Отпечаток = ТекСертификат.Thumbprint;
Народ, тут до меня дошло, что нужно использовать “Новый МенеджерКриптографии” (мне же открепленная подпись нужна). Тут вопрос по параметрам? Где их взять? У кого – нибудь есть рабочий пример?
ФайлСПодписями = ПолучитьИмяВременногоФайла(“txt”);
МенеджерКриптографии = Новый МенеджерКриптографии(“Microsoft Enhanced Cryptographic Provider v1.0″,””,1);
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификат = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток));
КонецФункции // ПодписатьТекстОтсоединеннаяПодпись()
Но получаю ошибку:
Как заставить его работать?
Использую для ГИИС, но может, найдёшь что полезное.
Стр – ссылка на эл. справочника СертификатыКлючейЭлектроннойПодписиИШифрования
Код на базе БСП 3.1.5.385
КриптоСертификат=Новый СертификатКриптографии(Стр.ДанныеСертификата.Получить()); //двоичные данные сертификата
МенеджерКриптографии=Новый МенеджерКриптографии(Стр.СертификатИмяПрограммы,””,Стр.СертификатТипПрограммы); //из того же справочника
ПараметрыXMLDSig=ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыXMLDSig();
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу=”****”;
ПодписанныйПакет=ЭлектроннаяПодписьСлужебный.Подписать(ТелоПакета,ПараметрыXMLDSig,КриптоСертификат,МенеджерКриптографии);
(24) судя по строке ошибки, вы задаете само содержимое подписи в виде строки base64 в качестве имени файла, и пытаетесь такой файл сохранить.
Добрый день! Именно так и есть, хотя бы подпись получил. Ниже код, как я это делаю.
Причем ФайлXML_ДД – двоичные данные XML файла. Если отправлять содержимое XML файла – то будет ошибка, описанная выше.
То есть вначале подпись, а потом уже ее в Base64/ На что еще обратить внимание? Подписываю файл продавца и титул покупателя одинаково
МенеджерКриптографии = Новый МенеджерКриптографии(“Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider”,””,80);
Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
Сертификат = Хранилище.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(Отпечаток));
ДД_Подпись = МенеджерКриптографии.Подписать(Файл_ДД,Сертификат);
Результат = Base64Строка(ДД_Подпись);
Если Лев(Результат, 4) = “77u/” Тогда
Результат = Сред(Результат, 5);
КонецЕсли;
Результат = СтрЗаменить(Результат, Символы.ПС, “”);
Результат = СтрЗаменить(Результат, Символы.ВК, “”);
Спецификация OpenRPC
WEB-интеграция Бесплатно (free)
Спецификация OpenRPC определяет стандартное, независимое от языка программирования описание интерфейса для API-интерфейсов JSON-RPC 2.0.
Перевод общей информации и спецификации с официального сайта https://open-rpc.org/
Новый SimpleWEB – тот же Simple, теперь еще web
WEB-интеграция Мобильная разработка Мобильная платформа Бесплатно (free)
Представляю новый отдельный проект на старой семантике – фремйворк для создания веб приложений. Для разработчика симпла ничего не меняется – все тот же стек разработки, тот же конфигуратор и принципы разработки, но конфигурации теперь можно запускать не только на Андроид, но и в виде веб – приложений. Т.е. теперь платформы две – мобильная и веб, в два раза больше поводов перейти на этот стек разработки. Проект пока на стадии альфы, но развивается.
Тонкости и подводные камни работы типового модуля интеграции Битрикс24 и 1С
WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)
Цель статьи – указать на подводные камни и нюансы, о которых “не пишут на заборах” и которые встретились мне за время внедрения типового модуля интеграции 1С и Битрикс24. Будет интересна для людей, кто подумывает о том, чтобы настроить интеграцию, и хотят понять, с чем столкнутся. А также для тех, кто уже работает с подобным обменом, столкнулся с какими-то из описанных ситуаций и хочет понять, что пошло не так и “как жить дальше”. Постараюсь все описать “человеческим” языком с минимальной долей терминов, так как статья, надеюсь, будет полезна не только программистам.