Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

7 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений_СК  
#11 Оставлено : 19 сентября 2018 г. 18:02:27(UTC)
Евгений_СК

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

Группы: Участники
Зарегистрирован: 17.09.2018(UTC)
Сообщений: 17
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Поблагодарили: 1 раз в 1 постах
Вот, что у меня получилось в итоге (возможно, кому-то пригодится):

// 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


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

//Отпечаток - строка HEX
Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр)

Рез = Неопределено; // Найденный сертификат (Com-объект)

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); // Открыть хранилище сертификатов

Для Каждого ТекСертификат Из oStore.Certificates Цикл

ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде
Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда
Рез = ТекСертификат;
Прервать;

КонецЕсли;


КонецЦикла;

oStore.Close(); // Закрыть хранилище сертификатов и освободить объект
Возврат Рез;


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


Если что сделал не так или не доделал, поправьте, пожалуйста, но данная подпись проходит проверку у нашего клиента.

thanks 1 пользователь поблагодарил Евгений_СК за этот пост.
Андрей * оставлено 19.09.2018(UTC)
Offline Евгений_СК  
#12 Оставлено : 19 сентября 2018 г. 18:14:52(UTC)
Евгений_СК

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

Группы: Участники
Зарегистрирован: 17.09.2018(UTC)
Сообщений: 17
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Поблагодарили: 1 раз в 1 постах
По коду вот какие вопросы остались:
1. не совсем понял, как для метода Open задавать значение второго параметра - нашел просто в примерах, что если хранилище текущего пользователя, то надо писать "My". Это какое-то фиксированное значение? А как указать, что хранилище - локального компьютера?
2. Как я понял, если шифровать не Cades Bes, а более защищенным вариантом Cades, то надо подключать службу локального времени. Как это правильно сделать?

Отредактировано пользователем 19 сентября 2018 г. 18:21:46(UTC)  | Причина: Не указана

Offline Евгений_СК  
#13 Оставлено : 19 сентября 2018 г. 18:52:35(UTC)
Евгений_СК

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

Группы: Участники
Зарегистрирован: 17.09.2018(UTC)
Сообщений: 17
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 8 раз
Поблагодарили: 1 раз в 1 постах
И еще: наши клиенты будут пользоваться, естественно, не тестовым сертификатом для подписи данных. Можете перечислить последовательность действий, которую необходимо выполнить пользователю, чтобы в итоге он мог пользоваться написанным мною кодом для подписи данных?
Offline two_oceans  
#14 Оставлено : 20 сентября 2018 г. 6:35:50(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Автор: Евгений_СК Перейти к цитате
1. не совсем понял, как для метода Open задавать значение второго параметра - нашел просто в примерах, что если хранилище текущего пользователя, то надо писать "My". Это какое-то фиксированное значение? А как указать, что хранилище - локального компьютера?
Как я понимаю, там было не совсем верное пояснение, все с точностью наоборот. Значение CAPICOM_CURRENT_USER_STORE как раз говорит что открывать нужно хранилища пользователя, а не компьютера. Соответственно надо смотреть в документации какой значение соответствует хранилищам компьютера (наугад 1). CAPICOM_MY_STORE говорит, что среди хранилищ пользователя (которые выбраны первым параметром) берем хранилище "Личные".
Пояснение: "My" это фиксированное нелокализованное имя хранилища, в локализованном на русский язык виде это же хранилище называется "Личные". Во избежание проблем рекомедуется использовать при обращении нелокализованное имя хранилища. Данное хранилище предназначено для собственных сертификатов пользователя. Как правило к ним прикреплен закрытый ключ и они используются для подписи/шифрования.
Есть и другие значения - "CA" "CAcerts" "TrustedUsers" "TrustedPeople" и т.д., некоторые могут отсутствовать в завичимости от версии и редакции операционной системы, нахождения компьютера в домене, установленных программ и т.п. При желании можно создать свое хранилище, в котором будут сертификаты только для Вашего ПО - видел антивирусы, создающие отдельное хранилище для сертификатов, выданных антивирусом самому себе. Для перечисления, какие хранилища доступны на компьютере есть соответствующая функция в CryptoAPI.
Цитата:
2. Как я понял, если шифровать не Cades Bes, а более защищенным вариантом Cades, то надо подключать службу локального времени. Как это правильно сделать?
Более точно нужно установить TSP-клиент, который будет отправлять запросы к серверу доверенного времени. Такой клиент есть в необязательных компонентах КриптоПро CSP, но на клиент нужна лицензия и если не ошибаюсь отдельная от CSP. Однако есть версии и других отечественных криптопровайдеров, детали подключения у всех разные и могут быть совместимы с разными серверами доверенного времени. Сервер доверенного времени может быть не Ваш собственный (так как установка собственного как правило выливается в полноценный УЦ и несколько миллионов рублей плюс возможно аккредитация, гораздо дороже чем подписка на услуги сервера доверенного времени какого-либо аккредитованного УЦ). Кроме того, как правило понадобится и OCSP-клиент. Как именно подключить в программном виде сказать не могу, не занимался вопросом, скорее всего понадобится указать адрес сервера доверенного времени и адрес оcsp-ответчика УЦ которым выпущен сертификат, если ответчик не указан в сертификате.
При первой установке КриптоПро (без указания купленной лицензии) активируется ограниченная по времени пробная серверная лицензия и временные пробные лицензии на TSP OCSP клиенты плюс в УЦ КриптоПро есть тестовый сервер доверенного времени - для просмотра что и как должно хватить.
Цитата:
Можете перечислить последовательность действий, которую необходимо выполнить пользователю, чтобы в итоге он мог пользоваться написанным мною кодом для подписи данных?
Полагаю, что такую же как и Вам (для тестирования конечно можно обойтись пробной версией, но это неудобно) - приобрести 3 лицензии (CSP,TSP,OCSP), установить программы (CSP,TSP,OCSP,Сadescom) с указанием лицензий, получить сертификат у УЦ, установить корневые/промежуточные сертификаты УЦ и свой сертификат, подписаться на услуги сервера доверенного времени, указать адреса сервера доверенного времени и ocsp-ответчика. Примерно так.

Либо Вы можете сами подписаться и централизованно приобрести лицензии затем перепродать услугу сервера доверенного времени и лицензии клиентам вместе с написанным кодом, тогда в коде можно сразу указать адреса, остальные действия клиентов существенно не изменятся. Некоторые серверы предлагают разные тарифы в зависимости от количества запросов и аутентифицируют клиента по логину/паролю. Бывают сутуации, когда дешевле приобрести безлимитную подписку сразу для всех организаций-клиентов (подписывающих только несколько раз в месяц) чем приобретать минимальный тариф каждой такой организации.

Детали могут зависеть от назначения подписи и объема финансирования - если будет использоваться только для внутреннего обращения (и обмена документов по договору с иной организацией) можно создать свой неаккредитованный (но на основе сертифицированных СКЗИ) УЦ с сервером доверенного времени и ocsp-ответчиком. А если используется для юридически значимой подписи, то нужно обращаться к аккредитованному УЦ или аккредитовать свой УЦ.

Отредактировано пользователем 20 сентября 2018 г. 7:05:27(UTC)  | Причина: уточнение

thanks 1 пользователь поблагодарил two_oceans за этот пост.
Евгений_СК оставлено 20.09.2018(UTC)
Offline mmitin  
#15 Оставлено : 19 сентября 2019 г. 10:18:37(UTC)
mmitin

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.09.2019(UTC)
Сообщений: 1

Автор: Евгений_СК Перейти к цитате
Вот, что у меня получилось в итоге (возможно, кому-то пригодится):

// 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


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

//Отпечаток - строка HEX
Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр)

Рез = Неопределено; // Найденный сертификат (Com-объект)

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); // Открыть хранилище сертификатов

Для Каждого ТекСертификат Из oStore.Certificates Цикл

ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде
Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда
Рез = ТекСертификат;
Прервать;

КонецЕсли;


КонецЦикла;

oStore.Close(); // Закрыть хранилище сертификатов и освободить объект
Возврат Рез;


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


Если что сделал не так или не доделал, поправьте, пожалуйста, но данная подпись проходит проверку у нашего клиента.




данный метод подпись прикрепляет к файлу, а как сделать, что бы подпись была отдельно?

Отредактировано пользователем 19 сентября 2019 г. 10:31:56(UTC)  | Причина: Не указана

Offline two_oceans  
#16 Оставлено : 19 сентября 2019 г. 12:54:27(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Цитата:
данный метод подпись прикрепляет к файлу, а как сделать, что бы подпись была отдельно?
Поменять значение третьего параметра функции подписания. В примере это выглядит как
Код:
bDetached = Истина;
Offline Alex_CSP_38  
#17 Оставлено : 25 сентября 2019 г. 5:50:52(UTC)
Alex_CSP_38

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.09.2019(UTC)
Сообщений: 2
Российская Федерация

Добрый день!
Помогите, пожалуйста! Уже второй день пытаюсь решить проблему и не получается.
Для авторизации в системе, необходимо подписать полученный код авторизации и отправить данное сообщение на сайт.
Если подписывать полученный код через текстовый файл посредством скрипта, то система принимает подписанный код
Выполняется следующий скрипт
cd C:\Program Files\Crypto Pro\CSP
call csptest -sfsign -sign -in c:\SignIn.txt –out c:\SignOut.txt -my "3..." -detached -base64 –add

Если выполнять подпись посредством COM объекта, то система подписанный код не принимает

oSigner = СоздатьОбъект("CAdESCOM.CPSigner");
oSigner.Certificate = ВыбСертификат;
oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData");
oSignedData.Content = СокрЛП(КодАутент);
CADESCOM_CADES_TYPE = 1;
bDetached = 1;
EncodingType = 0;
Подпись = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType);

В чем ошибка?
Заранее спасибо!
Offline two_oceans  
#18 Оставлено : 25 сентября 2019 г. 6:54:51(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Этот вопрос уже можно записывать в часто задаваемые. Пока ни одного ответа по существу не отписали. В общих чертах, 1) похоже кодировка неправильная, для безпасной передачи данных (контента) в объект рекомендуется указание .ContentEncoding =1 и base64 кодирование; на выходе аналогично двоичные данные не получите - либо шестадцатиричные либо Base64, а это видимо не совсем то чего ждет сервис;
https://cpdn.cryptopro.ru/
Цитата:
Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью.

Объект CadesSignedData предоставляет интерфейсы ICPSignedData, ICPSignedData2, ICPSignedData3, ICPSignedData4, ICPSignedData5 и интерфейс, аналогичный CAPICOM.SignedData . В отличие от объекта CAPICOM.SignedData , методы Sign, CoSign и Verify здесь создают и проверяют усовершенствованную подпись типа CAdES-X Long Type 1.

Методы Sign, CoSign, SignCades, CoSignCades, SignHash, и EnhanceCades в КриптоПро ЭЦП Browser plug-in не поддерживают кодировку CAPICOM_ENCODE_BINARY. См. Особенности работы с бинарными данными.

2) похоже сам формат отсоединенной ЭП другой, хотя я не разбирался чем именно отличается. В коде указан CADESCOM_CADES_BES = 1, а какой создается командной строкой надо смотреть в справке.

Отредактировано пользователем 25 сентября 2019 г. 6:55:22(UTC)  | Причина: Не указана

Offline Alex_CSP_38  
#19 Оставлено : 7 октября 2019 г. 10:51:02(UTC)
Alex_CSP_38

Статус: Новичок

Группы: Участники
Зарегистрирован: 25.09.2019(UTC)
Сообщений: 2
Российская Федерация

Может быть кому-то пригодится. Проблема была в том, что в параметр "Content" необходимо было передавать значение в формате "base64", а не обычное строковое значение.

Строка64 = глКодировать(Стр,"base64");

oSigner = СоздатьОбъект("CAdESCOM.CPSigner");
oSigner.Certificate = ВыбСертификат;
oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData");
oSignedData.ContentEncoding = 1;
oSignedData.Content = Строка64;
CADESCOM_CADES_TYPE = 1;
bDetached = 1;
EncodingType = 0;
Подпись = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached);

Функция глКодировать(Стр, Кодировка)

ЦДО = СоздатьОбъект("CDO.Message");
БодиПарт = ЦДО.BodyPart;
Поля = БодиПарт.Fields;
Поле = Поля.Item("urn:schemas:mailheader:content-type");
Поле.Value = "text/plain; charset=""windows-1251""";
Поля.Update();
Стрим = БодиПарт.GetDecodedContentStream();
Стрим.Charset = "windows-1251";
Стрим.WriteText(Стр);
Стрим.Flush();
БодиПарт.ContentTransferEncoding = Кодировка;
Стрим = БодиПарт.GetEncodedContentStream();

Возврат Стрим.ReadText();

КонецФункции
Offline two_oceans  
#20 Оставлено : 7 октября 2019 г. 11:40:31(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Дополню. Перекодировать можно и с помощью объекта ADODB.Stream - там чуть попроще: создаешь объект стрима в текстовом режиме на чтение+запись, задаешь его кодировку (исходную), пишешь исходный текст в стрим (или загружаешь файл), ставишь целевую кодировку, возвращаешь стрим на начало, читаешь готовую строку (или сохраняешь стрим в файл), уничтожаешь объект стрима. В особо точных случаях можно вторым объектом в двоичном режиме считать двоичные данные.

Еще можно подключить системную функцию CryptoApi CryptBinaryToString или связку MultiByteToWideChar + WideCharToMultiByte. Способов перекодировки в base64 вообще много реализовано в любой среде программирования - алгоритм достаточно просто чтобы его реализации изобретали снова и снова.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
7 Страницы<1234>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.