Ошибка вызова метода cmssign компоненты xmldsig

   cmex

01.06.20 — 11:16

Добрый день!

Для использования всех методов необходимо иметь УКЭП. Кто нибудь из 1С уже работал по API? Как получить тестовую УКЭП, как использовать уже имеющуюся УКЭП директора организации на Сервере, чтобы автоматом можно было подписывать? Кто сталкивался? Просветите, как процесс устроен? Слышал, про тестовый УЦ, где выдают УКЭП, но не понял как с этим работать. В общем, буду признателен за любую информацию

   cmex

1 — 01.06.20 — 14:21

up

   ChMikle

2 — 01.06.20 — 14:25

   cmex

3 — 01.06.20 — 17:08

(2) Спасибо

   timurhv

4 — 01.06.20 — 17:13

Тестовая УКЭП должна быть на имя директора (если стоит KIS, то его лучше закрыть, т.к. из-за сертификата тестового сервера не пускает дальше регистрировать):

https://ismp.wiki/index.php?title=Софт

Если выходит ошибка регистрации на тестовой площадке — писать в тех.поддержку ЧЗ.

   lodger

5 — 01.06.20 — 18:46

(0)

1) есть боевой и есть тестовый контур API

2) ключ можно использовать один и тот же.

3) нет нужды использовать ключ на сервере. достаточно сотворить токен авторизации на клиенте и отдать его на сервер.

4) у токена есть время жизни, 10 часов.

   cmex

6 — 02.06.20 — 13:29

(5) удалось получить сертификат в Тестовом подчиненном УЦ КриптоПро. Установил сертификат под своей учеткой в ОС

Далее пишу код

ИнтеграционныйСтенд = «int01.gismt.crpt.tech/api/v3/true-api»;

Соединение = Новый HTTPСоединение(ИнтеграционныйСтенд,,,,,, Новый ЗащищенноеСоединениеOpenSSL);

HTTPЗапрос = Новый HTTPЗапрос(«/auth/key»);

HTTPОтвет = Соединение.ВызватьHTTPМетод(«GET», HTTPЗапрос);    

СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();

ЧтениеJSON = Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

Структура = ПрочитатьJSON(ЧтениеJSON);

ЧтениеJSON.Закрыть();

МенеджерКриптографии = Новый МенеджерКриптографии(«Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider», «», 75);

Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();

СертификатыХранилища = Хранилище.ПолучитьВсе();

Сертификат = СертификатыХранилища[0];    

ДД = ПолучитьДвоичныеДанныеИзСтроки(Структура.data);

Результат = МенеджерКриптографии.Подписать(ДД, Сертификат);

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, Структура);

СтрокаJSON = ЗаписьJSON.Закрыть();

Заголовки = Новый Соответствие;    

Заголовки.Вставить(«Content-Type», «application/json; charset=utf-8»);

Заголовки.Вставить(«cache-control», «no-cache»);

HTTPЗапрос = Новый HTTPЗапрос(«/auth/simpleSignIn», Заголовки);    

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);

Попытка

    HTTPОтвет = Соединение.ВызватьHTTPМетод(«POST», HTTPЗапрос);    

Исключение

    Сообщить(ОписаниеОшибки());

КонецПопытки;

Вываливается ошибка «Ошибка при получении свойства сертификата (0x00000000)»

Это я не так пользуюсь менеджером или этот ключ не может в принципе подписать? Читал про какой то закрытый ключ, но его в сертификате не увидел

Вот некая инфа по сертификату

Версия    «V3»    Строка

ДатаНачала    01.06.2020 8:26:46    Дата

ДатаОкончания    01.09.2020 8:36:46    Дата

CN    «Тестовый подчиненный УЦ ООО «КРИПТО-ПРО» ГОСТ 2012 (УЦ 2.0)»    Строка

Крипто ПРО csp 4.0

   cmex

7 — 02.06.20 — 13:32

(5) у меня регламент будет работать с API, то есть сервер, поэтому на клиент доступа нет. может есть какой вариант другой? я слабо представляю как устроена вся схема работы эцп

   Garykom

8 — 02.06.20 — 13:37

(7) У вас два варианта или самим разбираться или кого то нанимать кто уже разобрался

   cmex

9 — 02.06.20 — 13:49

(8) почему 2? я бы помог, если бы знал, форму для этого и нужен, имхо

   cmex

10 — 02.06.20 — 13:58

(9) *форум

   Garykom

11 — 02.06.20 — 14:23

(9) Потому что там нет ничего сложного, обычная работа, которую бесплатно хрен кто будет делать.

Мануалы есть и они достаточно вменяемы, есть форум ЧЗ если что и прочие форумы.

В т.ч. как запросы по http делать или с криптопро/сертификатами работать

   Garykom

12 — 02.06.20 — 14:24

Ты конкретные вопросы задавай что не получается а не «помогите мне кто нибудь — сделайте за меня или дайте разжеванное/готовое»

   cmex

13 — 02.06.20 — 14:37

(12) ок, по мануалу разобрался. подписать вроде удалось, но в ответ на post запрос прилетает {«error_message»:»Ошибка при проверке подписи»}

подписываю, кодирую и отправляю так

ДД = ПолучитьДвоичныеДанныеИзСтроки(data, КодировкаТекста.UTF8);

РезультатДД = МенеджерКриптографии.Подписать(ДД, Сертификат);

РезультатСтрока = Base64Строка(РезультатДД);

может я в двоичные данные строку исходную не так перевожу? как правильно подписать?

   Garykom

14 — 02.06.20 — 14:43

Вариант синтаксиса: Данные подписи сохраняются в файл

Синтаксис:

Подписать(<ИсходныеДанные>, <ВыходныеДанные>, <Сертификат>)

Параметры:

<ИсходныеДанные> (обязательный)

Тип: Строка, ДвоичныеДанные, Поток, ПотокВПамяти, ФайловыйПоток.

Исходные данные для подписывания.

Данные могут размещаться в файле (в этом случае указывается имя файла) или представлены как ДвоичныеДанные.

<ВыходныеДанные> (обязательный)

Тип: Строка: Поток, ПотокВПамяти, ФайловыйПоток.

Имя файла или поток, в который будут выгружены подписанные данные.

<Сертификат> (необязательный)

Тип: СертификатКриптографии.

Используемый сертификат криптографии.

Если параметр не указан, то в хранилище персональных сертификатов должен быть ровно один сертификат. В противном случае генерируется исключительная ситуация.

Описание варианта метода:

Подписанные данные записываются в файл. Возвращает Неопределено.

   cmex

15 — 02.06.20 — 14:46

(14) намекаете, что надо пописать строку, предварительно не переводя в ДД?

   cmex

16 — 02.06.20 — 14:46

(15) *подДписать)

   Garykom

17 — 02.06.20 — 14:47

(14)+ Только уверен что апи требует прикрепленную подпись?

Если нужна открепленная то стандартный менеджер не пойдет и надо нечто вроде http://catalog.mista.ru/public/1058940/

   cmex

18 — 02.06.20 — 14:47

(17) из Мануала —  data String + Подписанные УКЭП зарегистрированного УОТ случайные данные в base64 (ЭП

присоединенная)

   Garykom

19 — 02.06.20 — 14:47

(16) А фуй знает что надо, надо разбираться

Лично я не имею представления по какому мануалу и что твоя делать

   cmex

20 — 02.06.20 — 14:48

(19) v5 — Документация для партнёров по True API

   Garykom

21 — 02.06.20 — 14:49

(18) Тогда попробуй имя файла входного и выходного указывать в Подписать

А затем сравнить с тем что выходит другими способами подписи того же файла.

Есть у криптопро cryptcp и csptest

   Garykom

22 — 02.06.20 — 14:51

   Garykom

23 — 02.06.20 — 14:55

   cmex

24 — 02.06.20 — 15:30

все попробовал — не взлетает пока. чую, что близко, но пока никак

   timurhv

25 — 02.06.20 — 16:27

Процедура ОбновитьТокен(ВидAPI, СледующееОповещение)

    АдресМетода = «/api/v3/auth/cert/key»;

    …

    HTTPСервисЗапрос = Новый HTTPСоединение(СтруктураПодключения[АдресAPI],,,,,60, Новый ЗащищенноеСоединениеopenSSL());

    Запрос = Новый HTTPЗапрос(АдресМетода);

    Ответ = HTTPСервисЗапрос.Получить(Запрос);

    Если Ответ.КодСостояния = 200 Тогда

        …

        МассивСертификатов = Новый Массив();

        Если ЗначениеЗаполнено(СертификатыКлючейЭлектроннойПодписиИШифрования) Тогда

            МассивСертификатов.Добавить(СертификатыКлючейЭлектроннойПодписиИШифрования);

        КонецЕсли;

        СтруктураОсновныхДанных = Новый Структура();

        СтруктураОсновныхДанных.Вставить(«СтрокаJSON», ОтветСтруктура.data);

        СтруктураОсновныхДанных.Вставить(«МассивСертификатов», МассивСертификатов);

        СтруктураОсновныхДанных.Вставить(«Открепленная», Ложь);

        СтруктураОсновныхДанных.Вставить(«СсылкаДокумента», «»);

        
        СтруктураДополнительныхДанных = Новый Структура();

        СтруктураДополнительныхДанных.Вставить(«СертификатПользователя», СертификатыКлючейЭлектроннойПодписиИШифрования);

        СтруктураДополнительныхДанных.Вставить(«ОтветСтруктура», ОтветСтруктура);

        СтруктураДополнительныхДанных.Вставить(«СледующееОповещение», СледующееОповещение);

        СтруктураДополнительныхДанных.Вставить(«HTTPСервисЗапрос», HTTPСервисЗапрос);

        ИнтеграцияИСМПСлужебныйКлиент.Подписать(СтруктураОсновныхДанных, Новый ОписаниеОповещения(«ОбработатьСообщения_ПриЗавершенииОперацииПодписи», ЭтотОбъект, СтруктураДополнительныхДанных));

    КонецЕсли;

КонецПроцедуры

Процедура ОбработатьСообщения_ПриЗавершенииОперацииПодписи(ПодписанныеСообщения, Контекст) Экспорт

    Если ПодписанныеСообщения = Неопределено Тогда

        Возврат;

    КонецЕсли;

    
    Для Каждого ЭлементСообщения Из ПодписанныеСообщения Цикл

        ПодписанныйФайл = ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);

        HTTPСервисЗапрос = Контекст.HTTPСервисЗапрос;

        Тело = «{

        |»»uuid»»: «»» + Контекст.ОтветСтруктура.uuid + «»»,

        |»»data»»: «»» + ПодписанныйФайл + «»»

        |}»;

        АдресМетода = «api/v3/auth/cert/»;

        HTTPЗапрос = Новый HTTPЗапрос(АдресМетода);

        HTTPЗапрос.Заголовки.Вставить(«Content-Type»,»application/json;charset=UTF-8″);

        HTTPЗапрос.УстановитьТелоИзСтроки(Тело);

        Ответ = HTTPСервисЗапрос.ОтправитьДляОбработки(HTTPЗапрос);

    КонецЦикла;

КонецПроцедуры

   timurhv

26 — 02.06.20 — 16:41

(13) Base64 = Base64Строка(ДвоичныеДанные);

Base64 = СтрЗаменить(Base64, Символы.ПС, «»);

Base64 = СтрЗаменить(Base64, Символы.ВК, «»);

Символы переноса скорее забыли убрать

   cmex

27 — 03.06.20 — 11:16

(26) это из какой конфы? ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);

   cmex

28 — 03.06.20 — 11:33

кажись разобрался, вернусь с результатом

   cmex

29 — 03.06.20 — 17:18

причина была в том, что 1совский метод Подписать НЕ включает данные в подпись, как того требует ЧЗ. Для этого необходимо использовать внешнюю компоненту.

вот код рабочий. саму компоненту дернул из 11.4

МенеджерКриптографии = Новый МенеджерКриптографии(«Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider», «», 80);

    Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();

    СертификатыХранилища = Хранилище.ПолучитьВсе();

    Сертификат = СертификатыХранилища[0];

    
    Макет = ПолучитьМакетНаСервере();

    Адрес = ПоместитьВоВременноеХранилище(Макет);     

    Если ПодключитьВнешнююКомпоненту(Адрес, «XMLDSignAddInSymbolicName», ТипВнешнейКомпоненты.Native) Тогда

        Попытка

            ОбъектКомпоненты = Новый(«AddIn.XMLDSignAddInSymbolicName.XMLDSignAddIn»);

            Если ОбъектКомпоненты = Неопределено Тогда

                ВызватьИсключение НСтр(«ru = ‘Оператор Новый вернул Неопределено'»);

            КонецЕсли;

        Исключение

            ВызватьИсключение НСтр(«ru = ‘Не удалось чуток'»);            

        КонецПопытки;        

    КонецЕсли;    

    ОбъектКомпоненты.ПутьККриптопровайдеру = «»;

    СертификатКриптографииBase64 = СертификатКриптографииBase64(Сертификат.Выгрузить());    

    Попытка

        SignatureValue = ОбъектКомпоненты.CMSSign(

            Структура.data, //данные тип строка

            СертификатКриптографииBase64, //выгруженный в ДД сертификат в base64

            «», //пароль

            0, //тип подписи «CAdES-BES»

            Ложь, //открепленная

            17, //РежимВключенияСертификатовКриптографии.ВключатьПолнуюЦепочку

            0) //тип входных данных Строка;

    Исключение

        ВызватьИсключение НСтр(«ru = ‘Ошибка вызова метода CMSSign компоненты XMLDSig.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());

    КонецПопытки;    

    Подпись = Base64Значение(SignatureValue);

    
    Структура.data = ДвоичныеДанныеBase64(Подпись);

    
    ЗаписьJSON = Новый ЗаписьJSON;

    ЗаписьJSON.УстановитьСтроку();

    ЗаписатьJSON(ЗаписьJSON, Структура);

    СтрокаJSON = ЗаписьJSON.Закрыть();

    
    Заголовки = Новый Соответствие;    

    Заголовки.Вставить(«Content-Type», «application/json; charset=utf-8»);

    Заголовки.Вставить(«cache-control», «no-cache»);

    HTTPЗапрос = Новый HTTPЗапрос(«/auth/simpleSignIn», Заголовки);    

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);

    Попытка

        HTTPОтвет = Соединение.ВызватьHTTPМетод(«POST», HTTPЗапрос);    

    Исключение

        Сообщить(ОписаниеОшибки());

    КонецПопытки;

    
    Если Не HTTPОтвет.КодСостояния = 200 Тогда

        Сообщить(«Код состояния не равен 200»);

        Возврат;

    КонецЕсли;

    
    СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();

    ЧтениеJSON = Новый ЧтениеJSON;

    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

    Структура = ПрочитатьJSON(ЧтениеJSON);

    ЧтениеJSON.Закрыть();

    
    Токен = Структура.token;

   timurhv

30 — 04.06.20 — 10:10

(29) БСП нет разве в конфе?

   cmex

31 — 04.06.20 — 13:14

(30) нет, 11.1

  

VitShvets

32 — 19.06.20 — 16:51

(29) Спасибо тебе, добрый человек.

  

cmex

01.06.20 — 11:16

Добрый день!

Для использования всех методов необходимо иметь УКЭП. Кто нибудь из 1С уже работал по API? Как получить тестовую УКЭП, как использовать уже имеющуюся УКЭП директора организации на Сервере, чтобы автоматом можно было подписывать? Кто сталкивался? Просветите, как процесс устроен? Слышал, про тестовый УЦ, где выдают УКЭП, но не понял как с этим работать. В общем, буду признателен за любую информацию

  

cmex

1 — 01.06.20 — 14:21

up

  

ChMikle

2 — 01.06.20 — 14:25

  

cmex

3 — 01.06.20 — 17:08

(2) Спасибо

  

timurhv

4 — 01.06.20 — 17:13

Тестовая УКЭП должна быть на имя директора (если стоит KIS, то его лучше закрыть, т.к. из-за сертификата тестового сервера не пускает дальше регистрировать):

https://ismp.wiki/index.php?title=Софт

Если выходит ошибка регистрации на тестовой площадке — писать в тех.поддержку ЧЗ.

  

lodger

5 — 01.06.20 — 18:46

(0)

1) есть боевой и есть тестовый контур API

2) ключ можно использовать один и тот же.

3) нет нужды использовать ключ на сервере. достаточно сотворить токен авторизации на клиенте и отдать его на сервер.

4) у токена есть время жизни, 10 часов.

  

cmex

6 — 02.06.20 — 13:29

(5) удалось получить сертификат в Тестовом подчиненном УЦ КриптоПро. Установил сертификат под своей учеткой в ОС

Далее пишу код

ИнтеграционныйСтенд = «int01.gismt.crpt.tech/api/v3/true-api»;

Соединение = Новый HTTPСоединение(ИнтеграционныйСтенд,,,,,, Новый ЗащищенноеСоединениеOpenSSL);

HTTPЗапрос = Новый HTTPЗапрос(«/auth/key»);

HTTPОтвет = Соединение.ВызватьHTTPМетод(«GET», HTTPЗапрос);    

СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();

ЧтениеJSON = Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

Структура = ПрочитатьJSON(ЧтениеJSON);

ЧтениеJSON.Закрыть();

МенеджерКриптографии = Новый МенеджерКриптографии(«Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider», «», 75);

Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();

СертификатыХранилища = Хранилище.ПолучитьВсе();

Сертификат = СертификатыХранилища[0];    

ДД = ПолучитьДвоичныеДанныеИзСтроки(Структура.data);

Результат = МенеджерКриптографии.Подписать(ДД, Сертификат);

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, Структура);

СтрокаJSON = ЗаписьJSON.Закрыть();

Заголовки = Новый Соответствие;    

Заголовки.Вставить(«Content-Type», «application/json; charset=utf-8»);

Заголовки.Вставить(«cache-control», «no-cache»);

HTTPЗапрос = Новый HTTPЗапрос(«/auth/simpleSignIn», Заголовки);    

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);

Попытка

    HTTPОтвет = Соединение.ВызватьHTTPМетод(«POST», HTTPЗапрос);    

Исключение

    Сообщить(ОписаниеОшибки());

КонецПопытки;

Вываливается ошибка «Ошибка при получении свойства сертификата (0x00000000)»

Это я не так пользуюсь менеджером или этот ключ не может в принципе подписать? Читал про какой то закрытый ключ, но его в сертификате не увидел

Вот некая инфа по сертификату

Версия    «V3»    Строка

ДатаНачала    01.06.2020 8:26:46    Дата

ДатаОкончания    01.09.2020 8:36:46    Дата

CN    «Тестовый подчиненный УЦ ООО «КРИПТО-ПРО» ГОСТ 2012 (УЦ 2.0)»    Строка

Крипто ПРО csp 4.0

  

cmex

7 — 02.06.20 — 13:32

(5) у меня регламент будет работать с API, то есть сервер, поэтому на клиент доступа нет. может есть какой вариант другой? я слабо представляю как устроена вся схема работы эцп

  

Garykom

8 — 02.06.20 — 13:37

(7) У вас два варианта или самим разбираться или кого то нанимать кто уже разобрался

  

cmex

9 — 02.06.20 — 13:49

(8) почему 2? я бы помог, если бы знал, форму для этого и нужен, имхо

  

cmex

10 — 02.06.20 — 13:58

(9) *форум

  

Garykom

11 — 02.06.20 — 14:23

(9) Потому что там нет ничего сложного, обычная работа, которую бесплатно хрен кто будет делать.

Мануалы есть и они достаточно вменяемы, есть форум ЧЗ если что и прочие форумы.

В т.ч. как запросы по http делать или с криптопро/сертификатами работать

  

Garykom

12 — 02.06.20 — 14:24

Ты конкретные вопросы задавай что не получается а не «помогите мне кто нибудь — сделайте за меня или дайте разжеванное/готовое»

  

cmex

13 — 02.06.20 — 14:37

(12) ок, по мануалу разобрался. подписать вроде удалось, но в ответ на post запрос прилетает {«error_message»:»Ошибка при проверке подписи»}

подписываю, кодирую и отправляю так

ДД = ПолучитьДвоичныеДанныеИзСтроки(data, КодировкаТекста.UTF8);

РезультатДД = МенеджерКриптографии.Подписать(ДД, Сертификат);

РезультатСтрока = Base64Строка(РезультатДД);

может я в двоичные данные строку исходную не так перевожу? как правильно подписать?

  

Garykom

14 — 02.06.20 — 14:43

Вариант синтаксиса: Данные подписи сохраняются в файл

Синтаксис:

Подписать(<ИсходныеДанные>, <ВыходныеДанные>, <Сертификат>)

Параметры:

<ИсходныеДанные> (обязательный)

Тип: Строка, ДвоичныеДанные, Поток, ПотокВПамяти, ФайловыйПоток.

Исходные данные для подписывания.

Данные могут размещаться в файле (в этом случае указывается имя файла) или представлены как ДвоичныеДанные.

<ВыходныеДанные> (обязательный)

Тип: Строка: Поток, ПотокВПамяти, ФайловыйПоток.

Имя файла или поток, в который будут выгружены подписанные данные.

<Сертификат> (необязательный)

Тип: СертификатКриптографии.

Используемый сертификат криптографии.

Если параметр не указан, то в хранилище персональных сертификатов должен быть ровно один сертификат. В противном случае генерируется исключительная ситуация.

Описание варианта метода:

Подписанные данные записываются в файл. Возвращает Неопределено.

  

cmex

15 — 02.06.20 — 14:46

(14) намекаете, что надо пописать строку, предварительно не переводя в ДД?

  

cmex

16 — 02.06.20 — 14:46

(15) *подДписать)

  

Garykom

17 — 02.06.20 — 14:47

(14)+ Только уверен что апи требует прикрепленную подпись?

Если нужна открепленная то стандартный менеджер не пойдет и надо нечто вроде http://catalog.mista.ru/public/1058940/

  

cmex

18 — 02.06.20 — 14:47

(17) из Мануала —  data String + Подписанные УКЭП зарегистрированного УОТ случайные данные в base64 (ЭП

присоединенная)

  

Garykom

19 — 02.06.20 — 14:47

(16) А фуй знает что надо, надо разбираться

Лично я не имею представления по какому мануалу и что твоя делать

  

cmex

20 — 02.06.20 — 14:48

(19) v5 — Документация для партнёров по True API

  

Garykom

21 — 02.06.20 — 14:49

(18) Тогда попробуй имя файла входного и выходного указывать в Подписать

А затем сравнить с тем что выходит другими способами подписи того же файла.

Есть у криптопро cryptcp и csptest

  

Garykom

22 — 02.06.20 — 14:51

  

Garykom

23 — 02.06.20 — 14:55

  

cmex

24 — 02.06.20 — 15:30

все попробовал — не взлетает пока. чую, что близко, но пока никак

  

timurhv

25 — 02.06.20 — 16:27

Процедура ОбновитьТокен(ВидAPI, СледующееОповещение)

    АдресМетода = «/api/v3/auth/cert/key»;

    …

    HTTPСервисЗапрос = Новый HTTPСоединение(СтруктураПодключения[АдресAPI],,,,,60, Новый ЗащищенноеСоединениеopenSSL());

    Запрос = Новый HTTPЗапрос(АдресМетода);

    Ответ = HTTPСервисЗапрос.Получить(Запрос);

    Если Ответ.КодСостояния = 200 Тогда

        …

        МассивСертификатов = Новый Массив();

        Если ЗначениеЗаполнено(СертификатыКлючейЭлектроннойПодписиИШифрования) Тогда

            МассивСертификатов.Добавить(СертификатыКлючейЭлектроннойПодписиИШифрования);

        КонецЕсли;

        СтруктураОсновныхДанных = Новый Структура();

        СтруктураОсновныхДанных.Вставить(«СтрокаJSON», ОтветСтруктура.data);

        СтруктураОсновныхДанных.Вставить(«МассивСертификатов», МассивСертификатов);

        СтруктураОсновныхДанных.Вставить(«Открепленная», Ложь);

        СтруктураОсновныхДанных.Вставить(«СсылкаДокумента», «»);

        

        СтруктураДополнительныхДанных = Новый Структура();

        СтруктураДополнительныхДанных.Вставить(«СертификатПользователя», СертификатыКлючейЭлектроннойПодписиИШифрования);

        СтруктураДополнительныхДанных.Вставить(«ОтветСтруктура», ОтветСтруктура);

        СтруктураДополнительныхДанных.Вставить(«СледующееОповещение», СледующееОповещение);

        СтруктураДополнительныхДанных.Вставить(«HTTPСервисЗапрос», HTTPСервисЗапрос);

        ИнтеграцияИСМПСлужебныйКлиент.Подписать(СтруктураОсновныхДанных, Новый ОписаниеОповещения(«ОбработатьСообщения_ПриЗавершенииОперацииПодписи», ЭтотОбъект, СтруктураДополнительныхДанных));

    КонецЕсли;

КонецПроцедуры

Процедура ОбработатьСообщения_ПриЗавершенииОперацииПодписи(ПодписанныеСообщения, Контекст) Экспорт

    Если ПодписанныеСообщения = Неопределено Тогда

        Возврат;

    КонецЕсли;

    

    Для Каждого ЭлементСообщения Из ПодписанныеСообщения Цикл

        ПодписанныйФайл = ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);

        HTTPСервисЗапрос = Контекст.HTTPСервисЗапрос;

        Тело = «{

        |»»uuid»»: «»» + Контекст.ОтветСтруктура.uuid + «»»,

        |»»data»»: «»» + ПодписанныйФайл + «»»

        |}»;

        АдресМетода = «api/v3/auth/cert/»;

        HTTPЗапрос = Новый HTTPЗапрос(АдресМетода);

        HTTPЗапрос.Заголовки.Вставить(«Content-Type»,»application/json;charset=UTF-8″);

        HTTPЗапрос.УстановитьТелоИзСтроки(Тело);

        Ответ = HTTPСервисЗапрос.ОтправитьДляОбработки(HTTPЗапрос);

    КонецЦикла;

КонецПроцедуры

  

timurhv

26 — 02.06.20 — 16:41

(13) Base64 = Base64Строка(ДвоичныеДанные);

Base64 = СтрЗаменить(Base64, Символы.ПС, «»);

Base64 = СтрЗаменить(Base64, Символы.ВК, «»);

Символы переноса скорее забыли убрать

  

cmex

27 — 03.06.20 — 11:16

(26) это из какой конфы? ИнтеграцияИСКлиентСервер.ДвоичныеДанныеBase64(ЭлементСообщения.СвойстваПодписи.Подпись);

  

cmex

28 — 03.06.20 — 11:33

кажись разобрался, вернусь с результатом

  

cmex

29 — 03.06.20 — 17:18

причина была в том, что 1совский метод Подписать НЕ включает данные в подпись, как того требует ЧЗ. Для этого необходимо использовать внешнюю компоненту.

вот код рабочий. саму компоненту дернул из 11.4

МенеджерКриптографии = Новый МенеджерКриптографии(«Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider», «», 80);

    Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов();

    СертификатыХранилища = Хранилище.ПолучитьВсе();

    Сертификат = СертификатыХранилища[0];

    

    Макет = ПолучитьМакетНаСервере();

    Адрес = ПоместитьВоВременноеХранилище(Макет);     

    Если ПодключитьВнешнююКомпоненту(Адрес, «XMLDSignAddInSymbolicName», ТипВнешнейКомпоненты.Native) Тогда

        Попытка

            ОбъектКомпоненты = Новый(«AddIn.XMLDSignAddInSymbolicName.XMLDSignAddIn»);

            Если ОбъектКомпоненты = Неопределено Тогда

                ВызватьИсключение НСтр(«ru = ‘Оператор Новый вернул Неопределено’»);

            КонецЕсли;

        Исключение

            ВызватьИсключение НСтр(«ru = ‘Не удалось чуток’»);            

        КонецПопытки;        

    КонецЕсли;    

    ОбъектКомпоненты.ПутьККриптопровайдеру = «»;

    СертификатКриптографииBase64 = СертификатКриптографииBase64(Сертификат.Выгрузить());    

    Попытка

        SignatureValue = ОбъектКомпоненты.CMSSign(

            Структура.data, //данные тип строка

            СертификатКриптографииBase64, //выгруженный в ДД сертификат в base64

            «», //пароль

            0, //тип подписи «CAdES-BES»

            Ложь, //открепленная

            17, //РежимВключенияСертификатовКриптографии.ВключатьПолнуюЦепочку

            0) //тип входных данных Строка;

    Исключение

        ВызватьИсключение НСтр(«ru = ‘Ошибка вызова метода CMSSign компоненты XMLDSig.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());

    КонецПопытки;    

    Подпись = Base64Значение(SignatureValue);

    
    Структура.data = ДвоичныеДанныеBase64(Подпись);

    

    ЗаписьJSON = Новый ЗаписьJSON;

    ЗаписьJSON.УстановитьСтроку();

    ЗаписатьJSON(ЗаписьJSON, Структура);

    СтрокаJSON = ЗаписьJSON.Закрыть();

    

    Заголовки = Новый Соответствие;    

    Заголовки.Вставить(«Content-Type», «application/json; charset=utf-8»);

    Заголовки.Вставить(«cache-control», «no-cache»);

    HTTPЗапрос = Новый HTTPЗапрос(«/auth/simpleSignIn», Заголовки);    

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);

    Попытка

        HTTPОтвет = Соединение.ВызватьHTTPМетод(«POST», HTTPЗапрос);    

    Исключение

        Сообщить(ОписаниеОшибки());

    КонецПопытки;

    

    Если Не HTTPОтвет.КодСостояния = 200 Тогда

        Сообщить(«Код состояния не равен 200»);

        Возврат;

    КонецЕсли;

    

    СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();

    ЧтениеJSON = Новый ЧтениеJSON;

    ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

    Структура = ПрочитатьJSON(ЧтениеJSON);

    ЧтениеJSON.Закрыть();

    
    Токен = Структура.token;

  

timurhv

30 — 04.06.20 — 10:10

(29) БСП нет разве в конфе?

  

cmex

31 — 04.06.20 — 13:14

(30) нет, 11.1

  

VitShvets

32 — 19.06.20 — 16:51

(29) Спасибо тебе, добрый человек.

#Область ПрограммныйИнтерфейс // Начинает подписание XML сообщения. // // Параметры: // ОповещенияПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после подписания сообщения // КонвертSOAP — Строка — Шаблон подписываемого сообщения // СертификатКриптографии — СертификатКриптографии // МенеджерКриптографии — МенеджерКриптографии // Процедура НачатьПодписание(ОповещенияПриЗавершении, КонвертSOAP, ДанныеАлгоритмаПодписания, СертификатКриптографии, МенеджерКриптографии) Экспорт Контекст = Новый Структура; Контекст.Вставить(«Режим», «РежимПодписание»); Контекст.Вставить(«ОповещенияПриЗавершении», ОповещенияПриЗавершении); Контекст.Вставить(«УстанавливатьКомпоненту», Истина); Контекст.Вставить(«КонвертSOAP», КонвертSOAP); Контекст.Вставить(«ДанныеАлгоритмаПодписания», ДанныеАлгоритмаПодписания); Контекст.Вставить(«СертификатКриптографии», СертификатКриптографии); Контекст.Вставить(«СертификатКриптографииBase64», Неопределено); Контекст.Вставить(«МенеджерКриптографии», МенеджерКриптографии); Контекст.Вставить(«ТипКриптопровайдера», Неопределено); Контекст.Вставить(«ИмяКриптопровайдера», Неопределено); СертификатКриптографии.НачатьВыгрузку( Новый ОписаниеОповещения(«НачатьПодписание_ПослеВыгрузкиСертификатаКриптографии», ЭтотОбъект, Контекст)); КонецПроцедуры // Начинает подписание XML сообщения. // // Параметры: // ОповещенияПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после подписания сообщения // КонвертSOAP — Строка — Шаблон подписываемого сообщения // ДанныеАлгоритмаПодписания — Структура со свойствами: // МенеджерКриптографии — МенеджерКриптографии // Процедура НачатьПроверкуПодписи(ОповещенияПриЗавершении, КонвертSOAP, ДанныеАлгоритмаПодписания, МенеджерКриптографии) Экспорт СертификатКриптографииBase64 = ИнтеграцияГИСМКлиентСервер.НайтиВXML(КонвертSOAP, «wsse:BinarySecurityToken»); ДвоичныеДанные = Base64Значение(СертификатКриптографииBase64); Контекст = Новый Структура; Контекст.Вставить(«Режим», «РежимПроверка»); Контекст.Вставить(«ОповещенияПриЗавершении», ОповещенияПриЗавершении); Контекст.Вставить(«УстанавливатьКомпоненту», Истина); Контекст.Вставить(«КонвертSOAP», КонвертSOAP); Контекст.Вставить(«ДанныеАлгоритмаПодписания», ДанныеАлгоритмаПодписания); Контекст.Вставить(«СертификатКриптографии», Новый СертификатКриптографии(ДвоичныеДанные)); Контекст.Вставить(«СертификатКриптографииBase64», СертификатКриптографииBase64); Контекст.Вставить(«МенеджерКриптографии», МенеджерКриптографии); Контекст.Вставить(«ТипКриптопровайдера», Неопределено); Контекст.Вставить(«ИмяКриптопровайдера», Неопределено); НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции #Область УстановкаИПодключение // Начинает установку компоненты XMLDSIG. // // Параметры: // ОповещениеПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после установки компоненты. // Процедура НачатьУстановкуКомпоненты(ОповещениеПриЗавершении = Неопределено) Экспорт ДополнительныеПараметры = Новый Структура(«ОповещениеПриЗавершении», ОповещениеПриЗавершении); НачатьУстановкуВнешнейКомпоненты( Новый ОписаниеОповещения(«УстановкаКомпоненты_Завершение», ЭтотОбъект, ДополнительныеПараметры), «ОбщийМакет.КомпонентаXMLDSIG»); КонецПроцедуры Процедура УстановкаКомпоненты_Завершение(ДополнительныеПараметры) Экспорт ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеПриЗавершении, Неопределено); КонецПроцедуры Процедура ПослеУстановкиКомпоненты(Результат, Контекст) Экспорт Контекст.Вставить(«УстанавливатьКомпоненту», Ложь); НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры Процедура ПослеПодключенияКомпоненты(Подключено, Контекст) Экспорт Если Подключено Тогда Выполнено = Ложь; Попытка ОбъектКомпоненты = Новый(«Addin.ОбъектXMLDSIG.XMLDSignAddIn»); Выполнено = Истина; Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка инициализации компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Выполнено = Ложь; КонецПопытки; Если Выполнено Тогда Контекст.Вставить(«ОбъектКомпоненты», ОбъектКомпоненты); Если Контекст.Режим = «РежимПроверка» Тогда ОповещениеПриЗавершении = Новый ОписаниеОповещения(«НачатьПроверкуПодписиСообщенияSOAP», ЭтотОбъект, Контекст); Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии(ОповещениеПриЗавершении); ИначеЕсли Контекст.Режим = «РежимПодписание» Тогда ОповещениеПриЗавершении = Новый ОписаниеОповещения(«НачатьПодписаниеСообщенияSOAP», ЭтотОбъект, Контекст); Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии(ОповещениеПриЗавершении); Иначе ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Не установлен режим работы компоненты XMLDSIG.’»)); КонецЕсли; КонецЕсли; ИначеЕсли Контекст.УстанавливатьКомпоненту Тогда ТекстВопроса = НСтр(«ru = ‘Для подписания XML необходима установка компоненты XMLDSIG. |Перейти к установке данной компоненты?’»); ПоказатьВопрос( Новый ОписаниеОповещения(«ПередУстановкойКомпоненты», ЭтотОбъект, Контекст), ТекстВопроса, РежимДиалогаВопрос.ДаНет); Иначе ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Операция невозможна. Требуется установка компоненты XMLDSIG.’»)); КонецЕсли; КонецПроцедуры Процедура ПередУстановкойКомпоненты(РезультатВопроса, Контекст) Экспорт Если НЕ РезультатВопроса = КодВозвратаДиалога.Да Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Операция невозможна. Требуется установка компоненты для HTTP-запросов.’»)); Иначе НачатьУстановкуКомпоненты(Новый ОписаниеОповещения(«ПослеУстановкиКомпоненты», ЭтотОбъект, Контекст)); КонецЕсли; КонецПроцедуры #КонецОбласти #Область Подписание Процедура НачатьПодписание_ПослеВыгрузкиСертификатаКриптографии(ДвоичныеДанныеСертификата, Контекст) Экспорт СертификатКриптографииBase64 = ОтформатироватьСтрокуBase64(Base64Строка(ДвоичныеДанныеСертификата)); Контекст.КонвертSOAP = СтрЗаменить( Контекст.КонвертSOAP, «%BinarySecurityToken%», СертификатКриптографииBase64); Контекст.СертификатКриптографииBase64 = СертификатКриптографииBase64; НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры Процедура НачатьПодписаниеСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ЭлектроннаяПодписьXMLDSIGВызовСервераПовтИсп.ТипКриптопровайдераПоИмени(ИмяКриптопровайдера); Если ТипКриптопровайдера = Неопределено Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Не удалось определить тип криптопровайдера %1′»), ИнформацияМодуляКриптографии.Имя) + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецЕсли; Контекст.ТипКриптопровайдера = ТипКриптопровайдера; Контекст.ИмяКриптопровайдера = ИмяКриптопровайдера; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияGetSignOIDFromCert», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( ОписаниеОповещения, Контекст.СертификатКриптографииBase64); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт Если OIDАлгоритмаПодписи = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода GetSignOIDFromCert произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Если OIDАлгоритмаПодписи <> Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Алгоритм подписи сертификата криптографии отличается от алгоритма %1.’»), Контекст.ДанныеАлгоритмаПодписания.ИмяАлгоритмаПодписи)); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияC14N_ПодписываемыйТег», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathПодписываемыйТег); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_ПодписываемыйТег(КаноникализированныйТекстXML, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXML = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияHash_ПодписываемыйТег», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияHash_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовHash( ОписаниеОповещения, КаноникализированныйТекстXML, Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияHash_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияHash_ПодписываемыйТег(DigestValue, Параметры, Контекст) Экспорт Если DigestValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Hash произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Контекст.КонвертSOAP = СтрЗаменить(Контекст.КонвертSOAP, «%DigestValue%», DigestValue); Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияC14N_SignedInfo», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияC14N_SignedInfo_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathSignedInfo); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_SignedInfo_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_SignedInfo(КаноникализированныйТекстXMLSignedInfo, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLSignedInfo = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Попытка Контекст.ОбъектКомпоненты.НачатьВызовSign( Новый ОписаниеОповещения(«Подписание_ПослеВыполненияSign», ЭтотОбъект, Контекст), КаноникализированныйТекстXMLSignedInfo, Контекст.СертификатКриптографииBase64, Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Sign компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияSign_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Sign компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияSign(SignatureValue, Параметры, Контекст) Экспорт Если SignatureValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Sign произошла ошибка:’»), Контекст); Возврат; КонецЕсли; КонвертSOAP = СтрЗаменить(Контекст.КонвертSOAP, «%SignatureValue%», SignatureValue); ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, КонвертSOAP); КонецПроцедуры Процедура НачатьПроверкуПодписиСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ЭлектроннаяПодписьXMLDSIGВызовСервераПовтИсп.ТипКриптопровайдераПоИмени(ИмяКриптопровайдера); Если ТипКриптопровайдера = Неопределено Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Не удалось определить тип криптопровайдена %1′»), ИнформацияМодуляКриптографии.Имя) + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецЕсли; Контекст.ТипКриптопровайдера = ТипКриптопровайдера; Контекст.ИмяКриптопровайдера = ИмяКриптопровайдера; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияGetSignOIDFromCert», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( ОписаниеОповещения, Контекст.СертификатКриптографииBase64); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт Если OIDАлгоритмаПодписи = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода GetSignOIDFromCert произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Если OIDАлгоритмаПодписи <> Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияC14N_SignedInfo», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияC14N_SignedInfo_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathSignedInfo); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_SignedInfo_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_SignedInfo(КаноникализированныйТекстXMLSignedInfo, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLSignedInfo = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:’»), Контекст); Возврат; КонецЕсли; SignatureValue = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «SignatureValue»); СертификатКриптографииBase64 = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «wsse:BinarySecurityToken»); Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияVerifySign», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияVerifySign_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовVerifySign( ОписаниеОповещения, КаноникализированныйТекстXMLSignedInfo, SignatureValue, СертификатКриптографииBase64, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода VerifySign компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияVerifySign_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода VerifySign компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияVerifySign(ПодписьВерна, Параметры, Контекст) Экспорт Если ПодписьВерна = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода VerifySign произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Если Не ПодписьВерна Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Подпись не верна (SignatureValue не корректно.’»)); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияC14N_ПодписываемыйТег», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathПодписываемыйТег); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_ПодписываемыйТег(КаноникализированныйТекстXMLПодписываемыйТег, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLПодписываемыйТег = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:’»), Контекст); Возврат; КонецЕсли; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияHash_ПодписываемыйТег», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияHash_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовHash( ОписаниеОповещения, КаноникализированныйТекстXMLПодписываемыйТег, Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияHash_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияHash_ПодписываемыйТег(HashValue, Параметры, Контекст) Экспорт Если HashValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Hash произошла ошибка:’»), Контекст); Возврат; КонецЕсли; DigestValue = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «DigestValue»); ПодписьВерна = (DigestValue = HashValue); Если Не ПодписьВерна Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Подпись не верна (SignatureValue корректно, отличается DigestValue).’»)); Иначе ДвоичныеДанные = Base64Значение(Контекст.СертификатКриптографииBase64); ДатаПодписания = ЭлектроннаяПодписьКлиент.ДатаПодписания(ДвоичныеДанные); Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда ДатаПодписания = Неопределено; КонецЕсли; ВозвращаемоеЗначение = Новый Структура; ВозвращаемоеЗначение.Вставить(«Сертификат», Контекст.СертификатКриптографии); ВозвращаемоеЗначение.Вставить(«ДатаПодписания», ДатаПодписания); ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, ВозвращаемоеЗначение); КонецЕсли; КонецПроцедуры Процедура НачатьПолучениеТекстаОшибки(НачалоОписанияТекстаОшибки, Контекст) Попытка Контекст.Вставить(«НачалоОписанияТекстаОшибки», НачалоОписанияТекстаОшибки); ОписаниеОповещения = Новый ОписаниеОповещения( «ПослеВыполненияGetLastError», ЭтотОбъект, Контекст, «ПослеВыполненияGetLastError_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetLastError(ОписаниеОповещения); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetLastError компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура ПослеВыполненияGetLastError_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetLastError компоненты XMLDSIG.’») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура ПослеВыполненияGetLastError(ТекстОшибки, Параметры, Контекст) Экспорт ЗавершитьОперациюСОшибкой( Контекст, Контекст.НачалоОписанияТекстаОшибки + Символы.ПС + ТекстОшибки); КонецПроцедуры #КонецОбласти #Область Прочее Процедура ЗавершитьОперациюСОшибкой(Контекст, ТекстОшибки) Экспорт ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Ошибка, ТекстОшибки); КонецПроцедуры // Форматирует строку в формате base64, удаляя символы перевода строки и возврата каретки. // // Параметры: // СтрокаBase64 — Строка — строка, которая подлежит преобразования. // // Возвращаемое значение: // Строка — строка, из которой удалены символы перевода строки и возврата каретки. // Функция ОтформатироватьСтрокуBase64(СтрокаBase64) Значение = СтрЗаменить(СтрокаBase64, Символы.ВК, «»); Значение = СтрЗаменить(Значение, Символы.ПС, «»); Возврат Значение; КонецФункции #КонецОбласти #КонецОбласти


Offline

Dartwed1989

 


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

15 октября 2019 г. 14:15:58(UTC)

Dartwed1989

Статус: Участник

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

Зарегистрирован: 17.05.2019(UTC)
Сообщений: 13
Российская Федерация
Откуда: Санкт-Петербург

Поблагодарили: 1 раз в 1 постах

Добрый день!

В 1С организована работа с порталом СЭП(Системы электронных паспортов) для оформления ЭПТС(Электронных паспортов технических средств) через криптошлюз.
Обмен осуществляется xml файлами с подписью XMLDSig.
Есть 3 сертификата (для трех разных пользователей). Для двух пользователей все работает без нареканий. Для одного пользователя выводится данная ошибка:

«Ошибка по VIN: XW7BF3HK00S151416 Ошибка при обработке данных: {ОбщийМодуль.ЭлектроннаяПодписьСлужебный.Модуль(1556)}: Ошибка вызова метода Sign компоненты XMLDSig. Ошибка криптографии : Системная криптографическая ошибка — 0x8010006B ( =1).»

Сертификат пользователя проходит все проверки, он действителен, не заблокирован и пользователь с помощью данного сертификата заходит на портал СЭП и работает в системе Диадок.

Версия КриптоПро — 4.0.9.
Сравнение настроек с другими пользователями расхождений не выявило.
Сертификат загружен в контейнер сертификатов. В чем конкретно ошибка понять уже не удается. Можете что-либо подсказать?


Вверх


Offline

Dartwed1989

 


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

15 октября 2019 г. 16:13:11(UTC)

Dartwed1989

Статус: Участник

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

Зарегистрирован: 17.05.2019(UTC)
Сообщений: 13
Российская Федерация
Откуда: Санкт-Петербург

Поблагодарили: 1 раз в 1 постах

Проблему решить удалось.

Необходимо было в КриптоПро поставить галочку — «Запомнить пароль».


Вверх

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

Guest

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

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

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

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

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

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

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

#Область ПрограммныйИнтерфейс // Начинает подписание XML сообщения. // // Параметры: // ОповещенияПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после подписания сообщения // КонвертSOAP — Строка — Шаблон подписываемого сообщения // СертификатКриптографии — СертификатКриптографии // МенеджерКриптографии — МенеджерКриптографии // Процедура НачатьПодписание(ОповещенияПриЗавершении, КонвертSOAP, ДанныеАлгоритмаПодписания, СертификатКриптографии, МенеджерКриптографии) Экспорт Контекст = Новый Структура; Контекст.Вставить(«Режим», «РежимПодписание»); Контекст.Вставить(«ОповещенияПриЗавершении», ОповещенияПриЗавершении); Контекст.Вставить(«УстанавливатьКомпоненту», Истина); Контекст.Вставить(«КонвертSOAP», КонвертSOAP); Контекст.Вставить(«ДанныеАлгоритмаПодписания», ДанныеАлгоритмаПодписания); Контекст.Вставить(«СертификатКриптографии», СертификатКриптографии); Контекст.Вставить(«СертификатКриптографииBase64», Неопределено); Контекст.Вставить(«МенеджерКриптографии», МенеджерКриптографии); Контекст.Вставить(«ТипКриптопровайдера», Неопределено); Контекст.Вставить(«ИмяКриптопровайдера», Неопределено); СертификатКриптографии.НачатьВыгрузку( Новый ОписаниеОповещения(«НачатьПодписание_ПослеВыгрузкиСертификатаКриптографии», ЭтотОбъект, Контекст)); КонецПроцедуры // Начинает подписание XML сообщения. // // Параметры: // ОповещенияПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после подписания сообщения // КонвертSOAP — Строка — Шаблон подписываемого сообщения // ДанныеАлгоритмаПодписания — Структура со свойствами: // МенеджерКриптографии — МенеджерКриптографии // Процедура НачатьПроверкуПодписи(ОповещенияПриЗавершении, КонвертSOAP, ДанныеАлгоритмаПодписания, МенеджерКриптографии) Экспорт СертификатКриптографииBase64 = ИнтеграцияГИСМКлиентСервер.НайтиВXML(КонвертSOAP, «wsse:BinarySecurityToken»); ДвоичныеДанные = Base64Значение(СертификатКриптографииBase64); Контекст = Новый Структура; Контекст.Вставить(«Режим», «РежимПроверка»); Контекст.Вставить(«ОповещенияПриЗавершении», ОповещенияПриЗавершении); Контекст.Вставить(«УстанавливатьКомпоненту», Истина); Контекст.Вставить(«КонвертSOAP», КонвертSOAP); Контекст.Вставить(«ДанныеАлгоритмаПодписания», ДанныеАлгоритмаПодписания); Контекст.Вставить(«СертификатКриптографии», Новый СертификатКриптографии(ДвоичныеДанные)); Контекст.Вставить(«СертификатКриптографииBase64», СертификатКриптографииBase64); Контекст.Вставить(«МенеджерКриптографии», МенеджерКриптографии); Контекст.Вставить(«ТипКриптопровайдера», Неопределено); Контекст.Вставить(«ИмяКриптопровайдера», Неопределено); НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции #Область УстановкаИПодключение // Начинает установку компоненты XMLDSIG. // // Параметры: // ОповещениеПриЗавершении — ОписаниеОповещения — процедура, которая будет вызвана после установки компоненты. // Процедура НачатьУстановкуКомпоненты(ОповещениеПриЗавершении = Неопределено) Экспорт ДополнительныеПараметры = Новый Структура(«ОповещениеПриЗавершении», ОповещениеПриЗавершении); НачатьУстановкуВнешнейКомпоненты( Новый ОписаниеОповещения(«УстановкаКомпоненты_Завершение», ЭтотОбъект, ДополнительныеПараметры), «ОбщийМакет.КомпонентаXMLDSIG»); КонецПроцедуры Процедура УстановкаКомпоненты_Завершение(ДополнительныеПараметры) Экспорт ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеПриЗавершении, Неопределено); КонецПроцедуры Процедура ПослеУстановкиКомпоненты(Результат, Контекст) Экспорт Контекст.Вставить(«УстанавливатьКомпоненту», Ложь); НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры Процедура ПослеПодключенияКомпоненты(Подключено, Контекст) Экспорт Если Подключено Тогда Выполнено = Ложь; Попытка ОбъектКомпоненты = Новый(«Addin.ОбъектXMLDSIG.XMLDSignAddIn»); Выполнено = Истина; Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка инициализации компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Выполнено = Ложь; КонецПопытки; Если Выполнено Тогда Контекст.Вставить(«ОбъектКомпоненты», ОбъектКомпоненты); Если Контекст.Режим = «РежимПроверка» Тогда ОповещениеПриЗавершении = Новый ОписаниеОповещения(«НачатьПроверкуПодписиСообщенияSOAP», ЭтотОбъект, Контекст); Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии(ОповещениеПриЗавершении); ИначеЕсли Контекст.Режим = «РежимПодписание» Тогда ОповещениеПриЗавершении = Новый ОписаниеОповещения(«НачатьПодписаниеСообщенияSOAP», ЭтотОбъект, Контекст); Контекст.МенеджерКриптографии.НачатьПолучениеИнформацииМодуляКриптографии(ОповещениеПриЗавершении); Иначе ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Не установлен режим работы компоненты XMLDSIG.'»)); КонецЕсли; КонецЕсли; ИначеЕсли Контекст.УстанавливатьКомпоненту Тогда ТекстВопроса = НСтр(«ru = ‘Для подписания XML необходима установка компоненты XMLDSIG. |Перейти к установке данной компоненты?'»); ПоказатьВопрос( Новый ОписаниеОповещения(«ПередУстановкойКомпоненты», ЭтотОбъект, Контекст), ТекстВопроса, РежимДиалогаВопрос.ДаНет); Иначе ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Операция невозможна. Требуется установка компоненты XMLDSIG.'»)); КонецЕсли; КонецПроцедуры Процедура ПередУстановкойКомпоненты(РезультатВопроса, Контекст) Экспорт Если НЕ РезультатВопроса = КодВозвратаДиалога.Да Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Операция невозможна. Требуется установка компоненты для HTTP-запросов.'»)); Иначе НачатьУстановкуКомпоненты(Новый ОписаниеОповещения(«ПослеУстановкиКомпоненты», ЭтотОбъект, Контекст)); КонецЕсли; КонецПроцедуры #КонецОбласти #Область Подписание Процедура НачатьПодписание_ПослеВыгрузкиСертификатаКриптографии(ДвоичныеДанныеСертификата, Контекст) Экспорт СертификатКриптографииBase64 = ОтформатироватьСтрокуBase64(Base64Строка(ДвоичныеДанныеСертификата)); Контекст.КонвертSOAP = СтрЗаменить( Контекст.КонвертSOAP, «%BinarySecurityToken%», СертификатКриптографииBase64); Контекст.СертификатКриптографииBase64 = СертификатКриптографииBase64; НачатьПодключениеВнешнейКомпоненты( Новый ОписаниеОповещения(«ПослеПодключенияКомпоненты», ЭтотОбъект, Контекст), «ОбщийМакет.КомпонентаXMLDSIG», «ОбъектXMLDSIG», ТипВнешнейКомпоненты.Native); КонецПроцедуры Процедура НачатьПодписаниеСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ЭлектроннаяПодписьXMLDSIGВызовСервераПовтИсп.ТипКриптопровайдераПоИмени(ИмяКриптопровайдера); Если ТипКриптопровайдера = Неопределено Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Не удалось определить тип криптопровайдера %1′»), ИнформацияМодуляКриптографии.Имя) + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецЕсли; Контекст.ТипКриптопровайдера = ТипКриптопровайдера; Контекст.ИмяКриптопровайдера = ИмяКриптопровайдера; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияGetSignOIDFromCert», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( ОписаниеОповещения, Контекст.СертификатКриптографииBase64); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт Если OIDАлгоритмаПодписи = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода GetSignOIDFromCert произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Если OIDАлгоритмаПодписи <> Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Алгоритм подписи сертификата криптографии отличается от алгоритма %1.'»), Контекст.ДанныеАлгоритмаПодписания.ИмяАлгоритмаПодписи)); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияC14N_ПодписываемыйТег», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathПодписываемыйТег); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_ПодписываемыйТег(КаноникализированныйТекстXML, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXML = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияHash_ПодписываемыйТег», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияHash_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовHash( ОписаниеОповещения, КаноникализированныйТекстXML, Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияHash_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияHash_ПодписываемыйТег(DigestValue, Параметры, Контекст) Экспорт Если DigestValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Hash произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Контекст.КонвертSOAP = СтрЗаменить(Контекст.КонвертSOAP, «%DigestValue%», DigestValue); Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Подписание_ПослеВыполненияC14N_SignedInfo», ЭтотОбъект, Контекст, «Подписание_ПослеВыполненияC14N_SignedInfo_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathSignedInfo); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_SignedInfo_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияC14N_SignedInfo(КаноникализированныйТекстXMLSignedInfo, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLSignedInfo = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Попытка Контекст.ОбъектКомпоненты.НачатьВызовSign( Новый ОписаниеОповещения(«Подписание_ПослеВыполненияSign», ЭтотОбъект, Контекст), КаноникализированныйТекстXMLSignedInfo, Контекст.СертификатКриптографииBase64, Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Sign компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Подписание_ПослеВыполненияSign_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Sign компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Подписание_ПослеВыполненияSign(SignatureValue, Параметры, Контекст) Экспорт Если SignatureValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Sign произошла ошибка:'»), Контекст); Возврат; КонецЕсли; КонвертSOAP = СтрЗаменить(Контекст.КонвертSOAP, «%SignatureValue%», SignatureValue); ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, КонвертSOAP); КонецПроцедуры Процедура НачатьПроверкуПодписиСообщенияSOAP(ИнформацияМодуляКриптографии, Контекст) Экспорт ИмяКриптопровайдера = ИнформацияМодуляКриптографии.Имя; ТипКриптопровайдера = ЭлектроннаяПодписьXMLDSIGВызовСервераПовтИсп.ТипКриптопровайдераПоИмени(ИмяКриптопровайдера); Если ТипКриптопровайдера = Неопределено Тогда ЗавершитьОперациюСОшибкой( Контекст, СтрШаблон( НСтр(«ru = ‘Не удалось определить тип криптопровайдена %1′»), ИнформацияМодуляКриптографии.Имя) + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат; КонецЕсли; Контекст.ТипКриптопровайдера = ТипКриптопровайдера; Контекст.ИмяКриптопровайдера = ИмяКриптопровайдера; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияGetSignOIDFromCert», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( ОписаниеОповещения, Контекст.СертификатКриптографииBase64); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт Если OIDАлгоритмаПодписи = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода GetSignOIDFromCert произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Если OIDАлгоритмаПодписи <> Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияC14N_SignedInfo», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияC14N_SignedInfo_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathSignedInfo); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_SignedInfo_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_SignedInfo(КаноникализированныйТекстXMLSignedInfo, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLSignedInfo = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:'»), Контекст); Возврат; КонецЕсли; SignatureValue = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «SignatureValue»); СертификатКриптографииBase64 = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «wsse:BinarySecurityToken»); Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияVerifySign», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияVerifySign_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовVerifySign( ОписаниеОповещения, КаноникализированныйТекстXMLSignedInfo, SignatureValue, СертификатКриптографииBase64, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода VerifySign компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияVerifySign_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода VerifySign компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияVerifySign(ПодписьВерна, Параметры, Контекст) Экспорт Если ПодписьВерна = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода VerifySign произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Если Не ПодписьВерна Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Подпись не верна (SignatureValue не корректно.'»)); Иначе Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияC14N_ПодписываемыйТег», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовC14N( ОписаниеОповещения, Контекст.КонвертSOAP, Контекст.ДанныеАлгоритмаПодписания.XPathПодписываемыйТег); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЕсли; КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода C14N компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияC14N_ПодписываемыйТег(КаноникализированныйТекстXMLПодписываемыйТег, Параметры, Контекст) Экспорт Если КаноникализированныйТекстXMLПодписываемыйТег = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода C14N произошла ошибка:'»), Контекст); Возврат; КонецЕсли; Попытка ОписаниеОповещения = Новый ОписаниеОповещения( «Проверка_ПослеВыполненияHash_ПодписываемыйТег», ЭтотОбъект, Контекст, «Проверка_ПослеВыполненияHash_ПодписываемыйТег_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовHash( ОписаниеОповещения, КаноникализированныйТекстXMLПодписываемыйТег, Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Контекст.ТипКриптопровайдера); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура Проверка_ПослеВыполненияHash_ПодписываемыйТег_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода Hash компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура Проверка_ПослеВыполненияHash_ПодписываемыйТег(HashValue, Параметры, Контекст) Экспорт Если HashValue = Неопределено Тогда НачатьПолучениеТекстаОшибки(НСтр(«ru = ‘При выполнении метода Hash произошла ошибка:'»), Контекст); Возврат; КонецЕсли; DigestValue = ИнтеграцияГИСМКлиентСервер.НайтиВXML(Контекст.КонвертSOAP, «DigestValue»); ПодписьВерна = (DigestValue = HashValue); Если Не ПодписьВерна Тогда ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Подпись не верна (SignatureValue корректно, отличается DigestValue).'»)); Иначе ДвоичныеДанные = Base64Значение(Контекст.СертификатКриптографииBase64); ДатаПодписания = ЭлектроннаяПодписьКлиент.ДатаПодписания(ДвоичныеДанные); Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда ДатаПодписания = Неопределено; КонецЕсли; ВозвращаемоеЗначение = Новый Структура; ВозвращаемоеЗначение.Вставить(«Сертификат», Контекст.СертификатКриптографии); ВозвращаемоеЗначение.Вставить(«ДатаПодписания», ДатаПодписания); ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Успех, ВозвращаемоеЗначение); КонецЕсли; КонецПроцедуры Процедура НачатьПолучениеТекстаОшибки(НачалоОписанияТекстаОшибки, Контекст) Попытка Контекст.Вставить(«НачалоОписанияТекстаОшибки», НачалоОписанияТекстаОшибки); ОписаниеОповещения = Новый ОписаниеОповещения( «ПослеВыполненияGetLastError», ЭтотОбъект, Контекст, «ПослеВыполненияGetLastError_Ошибка», ЭтотОбъект); Контекст.ОбъектКомпоненты.НачатьВызовGetLastError(ОписаниеОповещения); Исключение ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetLastError компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецПроцедуры Процедура ПослеВыполненияGetLastError_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ЗавершитьОперациюСОшибкой( Контекст, НСтр(«ru = ‘Ошибка вызова метода GetLastError компоненты XMLDSIG.'») + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПроцедуры Процедура ПослеВыполненияGetLastError(ТекстОшибки, Параметры, Контекст) Экспорт ЗавершитьОперациюСОшибкой( Контекст, Контекст.НачалоОписанияТекстаОшибки + Символы.ПС + ТекстОшибки); КонецПроцедуры #КонецОбласти #Область Прочее Процедура ЗавершитьОперациюСОшибкой(Контекст, ТекстОшибки) Экспорт ВыполнитьОбработкуОповещения(Контекст.ОповещенияПриЗавершении.Ошибка, ТекстОшибки); КонецПроцедуры // Форматирует строку в формате base64, удаляя символы перевода строки и возврата каретки. // // Параметры: // СтрокаBase64 — Строка — строка, которая подлежит преобразования. // // Возвращаемое значение: // Строка — строка, из которой удалены символы перевода строки и возврата каретки. // Функция ОтформатироватьСтрокуBase64(СтрокаBase64) Значение = СтрЗаменить(СтрокаBase64, Символы.ВК, «»); Значение = СтрЗаменить(Значение, Символы.ПС, «»); Возврат Значение; КонецФункции #КонецОбласти #КонецОбласти

Содержание

  1. Настройка CryptoDE для ЕГИССО
  2. Где скачать Crypto+DE
  3. Ошибка
  4. Настройка CryptoDE для ЕГИССО
  5. Частые проблемы при работе с электронной подписью
  6. Проблема 1. Неверные имя пользователя или пароль.
  7. Проблема 2. При нажатии на кнопку «Запросить сертификат» возникают ошибки или не открывается программа КриптоПро.
  8. Проблема 3. Не удается выполнить запрос на сертификат.
  9. Проблема 4. При создании запроса на сертификат в КриптоПро CSP отсутствует биологический датчик случайных чисел и не удается сформировать контейнер закрытого ключа. Вместо окна биологического датчика случайных чисел открылось окно:
  10. Проблема 5. Ошибки при работе с полученным сертификатом: при подписании или при проверке подлинности сертификата.
  11. Проблема 6. Если Вы выпускали электронную подпись до 01.07.2022 и не удается войти в личный кабинет на сайте Удостоверяющего центра ООО «ПРОГРАММНЫЙ ЦЕНТР». Например, возникает следующая ошибка:
  12. Проблема 7. При выборе сертификата, который был выпущен до 01.07.2022, в личном кабинете на сайте Удостоверяющего центра ООО «ПРОГРАММНЫЙ ЦЕНТР» возникает ошибка:
  13. Проблема 8. При аннулировании или приостановке действия сертификата ЭП, который был выпущен до 01.07.2022, окно отзыва или приостановления не закрывается автоматически или страница сайта не обновляется.
  14. Смешанный (клиент/сервер) алгоритм формирования цифровой подписи xmlDsig на основе CryptoPro Browser Plugin

Настройка CryptoDE для ЕГИССО

Произошла небольшая неприятность на работе. Ноутбук, на котором настроено рабочее место для ЕГИССО срочно понадобилось отдать на время другому пользователю. «Ничего страшного» — подумал я, — «настрою портал на другом компьютере, благо как настраивать давно уже известно».

Но после того как все необходимые компоненты были установлены, средство для работы с электронной подписью CryptoDE начало капризничать и никак не хотело подписывать документы. Постоянно выскакивающее окно сообщало: «Ни один из сертификатов в хранилище не прошел проверку на квалифицированность в соответствии с настройками». Чтобы избавиться от этой ошибки, понадобилось немного поковыряться в настройках программы. В данной статье речь пойдет о том, как провести настройку CryptoDE для ЕГИССО.

Где скачать Crypto+DE

Скачать актуальную версию программы можно:

Ошибка

Если правой кнопкой мыши нажать на значок Crypto+DE, а затем «Выбрать сертификат по умолчанию», то программа успешно предложит выбрать сертификат из установленных сертификатов. Но это действие ничего не решит, т.к. при подписании документа выскочило окно, которое оповещает о том, что сертификат по умолчанию не соответствует требованиям текущего режима КЭП.

Настройка CryptoDE для ЕГИССО

Итак, для решения данной проблемы необходимо немного поковыряться в настройках программы.

На этом настройка CryptoDE завершена. Все документы успешно подписываются и загружаются на портал в кабинете поставщика информации. Оставлю на всякий случай скриншот настроек, которые действуют у меня в данный момент. Если у Вас не заработало или что-то не получилось, можете смело написать в комментариях. Постараюсь всем помочь!

Источник

Частые проблемы при работе с электронной подписью

Рассмотрим проблемы, которые возникают при создании запроса на сертификат ключа проверки электронной подписи (ЭП), при установке или использовании сертификата.

Ознакомьтесь с видеоинструкцией
«Как выпустить ЭП через модуль «Полигон Про: Удостоверяющий центр»
или программу «Подпись Про»

Проблема 1. Неверные имя пользователя или пароль.

01

Решение: проверьте корректность логина и пароля указанного в настройках программы. Должен быть указан логин и пароль, который Вы используете для авторизации на сайте https://pbprog.ru.

02m

Проблема 2. При нажатии на кнопку «Запросить сертификат» возникают ошибки или не открывается программа КриптоПро.

Если у Вас установлена антивирусная программа «Avast» или «Антивирус Касперского», то данные программы достаточно временно отключить.

Если на компьютере установлены программыблокираторы, временно отключите их или в настройках программ отключите сканирование сетевого трафика (HTTPS-трафика).

В меню «Пуск» откройте «Панель управления», выберите раздел «Система и безопасность», откройте «Брандмауэр Windows»:

04m

Выберите пункт «Включение и отключение брандмауэра Windows»:

05m

В открывшемся окне отключите брандмауэр, нажмите «ОК»:

06m

Проблема 3. Не удается выполнить запрос на сертификат.

Решение: проверьте версию операционной системы (ОС).

Например, в программе «Подпись Про» нажмите кнопку 07. В окне «О Программе» нажмите кнопку «О системе…»:

pasted%20image%200

Проверьте версию операционной системы:

09

К сожалению на версии операционной системы отличной от Windows 10 невозможно выполнить запрос на сертификат из программы.

Для продолжения операции выпуска сертификата обратитесь в отдел технической поддержки по номеру 8 (800) 100-58-90.

Также Вы можете обновить свою операционную систему до Windows 10 или воспользоваться другим компьютером с уже установленной версией ОС.

Проблема 4. При создании запроса на сертификат в КриптоПро CSP отсутствует биологический датчик случайных чисел и не удается сформировать контейнер закрытого ключа. Вместо окна биологического датчика случайных чисел открылось окно:

10

Решение: добавить биологический датчик случайных чисел.

Для добавления биологического датчика ДСЧ запустите программу КриптоПро CSP от имени администратора. Перейдите на вкладку «Оборудование» и нажмите кнопку «Настроить ДСЧ»:

11

12

В открывшемся окне нажмите «Далее». В окне «Выбор ДСЧ» выберите «Биологический ДСЧ» и нажмите кнопку «Далее»:

13

Задайте имя добавляемого ДСЧ или оставьте по умолчанию, нажмите «Далее» и «Готово».

14

В окне «Управление датчиками случайных чисел» появится «Биологический ДСЧ».

15

16

Проблема 5. Ошибки при работе с полученным сертификатом: при подписании или при проверке подлинности сертификата.

Запустите программу КриптоПро CSP и на вкладке «Общие» проверьте срок действия.

17

Если в поле «Срок действия» указано «Истекла», то необходимо приобрести лицензию на программу либо ввести лицензионный ключ при наличии такового.

1. Через модуль «Удостоверяющий центр» или через программу «Подпись Про». Для этого на ленте на вкладке «Главная» нажмите кнопку
18:

pasted%20image%200 2

2. Вручную. Для этого:

— Скачайте корневые сертификаты:

Корневой сертификат УЦ ООО «ПРОГРАММНЫЙ ЦЕНТР» (действует с 19.10.2016 по 19.10.2026)

Корневой сертификат УЦ ООО «ПРОГРАММНЫЙ ЦЕНТР» (действует с 06.04.2018 по 06.04.2027)

Корневой сертификат УЦ ООО «ПРОГРАММНЫЙ ЦЕНТР» (для ЭП, выпущенных по ГОСТ Р 34.10-2012 с 01.01.2019) (с 26.09.2018 по 26.09.2033)

Корневой сертификат УЦ ООО «ПРОГРАММНЫЙ ЦЕНТР» (ГОСТ Р 34.10-2012, для ЭП с 15.10.2019 по 13.08.2020) (с 26.07.2019 по 26.07.2034)

Корневой сертификат УЦ ООО «ПРОГРАММНЫЙ ЦЕНТР» (ГОСТ Р 34.10-2012, для ЭП с 13.08.2020) (с 13.07.2020 по 13.07.2035)

— Нажмите правой кнопкой мыши по одному из сертификатов и выберите «Установить сертификат»:

19

В появившемся окне нажмите «Далее»:

Снова нажмите «Далее»:

Нажмите на кнопку «Готово»:

Выполните аналогичные действия для других скачанных сертификатов.

— Откройте меню «Пуск» и в папке «КРИПТО-ПРО» запустите «Сертификаты».

— В открывшемся окне раскройте ветку Сертификаты → текущий пользовательПромежуточные центры сертификацииРеестрСертификаты.

Найдите сертификаты «Головной удостоверяющий сертификат» и «Минкомсвязь России», зажав левую кнопку мыши, перетащите их в ветку «Доверенные корневые центры сертификации».

На предупреждение о безопасности ответьте «Да».

Для этого скачайте нужную версию и установите ее (подробнее см. инструкцию по установке):

Проверьте актуальность версии программы одним из способов:

— В стартовом окне Полигон Про нажмите в правом верхнем углу кнопку 26«Настройка и управление Полигон Про» и в выпадающем списке выберите 27.

— В любом программном модуле в левом верхнем углу нажмите кнопку 28и в открывшемся меню выберите 29.

— В любом программном модуле на «Ленте» перейдите на вкладку «Помощь» и нажмите на кнопку 30.

В окне «О программе» сравните версию программы с версией, указанной в карточке товара.

pasted%20image%200 3

Проблема 6. Если Вы выпускали электронную подпись до 01.07.2022 и не удается войти в личный кабинет на сайте Удостоверяющего центра ООО «ПРОГРАММНЫЙ ЦЕНТР». Например, возникает следующая ошибка:

32m

Для этого в окне «Свойства браузера» на вкладке «Безопасность» добавьте в список «Надежные сайты» адрес: https://ra.pbprog.ru.

33

34

Для зоны «Надежные сайты» разрешите запуск ActiveX приложений.

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

35

36

Для этого в окне «Свойства браузера» на вкладке «Конфиденциальность» уберите галочку с поля «Включить блокирование всплывающих окон».

37

Для этого в окне «Свойства браузера» на вкладке «Дополнительно» установите галочки в полях: «SSL 2.0», «SSL 3.0», «TLS 1.0», «Использовать TLS 1.1» и «Использовать TLS 1.2».

38

Если у Вас установлена антивирусная программа «Avast» или «Антивирус Касперского», то данные программы достаточно временно отключить.

