logo Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений_СК  
#1 Оставлено : 17 сентября 2018 г. 18:04:37(UTC)
Евгений_СК

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Добрый день!
Стоит задача подписи строковых данных по формату CADES BES. 1C подписывает только в формате PKCS#7. Как можно интегрировать КриптоПро в 1С для решения описанной задачи?
Offline Андрей Писарев  
#2 Оставлено : 17 сентября 2018 г. 21:31:09(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
Автор: Евгений_СК Перейти к цитате
Добрый день!
Стоит задача подписи строковых данных по формату CADES BES. 1C подписывает только в формате PKCS#7. Как можно интегрировать КриптоПро в 1С для решения описанной задачи?


Здравствуйте.


Интерфейс COM

в 1С - это работа через - COMОбъект

В вашем случае - кодируйте строку в base64, правильно инициализируйте COM и выполняйте подписание.


Примеры:
Код:

...
// Значение свойства ContentEncoding должно быть задано
        // до заполнения свойства Content
        oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
        oSignedData.Content = dataToSign;
     sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
...


dataToSign - ваши данные (текс\xml и т.п.) закодированные в base64

В целом работа аналогична, как с CAPICOM от MS.


Либо используйте возможности из 1С (МенеджерКриптографии).
Будет CMS - CADES BES.
Техническую поддержку оказываем тут
Наша база знаний
Offline Евгений_СК  
#3 Оставлено : 17 сентября 2018 г. 21:37:53(UTC)
Евгений_СК

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
МенеджерКриптографии 1С не хочет в CADES BES подписывать - только PKCS#7. У 1с в справке написано, что метод "Подписать" подписывает в PKCS#7
Offline Андрей Писарев  
#4 Оставлено : 17 сентября 2018 г. 22:36:01(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
Автор: Евгений_СК Перейти к цитате
МенеджерКриптографии 1С не хочет в CADES BES подписывать - только PKCS#7. У 1с в справке написано, что метод "Подписать" подписывает в PKCS#7


Как это стало известно?

Вместо PKCS#7 - используется CMS.



Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 17 сентября 2018 г. 22:37:50(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
a6404d0827f33a3377aff8b388392639.jpg (157kb) загружен 24 раз(а).

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Евгений_СК оставлено 18.09.2018(UTC)
Offline Андрей Писарев  
#6 Оставлено : 17 сентября 2018 г. 22:50:13(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах

Особенности создания подписанных CMS сообщений в Крипто-Про CSP 3.6 и выше


Цитата:

Поскольку после создания подписи нельзя добавлять или изменять подписанные атрибуты, Крипто-Про CSP при создании подписанного сообщения с использованием алгоритма ГОСТ Р 34.10/34.11 добавляет к нему подписанный атрибут SigningCertificateV2.


Итого - на выходе CMS (CADES BES).

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Евгений_СК оставлено 18.09.2018(UTC)
Offline Евгений_СК  
#7 Оставлено : 18 сентября 2018 г. 13:21:35(UTC)
Евгений_СК

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Автор: Андрей Писарев Перейти к цитате
Автор: Евгений_СК Перейти к цитате
МенеджерКриптографии 1С не хочет в CADES BES подписывать - только PKCS#7. У 1с в справке написано, что метод "Подписать" подписывает в PKCS#7


Как это стало известно?

Вместо PKCS#7 - используется CMS.





У объекта "МенеджерКриптографии" в 1С есть метод "Подписать", с помощью которого, собственно, и осуществляется подпись. В справке к методу написано:
"Создает подпись в формате PKCS#7 и возвращает ее как ДвоичныеДанные или сохраняет ее в файл."
Нам клиенты присылают некую строку, которую мы должны подписать и отправить им обратно. Когда я подписываю ее методом 1С "Подписать", проверка у клиента не проходит; когда же я подписываю эту строку на страничке https://www.cryptopro.ru...ge/cades_bes_sample.html , подпись срабатывает нормально. Скажите, по подписи можно как-то понять, какого она формата? Первые символы подписи в 1С - "MIIG", на вышеуказанной странице - "MIII"
Offline Андрей Писарев  
#8 Оставлено : 18 сентября 2018 г. 20:00:14(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
Автор: Евгений_СК Перейти к цитате
Автор: Андрей Писарев Перейти к цитате
Автор: Евгений_СК Перейти к цитате
МенеджерКриптографии 1С не хочет в CADES BES подписывать - только PKCS#7. У 1с в справке написано, что метод "Подписать" подписывает в PKCS#7


Как это стало известно?

Вместо PKCS#7 - используется CMS.





У объекта "МенеджерКриптографии" в 1С есть метод "Подписать", с помощью которого, собственно, и осуществляется подпись. В справке к методу написано:
"Создает подпись в формате PKCS#7 и возвращает ее как ДвоичныеДанные или сохраняет ее в файл."
Нам клиенты присылают некую строку, которую мы должны подписать и отправить им обратно. Когда я подписываю ее методом 1С "Подписать", проверка у клиента не проходит; когда же я подписываю эту строку на страничке https://www.cryptopro.ru...ge/cades_bes_sample.html , подпись срабатывает нормально. Скажите, по подписи можно как-то понять, какого она формата? Первые символы подписи в 1С - "MIIG", на вышеуказанной странице - "MIII"


Вы должны определиться с требованиями.
Подпись должна быть вместе с данными или отдельно?

На странице - подпись присоединенная.


МенеджерКриптографии.Подписать
Цитата:
Создает подпись в формате PKCS#7 и возвращает ее как ДвоичныеДанные или сохраняет ее в файл.
Подпись создается алгоритмами, которые заданы свойствами АлгоритмХеширования и АлгоритмПодписи.
В данные подписи исходный файл не включается.



Значит используйте CadesCOM и при вызове .Sign - указывайте параметр bDetached = false
Код:

 SignedData.Sign( _
  [ ByVal Signer ], _
  [ ByVal bDetached ], _
  [ ByVal EncodingType ] _
)
 


Примеры



Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 18 сентября 2018 г. 20:04:21(UTC)
Андрей *

Статус: Сотрудник

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

Сказал «Спасибо»: 333 раз
Поблагодарили: 1302 раз в 1017 постах
Автор: Евгений_СК Перейти к цитате
Скажите, по подписи можно как-то понять, какого она формата? Первые символы подписи в 1С - "MIIG", на вышеуказанной странице - "MIII"


Вы привели часть из base64.
Анализировать необходимо ASN.1 структуру, т.е. до кодирования в base64, чтобы понять какой именно вариант
(bes\t\long).

Повторюсь - используете Вы CMS (Cades BES), а не pkcs#7.
И по сообщениям - присоедиенная подпись используется.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Евгений_СК оставлено 19.09.2018(UTC)
Offline Евгений_СК  
#10 Оставлено : 18 сентября 2018 г. 20:14:16(UTC)
Евгений_СК

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 1 раз в 1 постах
Да, Ваша правда, 1с не присоединяет данные к подписи, мне же нужна именно подпись с данными. Попробую через CadesCOM, спасибо!
Offline Евгений_СК  
#11 Оставлено : 19 сентября 2018 г. 18:02:27(UTC)
Евгений_СК

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 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)
Сообщений: 10
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 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)
Сообщений: 10
Российская Федерация
Откуда: Москва

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

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

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

Сказал(а) «Спасибо»: 62 раз
Поблагодарили: 219 раз в 206 постах
Автор: Евгений_СК Перейти к цитате
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)
Сообщений: 975
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 62 раз
Поблагодарили: 219 раз в 206 постах
Цитата:
данный метод подпись прикрепляет к файлу, а как сделать, что бы подпись была отдельно?
Поменять значение третьего параметра функции подписания. В примере это выглядит как
Код:
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)
Сообщений: 975
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 62 раз
Поблагодарили: 219 раз в 206 постах
Этот вопрос уже можно записывать в часто задаваемые. Пока ни одного ответа по существу не отписали. В общих чертах, 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)
Сообщений: 975
Российская Федерация
Откуда: Иркутская область

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

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