Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Авторизация на сайте через API используя электронную подпись КриптоПро

Авторизация на сайте через API используя электронную подпись КриптоПро
Я
   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Строка(ПодписанныеДанные);
 
 
   Garykom
 
1 - 31.10.18 - 14:03
(0) Эээ а в курсе что даже два последовательных "подписания" одной строки дадут слегка разный результат?

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

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

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

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

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

Честно говоря не понимаю как указывать параметры кадес ком, например CADESCOM_CADES_BES = 1
   Garykom
 
12 - 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
Можно по аналогии пробовать
   Garykom
 
13 - 31.10.18 - 18:10
(12) У меня код кривой совсем ибо собран из обычной синхронной и асинхронных версий, ищи нормальный пример.
   NorthWind
 
14 - 31.10.18 - 18:15
(11) на 1С нет, на VBS могу дать рабочий пример, хотя, в принципе, он есть в переписке в (8) ближе к концу и там одна строчка удаляется (где TSAddress) и одна заменяется (метод Sign на SignCades).
   NorthWind
 
15 - 31.10.18 - 18:17
(10) нет, но особенных сложностей не вижу, все то же самое, только вместо Sign (SignCades) Verify (VerifyCades) использовать... Нет?
   Garykom
 
16 - 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


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

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

плюс проверка подписи через плагин как ее сделать. на VB все было хорошо. а вот через js тяжело. потому что примера нет. Сейчас используется акинхронный js а примера как произвести проверку не имеется.
   Garykom
 
19 - 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/
   Garykom
 
22 - 31.10.18 - 21:49
(21) Да пофиг с чем столкнулся, проблема что скоро еще много кто столкнется с подобными извратами.
   NorthWind
 
23 - 01.11.18 - 08:20
(20) проблема вызов SignCades поменять на VerifyCades?
   NorthWind
 
24 - 01.11.18 - 10:10
(18) мы о чем говорим? Сервер linux, windows? Серверная лицензия крипто-про, кстати, ни разу не дешевая, на винду что-то около 40 тысяч стоит.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует