|
|
|
МенеджерКриптографии и формат выходного файла ЭЦП - ??? | ☑ | ||
|---|---|---|---|---|
|
0
MWWRuza
гуру
29.10.25
✎
15:54
|
Добрый день!
Вообще-то я застарелый клюшечник, но, эта тема: Где посмотреть значение атрибута КоличествоЕдиницУпотребления (для частичного выбытия)? как-то "сподвигла меня на подвиги" :-))) Решил написать нечто подобное тому, что у меня в рабочей конфе семерки, для типовых 8.Х... И даже, что-то получилось: ![]() С самим отчетом то особых проблем не возникло, работает. Но, для доступа в ЧЗ требуется получить токен... На скриншоте, токен полученный в 7.7, просто вставлен в соответствующее поле. Алгоритм его получения мне понятен и в 7.7 я его успешно использую, а тут столкнулся с проблемой подписания строки данных. В 7.7 я использую джава-скрипты и CadesCom... Все давно и успешно работает. Думал, что в восьмерке будет проще - всетаки для работы с ЭЦП есть встроенные штатные объекты. А оказалось - фигвам... В принципе, получение нужного сертификата из хранилища винды, и само подписание - я освоил, и даже как-то работает. НО!!! На выходе получается ЭЦП "не в том формате", как нужно ЧЗ... И ни какими параметрами изменить это не получается... Сам фрагмент модуля:&НаКлиенте Функция ПодписатьСтроку(СтрокаДляПодписи, СертификатЭЦП, ТекстОшибки = "", Кодировка = "CESU-8") Экспорт ТекстОшибки = ""; ИмяВремФайла = ПолучитьИмяВременногоФайла(); Текст = Новый ЗаписьТекста(ИмяВремФайла, Кодировка); Текст.Записать(СтрокаДляПодписи); Текст.Закрыть(); ИмяМодуля = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider"; ТипМодуля = 80; ПутьМодуля = ""; МенеджерКриптографии = Новый МенеджерКриптографии(ИмяМодуля, ПутьМодуля, ТипМодуля); АлгоритмПодписи = "GR 34.10-2012 256"; АлгоритмХеширования = "GR 34.11-2012 256"; МенеджерКриптографии.АлгоритмПодписи = АлгоритмПодписи; МенеджерКриптографии.АлгоритмХеширования = АлгоритмХеширования; ИмВых = СтрЗаменить(ИмяВремФайла, ".tmp", ".sig"); ТипПодп = ПолТипПодписи(); Попытка Результат = МенеджерКриптографии.Подписать(ИмяВремФайла, ИмВых, СертификатЭЦП, ТипПодп); ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(ИмВых); Подп = ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); Исключение ТекстОшибки = ОписаниеОшибки(); КонецПопытки; Попытка УдалитьФайлы(ИмяВремФайла); УдалитьФайлы(ИмВых); Исключение КонецПопытки; Возврат Подп; КонецФункции // ПодписатьСтроку() &НаКлиенте Процедура ВыполнитьПослеВыбора(ИндВыбСтр, Пар2) Экспорт ИндМассСерт = ИндВыбСтр; ВыбрСерт = СпСерт.Получить(ИндМассСерт); СтрИНН = СокрЛП(ИНН); ПодпИНН = ПодписатьСтроку(СтрИНН, ВыбрСерт); КонецПроцедуры На выходе получаю: ![]() В семерке так: ![]() Формат явно другой... Но, что самое интересное - если оба файла сохранить и проверить ЭЦП с помощью "Инструментов КриптоПро", то подпись валидная! :-))) Но, боюсь, что ЧЗ в таком виде ее не примет... Как получить ЭЦП в правильном формате? PS Похоже, в 7.7 ДжаваСкрипт возвращает ЭЦП в Basa64... А тут, просто бинарник... Можно попробовать закодировать готовый результат в Basa64... Но, чувствую, что есть какие-то другие решения... Использовать всякие БСП и прочее, не хочется... Уж слишком там заморочено все, не та задача. |
|||
|
1
timurhv
30.10.25
✎
00:16
|
Для типовых лучше вклиниться в:
Оповещение = Новый ОписаниеОповещения("ОбработатьСообщения_ПриЗавершенииОперацииПодписи", ЭтотОбъект); ОбменДаннымиИСМПКлиент.Подписать(*) Плюс дополнить ОбменДаннымиИСМПКлиент.ПодписатьЗавершение Либо скопировать в свой общий модуль и сделать по аналогии без параметров лишних. Для самописок без БСП в документации True API: "Пример получения токена при авторизации с прикрепленной подписью / подписание документов с открепленной подписью на 1С" |
|||
|
2
timurhv
30.10.25
✎
00:20
|
+ "CESU-8" может из-за этого ошибка отображения
|
|||
|
3
MWWRuza
гуру
30.10.25
✎
02:20
|
(1) Ага...
Это видел: "Для самописок без БСП в документации True API: "Пример получения токена при авторизации с прикрепленной подписью / подписание документов с открепленной подписью на 1С"" Но, это по сути то-же самое, что у меня в 7.7 - через CADESCOM, просто там из-за некоторых ограничений приходится Java скрипты использовать, тут можно напрямую с данными работать... Если совсем не получится со штатным объектом "МенеджерКриптографии", то конечно переделаю на CADESCOM, не проблема... Если в клюшках заставил работать через него, тут тем более должно получиться. Но, как-то странно штатный объект работает. Может в этом проблема - "// ТекстДляПодписи должен быть в Base64"... Как-то я про это не подумал, подписываю строку ИНН, а там, как я подумал не критично, так, как только цифры... Но, х.з., надо попробовать... |
|||
|
4
MWWRuza
гуру
30.10.25
✎
02:45
|
Попробовал перед подписанием закодировать ИНН в Basa64... Да, конечно это получается далеко не строка цифр.
Но, на выходе подпись в таком-же формате... ЧЗ не понимает такой формат, проверил. Сам запрос токена отрабатывает, если ему подсунуть правильную ЭЦП из файла, токен прилетает. И если закодировать готовую ЭЦП после МенеджераКриптографии в Basa64, файл становится визуально похожим на правильный, но ЧЗ с ним 403 возвращает, подпись не валидна... |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |