Имя: Пароль:
1C
1C 7.7
v7: API честный знак
0 Mafiozaa
 
15.02.21
05:24
Приветствую, получаю от Честного знака токен методом GET {"uuid":"d12b8e68-a2f8-48a2-sdcb-a3b632cbb270","data":"JLZTXJTMFXCXUUAFYQKHZOIQSAUXKC"}
    Соеденение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Соеденение.Option(2,"utf-8");
    Соеденение.SetTimeouts(0,0,0,0);
    URL = "https://ismp.crpt.ru/api/v3/auth/cert/key";;
    Соеденение.Open("GET", URL, 0);
    Соеденение.SetRequestHeader("Content-Type", "application/json");
    Соеденение.SetRequestHeader("Accept-Charset", "utf-8");
    Соеденение.Send();
(Вот так получаю)

Мне для дальнейших действий я так понял, нужно его подписать и отправить методом POST
        Соеденение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Соеденение.Option(2,"utf-8");
    Соеденение.SetTimeouts(0,0,0,0);
    URL = "https://ismp.crpt.ru/api/v3/auth/cert";;
    Соеденение.Open("POST", URL, 0);
    Соеденение.SetRequestHeader("Content-Type", "application/json");
    Соеденение.SetRequestHeader("Accept-Charset", "utf-8");
        Соеденение.Send();
    RequestTimeout = 40;
(Вот так отправляю, ошибка <UnauthorizedException><error>unauthorized</error><error_description>Full authentication is required to access this resource</error_description></UnauthorizedException>)
Я полагаю что я не авторизовался
1 Mafiozaa
 
15.02.21
05:26
Я не совсем понял, но мне нужно полученные uuid и data отправить обратно подписаными?
2 ДенисЧ
 
15.02.21
05:32
А где у тебя в отправке вообще токен?
3 Mafiozaa
 
15.02.21
05:36
(2) Вот, собственно куда мне его толкнуть?
4 big
 
15.02.21
06:16
ДанныеЗапроса = Подписанные вашим ЭЦП данные;
ТекстЗапроса = "{""uuid"":"""+СокрЛП(СессияUuid)+""",""data"":""" + ДанныеЗапроса + """}";

Соеденение.Send(ТекстЗапроса);


Примерно так. Но я давно с этим разбирался, вроде работало.
5 big
 
15.02.21
06:17
(4) СессияUuid - это из запроса key полученной пары uuid/data
6 lenkavovka
 
15.02.21
06:33
Приведу вымученный код для восьмёрки, чтобы было понимание, как разговаривать с ЧЗ. Предполагается, что сертификат ЭЦП, которым подписываем запросы, установлен на сервере и прописан в 1С, плюс прописан в настройках обмена с ИС МП:

&НаСервере
Функция ПолучитьТокен(Организация) Экспорт
    
    СертификатДляОбмена = ПолучитьСертификатОрганизацииИзНастроек(Организация);
    
    Если НЕ СертификатДляОбмена.Отпечаток = Неопределено Тогда
        
        Сертификат = НайтиСертификатПоОтпечаткуСтр(СертификатДляОбмена.Отпечаток);
        
        // Получение данных для получения токена
        HTTPСоединение =    Новый HTTPСоединение(ДанныеПодключенияЧестныйЗнак().АдресСервера, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
        HTTPЗапрос = новый HTTPЗапрос("/api/v3/auth/cert/key");
        HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
        ОтветСтрока = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8");
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(ОтветСтрока);
        ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        УИД = ДанныеJSON.uuid;
        ДанныеДляПолученияТокена = ДанныеJSON.data;
        
        // Подписание данных для получения токена
        ДанныеДляПолученияТокена = ПодписатьТекст(ЗашифроватьBase64(ДанныеДляПолученияТокена, КодировкаТекста.UTF8), Сертификат, Ложь);
        
        // Получение токена с использованием подписанных данных
        Соединение = Новый HTTPСоединение(ДанныеПодключенияЧестныйЗнак().АдресСервера, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
        Заголовки = Новый Соответствие;
        Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8");
        Заголовки.Вставить("Accept", "application/json");
        HTTPЗапрос = Новый HTTPЗапрос("/api/v3/auth/cert/",Заголовки);
        ЗаписьJOIN = Новый ЗаписьJSON;
        ЗаписьJOIN.УстановитьСтроку();
        ДанныеДляЗапроса = Новый Структура;
        ДанныеДляЗапроса.Вставить("uuid",УИД);
        ДанныеДляЗапроса.Вставить("data",ДанныеДляПолученияТокена);    
        ЗаписатьJSON(ЗаписьJOIN,ДанныеДляЗапроса);
        СтрокаДляЗапроса = ЗаписьJOIN.Закрыть();
        
        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
        Если Ответ.КодСостояния = 200 Тогда
            
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            
            Токен = ПрочитатьJSON(ЧтениеJSON, Ложь).token;
            
            Возврат Новый Структура("Токен, ТекстОшибки", Токен, "");
            
        Иначе
            
            Возврат Новый Структура("Токен, ТекстОшибки", Неопределено, "Ошибка получения токена. Код ответа: " + Ответ.КодСостояния + ".");    
        
        КонецЕсли;
        
    Иначе
        
        Возврат Новый Структура("Токен, ТекстОшибки", Неопределено, СертификатДляОбмена.ТекстОшибки);
        
    КонецЕсли;
    
КонецФункции



&НаСервере
Функция ПолучитьСертификатОрганизацииИзНастроек(Организация) Экспорт
    
    ХранилищеЗначения = Константы.НастройкиОбменаГосИС.Получить();
    СохраненныеНастройки = ХранилищеЗначения.Получить();
    
    НайденнаяСтрока = СохраненныеНастройки.Найти(Организация, "Организация");
    
    Если НайденнаяСтрока = Неопределено Тогда
        
        Отпечаток = Неопределено;
        ТекстОшибки = "Сертифкат для " + Организация + " не найден в настройках сертификатов для автоматического обмена с ИС МП";
                
    Иначе
        
        Отпечаток = НайденнаяСтрока.Сертификат.Отпечаток;
        ТекстОшибки = "";
        
    КонецЕсли;
    
    Возврат Новый Структура("Отпечаток, ТекстОшибки", Отпечаток, ТекстОшибки);
    
    
КонецФункции


&НаСервере
Функция НайтиСертификатПоОтпечаткуСтр(ОтпечатокСтр) Экспорт
    //Поиск доступных сертификатов
    CAPICOM_CURRENT_USER_STORE = 2;
    //2 - Искать сертификат в ветке "Личное" хранилища.
    CAPICOM_MY_STORE = "My";
    // Указываем, что ветку "Личное" берем из хранилища текущего пользователя
    CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение
    oStore = Новый COMОбъект("CAdESCOM.Store"); // Объект описывает хранилище сертификатов
    
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
    CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов

    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, СтрЗаменить(Строка(Base64Значение(ОтпечатокСтр)), " ", ""));
    Возврат Certificates.Item(1);
КонецФункции


&НаСервере
// ТекстДляПодписи должен быть в Base64
// bDetached - Истина/Ложь - откреплённая(для подписания документов)/прикреплённая(для получения токена авторизации) подпись
Функция ПодписатьТекст(ТекстДляПодписи, Certificate, bDetached) Экспорт
    CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64
    CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
    CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи
    oSigner = Новый COMОбъект("CAdESCOM.CPSigner");
    // Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.
    oSigner.Certificate = Certificate;
    oSigner.KeyPin = "123"; //пароль, с которым сертификат установлен на сервер. если пароля нет - комментируем строку
    oSigningTimeAttr = Новый COMОбъект("CAdESCOM.CPAttribute");
    oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
    oSigningTimeAttr.Value = ТекущаяДата();
    oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
    ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
    oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
    // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = СокрЛП(ТекстДляПодписи);
    EncodingType = 0;
    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);
    // Метод добавляет к сообщению усовершенствованную подпись.
    Возврат sSignedMessage; // Подпись в формате Base64
КонецФункции


&НаСервере
Функция ЗашифроватьBase64(Строка, Кодировка) Экспорт
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, Кодировка);
    ЗаписьТекста.Записать(Строка);
    ЗаписьТекста.Закрыть();
    Двоичные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    Результат = Base64Строка(Двоичные);
    Если Лев(Результат, 4) = "77u/" Тогда
        Результат = Сред(Результат, 5);
    КонецЕсли;
    Результат = СтрЗаменить(Результат, Символы.ПС, "");
    УдалитьФайлы(ИмяВременногоФайла);
    Возврат Результат;
КонецФункции
7 Mafiozaa
 
15.02.21
06:36
(6) Ну да, в 8ки я его загружаю в базу, а в 7ке надо ручками его цеплять, я так понял)
8 lenkavovka
 
15.02.21
06:43
(7) здесь ключевая идея - сначала получаем от ЧЗ некий uuid, потом включаем его в запрос токена, запрос подписываем своим сертификатом, запрашиваем токен. Посмотри внимательно на функцию ПодписатьТекст() во втором слайдере.
9 Mafiozaa
 
15.02.21
06:45
(8) Без руководства не разберусь, полез искать, спасибо)
10 big
 
15.02.21
06:55
(9) Получается ты вообще не в теме что-ли??

Воюшмать! (с)
11 big
 
15.02.21
06:57
(10) Теперь понятно, что ответ на (2) был для него и не ответ в принципе ))))
12 Mafiozaa
 
15.02.21
06:59
(11) Ответ то ответ, я знаю что мне нужно полученное подписать и отправить далее, отправить отправлю, подписать нужно, буду искать вк на крипто
13 big
 
15.02.21
07:19
(12) В (6) уже всё есть, для подписывания в 7.7 не нужна ВК, хватает доступа к уже имеющимся объектам. В (3) вопрос был - куда токен воткнуть, вот и я показал )))
14 Mafiozaa
 
15.02.21
07:30
(13) Прогнал, увидел вот это, я так полагаю это объекты моих сертификатов
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
OLE.ICertificate2
15 big
 
15.02.21
07:41
Функция ПолучитьСписокСертификатов()
    РезСписок    = СоздатьОбъект("СписокЗначений");
    comStore        = СоздатьОбъект("CAdESCOM.Store");
    comStore.Open(
        2,        // StoreLocation - CAPICOM_CURRENT_USER_STORE.
        "MY",    // StoreName
        );        // OpenMode - CAPICOM_STORE_OPEN_READ_ONLY.
    comCertificates = comStore.Certificates;
    comStore.Close();
    comStore = "";
    КоличествоСертификатов = comCertificates.Count;
    
    ТекДата    = ТекущаяДата();
    
    фл = 0;
    Для a=1 По КоличествоСертификатов Цикл
        Объект    = comCertificates.Item(a);
        
        Субъект        = Объект.SubjectName;
        ДатаНачало    = Объект.ValidFromDate;
        ДатаКонец    = Объект.ValidToDate;
        
        Если ДатаКонец < ТекДата Тогда
            Продолжить;
        КонецЕсли;
        Список    = РазложитьСубъекта(Субъект);
        ИНН        = Список.Получить("ИНН");
        Если ПустаяСтрока(ИНН) = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        СерийныйНомер    = Объект.SerialNumber;
        Отпечаток        = Объект.Thumbprint;
        Наименование    = Список.Получить("CN");
        РезСписок.ДобавитьЗначение(Отпечаток,Наименование+": "+ДатаКонец);
    КонецЦикла;
    Возврат РезСписок;
КонецФункции
16 Mafiozaa
 
15.02.21
07:52
(15) С CADESCOM почему то не идет, а CAPICOM показывает то же самое)
17 big
 
15.02.21
07:53
(16) КриптоПро ессно должен быть установлен.
18 Mafiozaa
 
15.02.21
07:53
(17) Все есть, все работает)
19 Mafiozaa
 
15.02.21
07:54
(17) С CADESCOM ругается на метод Open, якобы Поле агрегатного не обнаружено
20 big
 
15.02.21
07:54
(19) Хмм.. оччень странно.
21 big
 
15.02.21
07:59
(20) Прикол, но у меня тоже перестало работать (((
22 Mafiozaa
 
15.02.21
07:59
(20) CADESCOM = comStore.Open(
{C:\USERS\DMITRIY\DESKTOP\SQL-БАЗА\EXTFORMS\HTTP_ЗАПРОС.ERT(69)}: Поле агрегатного объекта не обнаружено (Open)
CAPICOM = в цикле пробегаюсь получаю OLE.ICertificate2 я так думаю = колву моих сертификатов
23 big
 
15.02.21
08:02
24 big
 
15.02.21
08:20
с CAPICOM работает.
25 Mafiozaa
 
15.02.21
08:52
(24) Вроде подразобрался малость, как мне выбрать сертификат которым подписывать?
26 Mafiozaa
 
15.02.21
08:52
(24) Из общей кучи, выбрать нужный
27 big
 
15.02.21
09:06
(25) А какой объект заработал? Cadescom или CAPICOM?

(26) Там же список, значение списка - отпечаток ключа, строка в списке - владелец + дата окончания. Выбирая из списка, получаешь отпечаток ключа, его подставляешь при подписывании.
28 Mafiozaa
 
15.02.21
09:09
(24) РезСписок вижу, а просто список не вижу, такая же сз?
29 Mafiozaa
 
15.02.21
09:09
(27) И что за функция разложить субьъекта?
30 big
 
15.02.21
09:23
(25) А какой объект заработал? Cadescom или CAPICOM?

(26) Там же список, значение списка - отпечаток ключа, строка в списке - владелец + дата окончания. Выбирая из списка, получаешь отпечаток ключа, его подставляешь при подписывании.

(29) Там просто из строки наименования берем названия, инн и т.п.

Функция РазложитьСубъекта(Субъект)
    Результат    = СоздатьОбъект("СписокЗначений");
    Результат.ДобавитьЗначение(Субъект,"субъект");
    
    ВремСтрока    = СтрЗаменить(Субъект,",",РазделительСтрок);
    Для а=1 По СтрКоличествоСтрок(ВремСтрока) Цикл
        ТекСтр    = СокрЛП(СтрПолучитьСтроку(ВремСтрока,а));
        ТекСтр    = СтрЗаменить(ТекСтр,"=",РазделительСтрок);
        Результат.ДобавитьЗначение(СокрЛП(СтрПолучитьСтроку(ТекСтр,2)),СокрЛП(СтрПолучитьСтроку(ТекСтр,1)));
    КонецЦикла;
    Возврат Результат;
КонецФункции // гл
31 big
 
15.02.21
09:23
(28) Да, просто выпадающий список на форме
32 Mafiozaa
 
15.02.21
09:25
(30) CAPICOM, но и то не все объекты подгружаются, щас буду смотреть
33 Mafiozaa
 
15.02.21
09:29
(31) Странно, ничего не попадает в список на форме
34 Mafiozaa
 
15.02.21
09:41
(31) Все попало, но нет наименования, а идет сразу D63489529FSDklsdfh23458sdklg
35 big
 
15.02.21
09:49
(34) скорее всего "разложение субъекта" некорректно работает
36 Mafiozaa
 
15.02.21
10:00
(35) Все, список эцп получаю корректно, мне как выбрать? обработку списка делать?
37 big
 
15.02.21
10:04
(36) Да как удобнее. Я при подписи просто беру текущий:
Отпечаток    = СпсСертификатов.ПолучитьЗначение(СпсСертификатов.ТекущаяСтрока());
38 Mafiozaa
 
15.02.21
10:08
(37) А если не затруднит, покажешь как ты подписываешь текст?
39 Mafiozaa
 
15.02.21
10:19
(37) oSigner.Certificate = Отпечаток;
{C:\USERS\DMITRIY\DESKTOP\SQL-БАЗА\EXTFORMS\HTTP_ЗАПРОС.ERT(157)}: Типы не совпадают
40 Санта Клаус
 
15.02.21
11:34
отмечусь, чтобы не потерять
41 MWWRuza
 
гуру
15.02.21
13:01
Я выкладывал обработку, которая из блока получает список пачек, под 7.7. Там все это есть.  Ищите по слову "разагрегация"... А... Вот она кстати: http://catalog.mista.ru/public/1241751/
42 DGorgoN
 
15.02.21
13:04
(41) Тем паче помоги автору раз сталкивался.
43 MWWRuza
 
гуру
15.02.21
13:11
У меня там рабочий пример. Скачать, проверить, если заработает - то все нормально, можно "ковырять" и переносить в свою поделку фрагменты... Код открыт. А если не заработает - тогда нужно с КриптоПро, капикомом, сертификатами разбираться.
Будут конкретные вопросы, отвечу... Многие запустили, и работает, судя по комментариям. А уж как перенести из моей обработки в свою задачу, готовые, работающие алгоритмы, это только автору этой задачи ведомо...
44 Mafiozaa
 
18.02.21
08:42
Поднимаю, ошибка та же
(37) oSigner.Certificate = Отпечаток;
{C:\USERS\DMITRIY\DESKTOP\SQL-БАЗА\EXTFORMS\HTTP_ЗАПРОС.ERT(157)}: Типы не совпадают
45 oskarsan
 
06.06.21
07:23
(44) тут нужен сертификат а не отпечаток

Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр)
    Рез = ""; // Найденный сертификат (Com-объект)
    CAPICOM_CURRENT_USER_STORE = 2;    //2 - Искать сертификат в ветке "Личное" хранилища.
    CAPICOM_MY_STORE = "My";// Указываем, что ветку "Личное" берем из хранилища текущего пользователя
    CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение
    //oStore = СоздатьОбъект("CAdESCOM.Store"); // иногда не работает
    oStore = СоздатьОбъект("CAPICOM.Store"); // Объект описывает хранилище сертификатов
    
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов
    // 1 вариант: поиск сертификата по отпечатку
    CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
    Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, ОтпечатокСтр);
    Рез = Certificates.Item(1);
    
    //2 вариант: обходом по коллекции и сравнение с отпечатком
    //Для Каждого ТекСертификат Из oStore.Certificates Цикл //цикл на 1с8
    //    ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде
    //    Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда Рез = ТекСертификат;
    //        Прервать;
    //    КонецЕсли;
    //КонецЦикла;
    oStore.Close(); // Закрыть хранилище сертификатов и освободить объект 61
    Возврат Рез;
КонецФункции


oSigner.Certificate = ПолучитьСертификатПоОтпечатку(Отпечаток);
46 Caesar
 
27.10.21
17:23
Прошу прощения за подъем достаточно давней темы.

При попытке подписания токена получаю сообщение:

sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);
{E:\BASES\V7\КОВАЛЕВА СВЕРТКА\ОБМЕН_С_ЧЕСТНЫЙЗНАК.ERT(134)}: Поле агрегатного объекта не обнаружено (SignCades)

Текст функции подписания -
// bDetached - Истина/Ложь - откреплённая(для подписания документов)/прикреплённая(для получения токена авторизации) подпись
Функция ПодписатьТекст(ТекстДляПодписи, СертификатДляПодписи, bDetached)    
    //ТекстДляПодписи - токен в формате Base64
    //СертификатДляПодписи - сертификат, полученный по отпечатку
    
    CADESCOM_BASE64_TO_BINARY = 1;// Входные данные пришли в Base64

    CADESCOM_CADES_TYPE = 1;// Тип усовершенствованной подписи

    CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;// Атрибут штампа времени подписи

    oSigner = СоздатьОбъект("CAdESCOM.CPSigner");
    // Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи.

    oSigner.Certificate = СертификатДляПодписи;
    //oSigner.KeyPin = "12345678";//пароль, с которым сертификат установлен на сервер. если пароля нет - комментируем строку

    oSigningTimeAttr = СоздатьОбъект("CAdESCOM.CPAttribute");
    oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
    oSigningTimeAttr.Value = ТекущаяДата();
    oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr);
    ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
    oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData");
    // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.

    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
    oSignedData.Content = СокрЛП(ТекстДляПодписи);
    EncodingType = 0;
    sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);   // ВОТ ТУТ ОШИБКА
    // Метод добавляет к сообщению усовершенствованную подпись.

    Возврат sSignedMessage;// Подпись в формате Base64

КонецФункции        

Цепочка сертификатов до доверенного КЦ выстроена.
Очень прошу помочь.
Заранее благодарен.