Если на компьютере установлены программыблокираторы, временно отключите их или в настройках программ отключите сканирование сетевого трафика (HTTPS-трафика).

В меню «Пуск» откройте «Панель управления», выберите раздел «Система и безопасность», откройте «Брандмауэр Windows»:

08mini

Выберите пункт «Включение и отключение брандмауэра Windows»:

09mini

В открывшемся окне отключите брандмауэр, нажмите «ОК»:

10mini

Проблема 7. При выборе сертификата, который был выпущен до 01.07.2022, в личном кабинете на сайте Удостоверяющего центра ООО «ПРОГРАММНЫЙ ЦЕНТР» возникает ошибка:

new 1

Решение: обновите или скачайте и установите «КриптоПро CSP» версии 4.0.9969. Скачать программу можно с официального сайта.

Проблема 8. При аннулировании или приостановке действия сертификата ЭП, который был выпущен до 01.07.2022, окно отзыва или приостановления не закрывается автоматически или страница сайта не обновляется.

new 2

Решение: скачайте и установите плагин «КриптоПро ЭЦП browser plug-in». Скачать плагин можно с официального сайта или с сайта Программного центра (>» href=»https://pbprog.ru/upload/download/files/cadesplugin.exe»>скачать).

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

39m

40

Когда специалист будет подключаться к Вам, разрешите доступ к вашему компьютеру. Нажмите кнопку «Разрешить».

41

02

03

Для зоны «Надежные сайты» разрешите запуск ActiveX приложений.

04

05

Отключите блокирование всплывающих окон.

06

07

Если у Вас установлена антивирусная программа «Avast» или «Антивирус Касперского», то данные программы достаточно временно отключить.

Если на компьютере установлены программыблокираторы, временно отключите их или в настройках программ отключите сканирование сетевого трафика (HTTPS-трафика).

В меню «Пуск» откройте «Панель управления», выберите раздел «Система и безопасность», откройте «Брандмауэр Windows»:

08mini

Выберите пункт «Включение и отключение брандмауэра Windows»:

09mini

В открывшемся окне отключите брандмауэр, нажмите «ОК»:

10mini

Проблема 2. Не удается выполнить запрос на сертификат.

Решение: проверьте версию операционной системы (ОС).

Например, в программе «Полигон Про» нажмите на кнопку 34. В окне «О Программе» нажмите кнопку «О системе…»:

12

Проверьте версию операционной системы:

13

Если на компьютере установлена Windows XP, обновите версию ОС или воспользуйтесь другим компьютером с операционной системой Windows 7 или выше.

Внимание! Windows XP снята компанией Microsoft с поддержки в 2014 г. (информация с официального сайта Мicrosoft), т.е. для нее не выходят обновления безопасности, что делает уязвимой как саму ОС, так и Ваши данные.

Проблема 3. При создании запроса на сертификат в КриптоПро CSP отсутствует биологический датчик случайных чисел и не удается сформировать контейнер закрытого ключа. Вместо окна биологического датчика случайных чисел открылось окно:

14

Решение: добавить биологический датчик случайных чисел.

Для добавления биологического датчика ДСЧ запустите программу КриптоПро CSP от имени администратора. Перейдите на вкладку «Оборудование» и нажмите кнопку «Настроить ДСЧ»:

15

16

В открывшемся окне нажмите «Далее». В окне «Выбор ДСЧ» выберите «Биологический ДСЧ» и нажмите кнопку «Далее»:

17

Задайте имя добавляемого ДСЧ или оставьте по умолчанию, нажмите «Далее» и «Готово».

18

В окне «Управление датчиками случайных чисел» появится «Биологический ДСЧ».

19

19 2

Проблема 4. Ошибки при работе с полученным сертификатом: при подписании или при проверке подлинности сертификата.

Запустите программу КриптоПро CSP и на вкладке «Общие» проверьте срок действия.

20

Если в поле «Срок действия» указано «Истекла», то необходимо приобрести лицензию на программу либо ввести лицензионный ключ при наличии такового.

1. Через модуль «Удостоверяющий центр» или через программу «Подпись Про». Для этого на ленте на вкладке «Главная» нажмите кнопку 21:

22mini

2. Вручную. Для этого:

— Нажмите правой кнопкой мыши по скачанному файлу и выберите «Установить сертификат»:

23mini

В появившемся окне нажмите «Далее»:

Снова нажмите «Далее»:

Нажмите на кнопку «Готово»:

— Откройте меню «Пуск» и в папке «КРИПТО-ПРО» запустите «Сертификаты».

27

— В открывшемся окне раскройте ветку Сертификаты – текущий пользователь – Промежуточные центры сертификации – Реестр – Сертификаты, найдите сертификат «Головной удостоверяющий сертификат» и, зажав левую кнопку мыши, перетащите его в ветку «Доверенные корневые центры сертификации».

28mini

На предупреждение о безопасности ответьте «Да».

29

Для этого скачайте требуемую версию и установите ее (подробнее см. инструкцию по установке).

Проверьте актуальность версии программы одним из способов:

— В стартовом окне Полигон Про нажмите в правом верхнем углу кнопку 30«Настройка и управление Полигон Про» и в выпадающем списке выберите 34.

— В любом программном модуле в левом верхнем углу нажмите на кнопку 32и в открывшемся меню выберите 33.

— В любом программном модуле на «Ленте» перейдите на вкладку «Помощь» и нажмите на кнопку 34.

В окне «О программе» сравните версию программы с версией, указанной в карточке товара.

35

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

Авторизуйтесь в личном кабинете на сайте pbprog.ru;

Слева перейдите в пункт меню «Предварительная запись» и выберите пункт «Техподдержка: Удаленный доступ»;

36mini

Скачайте и установите программу TeamViewer 9 версии;

В таблице сеансов удаленного доступа выберите любое удобное для Вас время для подключения специалиста (время московское) и запишитесь на сеанс удаленного доступа, указав необходимые для записи данные (обязательно опишите проблему);

За пять минут до начала сеанса запустите программу TeamViewer, позвоните в отдел технической поддержки по бесплатному номеру 8-800-100-58-90 и сообщите 9 цифр ID, необходимых для подключения.

37

Примечание: как использовать программу TeamViewer читайте на форуме (сообщение №5 «2.Управление Вашим компьютером через Интернет»).

Источник

Смешанный (клиент/сервер) алгоритм формирования цифровой подписи xmlDsig на основе CryptoPro Browser Plugin

На хабре уже была обзорная статья о механизмах создания ЭЦП в браузере, где было рассказано о связке Крипто-Про CSP +их же плагин к браузерам. Как там было сказано, предварительные требования для работы — это наличие CryptoPro CSP на компьютере и установка сертификата, которым собираемся подписывать. Вариант вполне рабочий, к тому же в версии 1.05.1418 плагина добавлена работа с подписью XMLDsig. Если есть возможность гонять файлы на клиент и обратно, то для того, чтобы подписать документ на клиенте, достаточно почитать КриптоПрошную справку. Все делается на JavaScript вызовом пары методов.
Однако, что если файлы лежат на сервере и хочется минимизировать трафик и подписывать их, не гоняя на клиент целиком?
Интересно?
Итак, клиент/серверный алгоритм формирования цифровой подписи XMLDSig.
Информацию об спецификации по XMLDsig можно найти по адресу тут.
Я буду рассматривать формирование enveloping signature (обворачивающей подписи) для xml-документа.
Простой пример подписанного xml:

Чтобы лучше понять, что из себя представляет enveloping signature, предлагаю краткий перевод описания тэгов из спецификации:

Итак, исходные данные:

Код на C#, который заработал в моем случае:

Шаг №3.
Берем хэш от канокализированного SignedInfo.
Тут возможны 2 варианта-серверный и клиентский.
3.1) Взятие хэша на клиенте. Именно его я использую, так что опишу его первым:
На сервере кодируем канокализированный SignedInfo в base64
C#:
и отправляем эти данные на клиент.
На клиенте берем хэш с помощь криптопрошного плагина
JavaScript:

Посмотреть хэш можно с помощью hashObject.Value
3.2)Считаем хэш на сервере и отправляем на клиент. Этот вариант у меня так и не заработал, но честно сказать я особо и не пытался.

Возможно хэш надо преобразовывать в base64.

Отправляем на клиент, там используем

Именно на методе hashObject.SetHashValue у меня падала ошибка. Разбираться я не стал, но криптопрошном форуме говорят, что можно как-то заставить ее работать.

Если соберетесь реализовывать серверный алгоритм генерации хэша, то вот пара полезных советов:
1) Посчитайте хэш на клиенте и на сервере от пустой строки. он должен совпадать, это значит ваши алгоритмы одинаковые.
Для GOST3411 это следующие значения:
base64: mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=
hex: 98 1e 5f 3c a3 0c 84 14 87 83 0f 84 fb 43 3e 13 ac 11 01 56 9b 9c 13 58 4a c4 83 23 4c d6 56 c0
2) Добейтесь, чтобы у вас совпадали хэши для произвольных данных, генерируемые на клиенте и на сервере.
После этого можно пересылать клиенту только хэш от SignedInfo вместо всего SignedInfo.

Шаг №4.(клиент)
Генерируем SignatureValue и отсылаем на сервер SignatureValue и информацию о сертификате

Возвращем на сервер binReversedSignatureString и certValue.

Код функций из utils не выкладываю. Мне его подсказали на форуме криптоПро и его можно посмотреть в этой теме

Шаг №5. (сервер)
Заменяем в сгенерированном на шаге №1 тэге Signature значения тэгов SignatureValue и X509Certificate значениями, полученными с клиента

Шаг №6. (сервер)
Верифицируем карточку.
Если верификация прошла успешно, то все хорошо. В результате мы получаем на сервере документ, подписанный клиентским ключом, не гоняя туда-обратно сам файл.

Примечание: если работа ведется с документом, уже содержащим подписи, то их надо отсоединить от документа до шага №1 и присоединить к документу обратно после шага №6

В заключение хочется сказать большое спасибо за помощь в нахождении алгоритма участникам форума КриптоПро dmishin и Fomich.
Без их советов я бы плюхался с этим в разы дольше.

Источник

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка вызова злиб гта 5 рп
  • Ошибка выведенная ручкой 6 букв сканворд
  • Ошибка вызова внешнего api
  • Ошибка выбранный диск имеет стиль разделов gpt

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии