![]() |
![]() |
![]() |
|
Работа с документами по API "Честный знак" | ☑ | ||
---|---|---|---|---|
0
stans
27.08.25
✎
16:04
|
Добрый день. Кто-то сталкивался с проблемой, когда от честного знака приходит ответ "Подпись не соответствует формату CMS". Подписываю через CAdESCOM. Если все сделать через Крипто АРМ, то запрос проходит успешно. Если делаю через CAdESCOM, начало MIIW..., через Крипто АРМ начало MIAG... Уже всю голову сломал. Через плагин браузера результат то же, что и у меня через компоненту CAdESCOM.
|
|||
1
MWWRuza
гуру
27.08.25
✎
22:56
|
Если чем-то поможет(под 77 правда, но работает, там все равно вставки на скриптах jscript, так, что - не принципиально):
Код функции подписи CAPYCOM/CAdESCOM// на основе https://infostart.ru/public/156973/ // Пар = 0 подписываем CAPICOM подпись прикрепленная, Пар = 1 подписываем CAdESCOM, подпись открепленная Функция ПодписатьФайл(ИмяФайла, ВыбСертификат, ИмяВыхФайла, Пар = 0) Экспорт Если ВыбСертификат = "" Тогда Сообщить("В хранилище сертификатов отсутствует выбранный сертификат!"); Возврат 0; КонецЕсли; Попытка JS=СоздатьОбъект("MSScriptControl.ScriptControl"); JS.Language="jscript"; JS.Timeout=-1; Исключение ТекстОшибки=ОписаниеОшибки(); Сообщить("Не удалось создать объект MSScriptControl.ScriptControl","!"); Сообщить("Описание ошибки: "+ТекстОшибки,"!"); Возврат 0; КонецПопытки; Попытка Если Пар = 0 Тогда СтрКода="function SignFile(FileName,Cert,OutFileName) |{ | InStream=new ActiveXObject(""ADODB.Stream""); | InStream.Type=1; // binary data | InStream.Mode=3; // read/write | InStream.Open(); | InStream.LoadFromFile(FileName); | InData=InStream.Read(-1); | | Signer=new ActiveXObject(""CAPICOM.Signer""); | Signer.Certificate=Cert; | Signer.Options=2; // CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY | SignedData=new ActiveXObject(""CAPICOM.SignedData""); | SignedData.Content=InData; | OutSignedData=SignedData.Sign(Signer,0,0); | | OutStream=new ActiveXObject(""ADODB.Stream""); | OutStream.CharSet=""utf-8""; | OutStream.Type=2; // text data | OutStream.Mode=3; // read/write | OutStream.Open(); | OutStream.WriteText(OutSignedData); | OutStream.SaveToFile(OutFileName,2); | OutStream.Close(); | | return(0); |} |"; Иначе // Sign(Signer,0,1) - проба открепленной ЭЦП СтрКода="function SignFile(FileName,Cert,OutFileName) |{ | InStream=new ActiveXObject(""ADODB.Stream""); | InStream.Type=1; // binary data | InStream.Mode=3; // read/write | InStream.Open(); | InStream.LoadFromFile(FileName); | InData=InStream.Read(-1); | | Signer=new ActiveXObject(""CAdESCOM.CpSigner""); | Signer.Certificate=Cert; | Signer.Options=2; // CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY | SignedData=new ActiveXObject(""CAdESCOM.CadesSignedData""); | | | SignedData.Content=InData; | OutSignedData=SignedData.SignCades(Signer,1,1,0); // параметр 3 - открепленная/прикрепленная(1 - открепленная), пар 4 - кодировка(0 - Base64) // | OutSignedData=SignedData.SignCades(Signer,1,1,0); // параметр 3 - открепленная/прикрепленная(1 - открепленная), пар 4 - кодировка(0 - Base64) | OutStream=new ActiveXObject(""ADODB.Stream""); | OutStream.Type=2; // text data // | OutStream.CharSet=""US-ASCII""; | OutStream.CharSet=""utf-8""; | OutStream.Mode=3; // read/write | OutStream.Open(); | OutStream.WriteText(OutSignedData); | OutStream.SaveToFile(OutFileName,2); | OutStream.Close(); | | return(0); |} |"; КонецЕсли; JS.AddCode(СтрКода); Рез = JS.Modules("Global").CodeObject.SignFile(ИмяФайла,ВыбСертификат,ИмяВыхФайла); Исключение ТекстОшибки=ОписаниеОшибки(); Сообщить("Произошла ошибка при подписи файла!","!"); Сообщить("Описание ошибки: "+ТекстОшибки,"!"); Возврат 0; КонецПопытки; Возврат 1; КонецФункции |
|||
2
stans
28.08.25
✎
08:03
|
Спасибо. Пробовал так тоже, выдает "Подпись не соответствует формату CMS"
|
|||
3
MWWRuza
гуру
28.08.25
✎
09:39
|
(0) начало MIIW..., через Крипто АРМ начало MIAG...
У меня так: ![]() Еще раз - все работает. Такого - "Подпись не соответствует формату CMS" не видел ни разу, ни в процессе написания/отладки, ни при эксплуатации. PS А, да... Еще не забудте, что нужно убрать из файла переносы строк, на выходе должна быть одна длинная строка. Я так сделал: УбратьПереносыСтрок()// УбратьПереносыСтрок(ПутьКСертификату) // // Параметры: // ПутьКСертификату - путь к файлу или текст сертификата КЭП // // Возвращаемое значение: // public_cert,signature // // Описание: // убирает переносы строк и возвращает содержимое в виде строки // Функция УбратьПереносыСтрок(ПутьКСертификату, Кодировка = 0) Экспорт ВозврPublic_cert = ""; Если (Прав(ПутьКСертификату,4) = ".cer") ИЛИ (Прав(ПутьКСертификату,4) = ".txt") ИЛИ (Прав(ПутьКСертификату,4) = ".sig") Тогда Если ФС.СуществуетФайл(ПутьКСертификату) = 0 Тогда Сообщить("Файл сертификата "+СокрЛП(ПутьКСертификату)+" не найден"); Возврат ""; КонецЕсли; АдоДБСтрим = СоздатьОбъект("ADODB.Stream"); АдоДБСтрим.Mode = 3; АдоДБСтрим.Type = 2;//текст Если Кодировка = 0 Тогда АдоДБСтрим.charset="utf-8"; Иначе АдоДБСтрим.charset="windows-1251"; КонецЕсли; АдоДБСтрим.Open(); АдоДБСтрим.LoadFromFile(ПутьКСертификату); АдоДБСтрим.Position = 0; ТекстСертификата = АдоДБСтрим.ReadText(-1); АдоДБСтрим.Close(); Для СчСтрок = 1 По СтрКоличествоСтрок(ТекстСертификата) Цикл ТекСтрока = СтрПолучитьСтроку(ТекстСертификата,СчСтрок); Если Лев(ТекСтрока,4) = "----" Тогда Продолжить; КонецЕсли; ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,""); ВозврPublic_cert = ВозврPublic_cert + ТекСтрока; КонецЦикла; Иначе Для СчСтрок = 1 По СтрКоличествоСтрок(ПутьКСертификату) Цикл ТекСтрока = СтрПолучитьСтроку(ПутьКСертификату,СчСтрок); Если Лев(ТекСтрока,4) = "----" Тогда Продолжить; КонецЕсли; ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,""); ВозврPublic_cert = ВозврPublic_cert + ТекСтрока; КонецЦикла; КонецЕсли; Возврат ВозврPublic_cert; КонецФункции // УбратьПереносыСтрок() Штатными средствами 1С нормально не получается, уродуется строка, по крайней мере клюшками, по этому через поток. |
|||
4
stans
29.08.25
✎
06:07
|
Вроде разобрались, но теперь другая пробелу - в ЧЗ в статусе выдает Ошибка: Проверка подписи не пройдена, сама выгрузка проходит успешно, приходит ответ 200.
|
|||
5
MWWRuza
гуру
29.08.25
✎
07:36
|
(4) А в ЧЗ сотрудник с этой подписью есть? Пешком в ЛК по ней заходит, действия какие-либо дает делать?
Или у Вас подпись руководителя без МЧД? |
|||
6
MWWRuza
гуру
29.08.25
✎
07:38
|
И, адрес... У боевого контура и у песочницы свои списки зарегенных пользователей со своими наборами прав...
|
|||
7
stans
29.08.25
✎
09:59
|
(3)MWWRuza, спасибо. Решилось тем, что нужно сохранять в 1С не текстовым документом в файл для подписи, а перевожу строку в двоичные данные и их сохраняю. Подписать удалось через внешнюю csptest.exe, иначе так и выдает "Проверка подписи не пройдена".
|
|||
8
ptiz
29.08.25
✎
10:48
|
(7) Может BOM-заголовок мешал?
|
|||
9
MWWRuza
гуру
29.08.25
✎
13:09
|
(7) Подписать удалось через внешнюю csptest.exe, иначе так и выдает "Проверка подписи не пройдена".
Хм, ну, тут уже немного другое: ![]() Это фрагмент из "Списания" молочки, но для всего остального это так-же делается. Функция "Кодировать" именно в Base64 кодирует. Нужно? Могу выложить... |
|||
10
Builder
29.08.25
✎
13:19
|
(9) Было бы здорово, все руки не дойдут нетленку интегрировать с ЧЗ, но мне только марки получать и товары заводить в Нац. каталог.
А никто не смотрел вот этот модуль? https://infostart.ru/marketplace/1663863 тут есть "Клиент ГИС МТ "Честный знак": внешняя компонента GISMT.DLL для 1С 7.7" |
|||
11
MWWRuza
гуру
29.08.25
✎
13:43
|
(10)
Да не проблема, Вот функции:Функция Кодировать(Стр, Кодировка) Экспорт // Кодировать64(Стр) ЦДО = СоздатьОбъект("CDO.Message"); БодиПарт = ЦДО.BodyPart; Поля = БодиПарт.Fields; Поле = Поля.Item("urn:schemas:mailheader:content-type"); Поле.Value = "text/plain; charset=""windows-1251"""; Поля.Update(); Стрим = БодиПарт.GetDecodedContentStream(); Стрим.charset = "windows-1251"; Стрим.WriteText(Стр); Стрим.Flush(); БодиПарт.ContentTransferEncoding = Кодировка; Стрим = БодиПарт.GetEncodedContentStream(); Возврат Стрим.ReadText(); КонецФункции Функция Декодировать(Стр, Кодировка) Экспорт // Декодировать64(Стр) ЦДО = СоздатьОбъект("CDO.Message"); БодиПарт = ЦДО.BodyPart; БодиПарт.ContentTransferEncoding = Кодировка; Стрим = БодиПарт.GetEncodedContentStream(); Поля = БодиПарт.Fields; Поле = Поля.Item("urn:schemas:mailheader:content-type"); Поле.Value = "text/plain; charset=""windows-1251"""; Поля.Update(); Стрим.WriteText(Стр); Стрим.Flush(); Стрим = БодиПарт.GetDecodedContentStream(); Стрим.charset = "windows-1251"; Возврат Стрим.ReadText(); КонецФункции (10) А никто не смотрел вот этот модуль? Почитал... Прикольная штука :-) Но, покупать я его не буду, ибо мне не за чем - у меня и так все исправно работает, и без "черных ящиков", которые случись чего - не исправишь... Так у меня все открыто и доступно. (10) но мне только марки получать и товары заводить в Нац. каталог. Вот интеграцию с СУЗ - я не делал... Моим просто ни к чему, у меня, как я уже писал, только розница. А те редкие "милости от ЦРПТ" по маркировке остатков на новые группы, действительно на столько редкие и не значительные, что я посчитал лишними эти заморочки. Можно марки и через ЛК в таких незначительных объемах заказать. Единственное, что сделал для этого - это печать на обычном принтере на самоклеющиеся наклейки(21 штука на А4) из файлов csv от ЧЗ... |
|||
12
Djelf
29.08.25
✎
14:55
|
(10) Хренаськи эта штука чудно сделана! оО
Эти ВК для 7.7 на GCC собраны, это нечто странное с бантиком... Я такого еще не видел! Выглядит очень прикольно, а асинхронность в клюшках, вообще круто. В DialMail есть, но пришлось сильно попарится, чтобы и выводить в строку состояния что-то и чтобы это не вылетало. Возможно у них сделано лучше. Зависимостей от библиотек мало, могу и на wine проверить, вероятно заработает и там. Заявленную совместность с системами я на сайте не заметил. ИМХО это очень мощная штука... Правда tls 1.3 не держит, а кто-уже это сильно такого хочет. Но зато OpenSSL версии 1.0.2, эта штука держит Гост (есть ли он с сборке я не знаю), а потом Гост выпилили, я не буду писать почему, я только могу догадываться и это только мои предположения, фактов у меня нет. |
|||
13
MWWRuza
гуру
29.08.25
✎
14:53
|
(12) Ну, твой карлик на сегодняшний момент, тоже пока все что надо для ЧЗ и ЕГАИС поддерживает :-)
Если не забросишь совсем, то и ничего не нужно больше. |
|||
14
Djelf
29.08.25
✎
15:03
|
(13) Там вроде и пилить то нечего, но асинхроннось запилить было бы круто. Только вот все включают таймауты и асинхроннось не заработает.
Ну разве что ты опять какую глокую куздру там найдешь... |
|||
15
Builder
29.08.25
✎
15:12
|
(12) Http-сервер на ней у меня крутится уже больше года, проблем нет!
|
|||
16
MWWRuza
гуру
29.08.25
✎
16:03
|
(14) Ну разве что ты опять какую глокую куздру там найдешь...
Да, я такой... Ты не первый мне такое говоришь. У меня талант находить глюки там, где другие работают и их не замечают. Но, пока с карликом все ОК, нет проблем🔥 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |