Имя: Пароль:
1C
1С v8
Авторизация на сайте через API используя электронную подпись КриптоПро
,
0 olezhan
 
31.10.18
13:58
Добрый день!

Столкнулся с такой проблемой, есть некий сайт со своим АПИ, с доступом по ЭЦП.

Для того что бы отправлять им документы требуется получить токен.

Что бы получить токен надо сделать сначала get запрос на сайт, в ответ получаешь два параметра UUID и Data (тип строка).

Собственно эту data надо подписать ЭЦП, затем завернуть в base64 и отправить им POST запросом.

Проблема кроется где то в момент подписания. Сам алгоритм подписания такой:

Для краткости ДД - Двоичные данные.

1) Эту data перевожу в двоичные данные
2)Создаю МенеджерКриптографии,указываю нужный сертификат (он там один)
3) Выполняю МенеджерКриптографии.Подписать(ДД).
4) Получаю подписанные ДД.
5) Используя функцию Base64Строка заворачиваю ДД в формат Base64.

Вроде как все логично, однако, полученная строка Base64 отличается от той же самой подписанной строки на сайте криптоПро. Отличается некоторыми символами, не целиком.

Вопрос: что происходит не так, и насколько можно доверять МенеджеруКриптографии 1С и функции Base64Строка ?

Кусок кода:
    ДД = ПолучитьДвоичныеДанныеИзСтроки(ДанныеДляПодписи);    
    
    ТипыСертификатов = Новый Массив;
    ТипыСертификатов.Добавить(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);

    Список = ПолучитьСписокСертификатов(75, ТипыСертификатов, Истина);
    Сертификат = Список[0];
    МенеджерКриптографии = Новый МенеджерКриптографии("", "", 75);
    МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ТутПравильныйПароль;
    //МенеджерКриптографии.ВключениеСертификатовВПодпись = РежимВключенияСертификатовКриптографии.НеВключать;
    ПодписанныеДанные = МенеджерКриптографии.Подписать(ДД, Сертификат);
    
    //ПодписанныеДанные = ПолучитьСтрокуИзДвоичныхДанных(ПодписанныеДанные);
    
    ПодписанныеДанные = Base64Строка(ПодписанныеДанные);
1 Garykom
 
гуру
31.10.18
14:03
(0) Эээ а в курсе что даже два последовательных "подписания" одной строки дадут слегка разный результат?

Обычно в "подпись" еще дата/время и часто некие параметры компа включаются.
2 Garykom
 
гуру
31.10.18
14:04
(1)+ Точнее все зависит от алгоритма/стандарта подписи.
3 olezhan
 
31.10.18
16:33
Да в курсе, однако на сайте плагина крипто про как минимум первые 30 символов всегда одинаковые, даже если я просто цифру 1 подписываю. Алгоритм у сертификата только один, другими он подписывать не умеет.

Я стал склонятся у мысли что при подписи из 1С не включаются сами данные в подпись.

Из СП: В данные подписи исходный файл не включается.

Хотелось бы вообще услышать от кого то что да так можно подписать данные или что из 1С так подписать их не получиться и придется тогда городить что то с CaDEScom
4 NorthWind
 
31.10.18
16:38
(3) речь не про алгоритм сертификата, а про алгоритм подписи. Например, это может быть CADES-BES (без штампа времени) или CADES-T (со штампом), затем, исходное сообщение в сообщении подписи может быть, а может и не быть, затем, сообщение может быть в кодировке DER, а может быть в BASE64. Нужно знать точные техданные к подписи. Или тыкать все возможные варианты, пока сервис не сожрет (так я тоже делал).
5 asady
 
31.10.18
16:41
(0) я бы попробовал в таком случае заюзать другие библиотеки
Команду системы в 1С пока не отменили
6 NorthWind
 
31.10.18
16:41
(3) + на сайте (если вы криптопрошный пример имеете в виду) CADES-T подписывает. Вы уверены что вам именно он нужен? Вам тогда к крипто-про CSP еще нужно будет клиента штампов времени подкупить, там отдельная лицензия.
7 NorthWind
 
31.10.18
16:46
(5) можно проще - поставить плагин CryptoPro для сайтов и дальше через COM. Там есть COM-объект CADESCOM для этого
8 NorthWind
 
31.10.18
16:48
Дарю мою переписку на форуме крипто-про, возможно, поможет:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=10684
9 olezhan
 
31.10.18
17:21
(4) А можно поподробнее про алгоритмы подписи. Его можно указать где то в 1С?

Мне нужна именно подпись CADES-BES
10 Еврейчик
 
31.10.18
17:23
(8)ты случайно не занимался проверкой подписи на сервере?
11 olezhan
 
31.10.18
17:35
(7) Плагин стоит. А есть хоть какой-то рабочий пример работы с кадеском из 1С?

Честно говоря не понимаю как указывать параметры кадес ком, например CADESCOM_CADES_BES = 1
12 Garykom
 
гуру
31.10.18
18:05
oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
oSigner.propset_Certificate(oCertificate);

oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
oSignedData.propset_Content(dataToSign);

sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES);

Примерно так, примеры на js есть тут
http://cpdn.cryptopro.ru/content/cades/plugin-samples.html
Можно по аналогии пробовать
13 Garykom
 
гуру
31.10.18
18:10
(12) У меня код кривой совсем ибо собран из обычной синхронной и асинхронных версий, ищи нормальный пример.
14 NorthWind
 
31.10.18
18:15
(11) на 1С нет, на VBS могу дать рабочий пример, хотя, в принципе, он есть в переписке в (8) ближе к концу и там одна строчка удаляется (где TSAddress) и одна заменяется (метод Sign на SignCades).
15 NorthWind
 
31.10.18
18:17
(10) нет, но особенных сложностей не вижу, все то же самое, только вместо Sign (SignCades) Verify (VerifyCades) использовать... Нет?
16 Garykom
 
гуру
31.10.18
18:57

// sThumbprint - отпечаток сертификата, используемого для подписи; строка, представляющая отпечаток в шестандцатеричном виде

Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint)

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

ТекстДляПодписи = СокрЛП(ТекстДляПодписи);
oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData"); // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.
oSignedData.Content = СокрЛП(ТекстДляПодписи);
CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи
bDetached = Ложь;
EncodingType = 0;
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType); // Метод добавляет к сообщению усовершенствованную подпись.

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

КонецФункции
17 Garykom
 
гуру
31.10.18
18:57
18 Еврейчик
 
31.10.18
19:03
(15)меня интересует как установить на сервер нужный софт. нужно ведь Крипто про CSP установить на сервер. плюс пакет для доступа к крипто АПИ. А на форуме так плохо все обсуждено на эту тему.

плюс проверка подписи через плагин как ее сделать. на VB все было хорошо. а вот через js тяжело. потому что примера нет. Сейчас используется акинхронный js а примера как произвести проверку не имеется.
19 Garykom
 
гуру
31.10.18
19:05
20 Еврейчик
 
31.10.18
20:10
(19)это создание подписи. а проверки подписи там нет. исползуя асинхронный
21 Символ
 
31.10.18
21:30
(0) Кажется. что автор столкнулся с маркировкой табака. А сайт - это сервис эксперимента по маркировке табака. https://xn--80ajghhoc2aj1c8b.xn--p1ai/business/projects/6/
22 Garykom
 
гуру
31.10.18
21:49
(21) Да пофиг с чем столкнулся, проблема что скоро еще много кто столкнется с подобными извратами.
23 NorthWind
 
01.11.18
08:20
(20) проблема вызов SignCades поменять на VerifyCades?
24 NorthWind
 
01.11.18
10:10
(18) мы о чем говорим? Сервер linux, windows? Серверная лицензия крипто-про, кстати, ни разу не дешевая, на винду что-то около 40 тысяч стоит.
25 FDK2017
 
11.01.19
10:56
(0) Добрый день.

Можете поделиться итогом? получилось ли? Сейчас также нужно "data подписать ЭЦП, затем завернуть в base64 и отправить им POST запросом", но приходит ответ
""error":"unauthorized","error_description":"Full authentication is required to access this resource""
26 bootini
 
03.04.19
17:10
(25) кто решил?
27 bootini
 
03.04.19
17:11
та же хрень:
""error":"unauthorized","error_description":"Full authentication is required to access this resource""
28 dezss
 
03.04.19
17:26
Код показывай.
В (0) почему-то не указывается явно МенеджерКриптографии.АлгоритмПодписи