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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline rvaleev  
#1 Оставлено : 21 января 2015 г. 14:17:19(UTC)
rvaleev

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

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

Мне нужно подписать строку цифровой подписью. А потом в цифровую подпись вставить неподписываемый атрибут (типа OID 1.2.3.4.5).
Пытаюсь это сделать следующей командой
cryptcp.exe -signf -dir signs -cert -q10 -dn rvaleev -attr "1.2.3.4.5,data.txt" -askpin xml_to_be_signed.xml

Файл с подписью создается, но не проходит проверку тут: http://www.gosuslugi.ru/pgu/eds/

Кто сталкивался с этой проблемой?
Offline Юрий  
#2 Оставлено : 21 января 2015 г. 14:28:55(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Приведённая ссылка это сервис проверки сертификатов. Это нечто совсем-совсем отличное от подписей, которую вы пытаетесь создать.
С уважением,
Юрий Строжевский
Offline rvaleev  
#3 Оставлено : 21 января 2015 г. 14:44:56(UTC)
rvaleev

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

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

Это не совсем так. По ссылке есть раздел "Подтверждение подлинности ЭП электронного документа. ЭП — отсоединенная, в формате PKCS#7"
Вот ее и нужно проверить.
Offline rvaleev  
#4 Оставлено : 21 января 2015 г. 14:46:43(UTC)
rvaleev

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

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

Если делать подпись документа без параметра -attr "1.2.3.4.5,data.txt", то подпись проходит успешную проверку. Может ли это быть багом в cryptcp?
Offline rvaleev  
#5 Оставлено : 22 января 2015 г. 17:35:23(UTC)
rvaleev

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

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

Чтобы закрыть тему пишу ответ. В cryptcp есть дефект и он не верно добавляет неподписываемые атрибуты. Проблема решилась путем использования CAPICOM интерфейса через javascript
примерно вот так:
var oCert = oCerts.Item(1);
try {
var oSigner = ObjCreator("CAdESCOM.CPSigner");
} catch (err) {
alert('Failed to create CAdESCOM.CPSigner: ' + errerr.number);
return;
}
if (oSigner) {
oSigner.Certificate = oCert;
}
else {
alert("Failed to create CPSigner");
return;
}

var oSignedData = ObjCreator("CAdESCOM.CadesSignedData");

var txtDataToSign = document.getElementById(dataID).value;

var CADES_BES = 1;

var CAPICOM_ENCODE_BASE64 = 0;

// данные нужно создавать в формате UTF-8 и конвертировать их в base64. Затем отдавать на подпись.
txtDataToSign = "base64 данные";

oSignedData.ContentEncoding = 0x01;
oSignedData.Content = txtDataToSign;


var unsignedAttr = ObjCreator("CAdESCOM.CPAttribute");

unsignedAttr.OID.Value = "1.2.643.5.1.5";
unsignedAttr.Value = "нужное значение";

oSigner.Options = 1; //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN


oSigner.UnauthenticatedAttributes.Add(unsignedAttr);


// отсоединенная подпись
var sSignedData = oSignedData.SignCades(oSigner, CADES_BES, true, CAPICOM_ENCODE_BASE64);


Offline Андрей Писарев  
#6 Оставлено : 22 января 2015 г. 18:04:02(UTC)
Андрей *

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

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

Сказал «Спасибо»: 495 раз
Поблагодарили: 2035 раз в 1579 постах
CAPICOM от MS,
используется в коде выше CAdESCOM от КРИПТО-ПРО.
Техническую поддержку оказываем тут
Наша база знаний
Offline timur.lt  
#7 Оставлено : 6 марта 2015 г. 15:54:20(UTC)
timur.lt

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

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

Поблагодарили: 1 раз в 1 постах
rvaleev, здравствуйте

// данные нужно создавать в формате UTF-8 и конвертировать их в base64. Затем отдавать на подпись.
почему нельзя сразу отдавать на подпись строку?
Offline rvaleev  
#8 Оставлено : 6 марта 2015 г. 18:38:09(UTC)
rvaleev

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

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

Потому что функция SignCades у меня используется с соответствующим флагом. Вы можете и сырые данные подписывать
Offline timur.lt  
#9 Оставлено : 10 марта 2015 г. 12:21:56(UTC)
timur.lt

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

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

Поблагодарили: 1 раз в 1 постах
Добрый день, rvaleev!

В вашем пример используется параметр
oSigner.Options = 1; //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
на сколько он обязателен при проверке http://www.gosuslugi.ru/pgu/eds/?

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

если вызвать с параметром CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY, то функция что-то возвращает, но тогда не проходит проверку на сайте госуслуг

и еще странный момент, подписанная строка содержит переходы на новую строку \r\n

Не подскажите как вы решили задачу целиком, со строчкой
// данные нужно создавать в формате UTF-8 и конвертировать их в base64. Затем отдавать на подпись.
спасибо

Для примера я подписывал простой текстовый файл, содержащий символ - 1.

CAPICOM.Store store = new CAPICOM.Store();
store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My");

CAPICOM.Certificate cer = store.Certificates[1];
store.Close();

CAdESCOM.CPSigner signer = new CAdESCOM.CPSigner();
CAdESCOM.CadesSignedData sd = new CAdESCOM.CadesSignedData();
CAPICOM.Utilities utils = new CAPICOM.Utilities();

signer.Certificate = cer;

sd.ContentEncoding = CAdESCOM.CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY;
sd.Content = utils.Base64Encode("1");
signer.Options = CAPICOM.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;
//signer.Options = CAPICOM.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
string s = sd.SignCades(signer, CAdESCOM.CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
s = s.Replace("\r\n", "");

System.IO.File.WriteAllText("c:\\1.bin", s, Encoding.ASCII);

Отредактировано пользователем 10 марта 2015 г. 12:40:41(UTC)  | Причина: Не указана

Offline rvaleev  
#10 Оставлено : 10 марта 2015 г. 15:11:57(UTC)
rvaleev

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

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

Для файла с содержимым 1 base64 кодировка будет MQ==
Можно скачать Notepad++. В ней выбираете создать файл. Далее в меню выбираете кодировку UTF-8 (без BOM) и сохраняете в файл.
Далее я использую линуксовую утилиту base64 для кодирования. В винде можно использовать certutil
certutil -encode in.txt out.txt
Но после создания нужно вручную удалить -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- из out.txt

Что касается полной цепочки - да, ее нужно импортировать. Иначе не распознается на госуслугах.
Для локальной проверки подписи я поставил КриптоАРМ. Он умеет проверять подписи. Пока в нем не будет подтверждено, что подпись правильная, на госуслуги идти нет смысла.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.