Статус: Участник
Группы: Участники
Зарегистрирован: 01.07.2008(UTC) Сообщений: 17
|
Код на C#: Код:CAdESCOM.CadesSignedData SignedData = new CAdESCOM.CadesSignedDataClass();
SignedData.Content = data;
string res = SignedData.Sign(null, true, CAPICOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
(сертификат выбирается посредством UI в окне выбора сертификата, т.к. первый параметр равен null) Проблема: После вызова метода Sign получаем Exception с кодом: 0xC2100121, более никакой детализации нет. Собственно в чем может быть проблема? P.S. Аналогичный код, но через CAPICOM нормально работает с тем-же сертификатом.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.07.2008(UTC) Сообщений: 17
|
И еще, когда явно указывается сертификат: Код:
CAPICOM.ICertificate cert = //(Получаем сертификат средствами CAPICOM)//
CAdESCOM.CPSigner Signer = new CAdESCOM.CPSignerClass();
Signer.Certificate = cert;
выдается исключение с сообщением: "Интерфейс не поддерживается".
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
По первому вопросу. Код ошибки означает "Не задан адрес службы штампов времени" (ошибка описана в модуле tspcli.dll). В другой ветке я вам уже описал причину возникновения этой ошибки.
В новом дистрибутиве, который скоро будет доступен для скачивания, подобные ошибки будут сопровождаться осмысленным описанием. |
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
По второму вопросу. Беда в том, что присваиваемый объект CAPICOM.Certificate и объект CAdESCOM.CPSigner живут в разных апартментах, а функция присваивания, которую CAdESCOM перевызывает из CAPICOM рассчитывает на то, что объекты живут в одном апартменте. Интересно, что при вызове аналогичного кода из скрипта объекты живут в одном апартменте и присваивание отрабатывается правильно.
Будем править. Прогноза по времени дать пока не могу. |
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Ошибка исправлена. Можете брать новый КриптоПро ЭЦП SDK с сайта. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 01.07.2008(UTC) Сообщений: 17
|
Смирнов написал:Ошибка исправлена. Можете брать новый КриптоПро ЭЦП SDK с сайта. При подписи получаем исключение: "Отсутствует доверие к подписи зашифрованного сообщения или списку доверия сертификатов" (задаем явно адрес службы штампов времени через св-во CPSigner.TSAAddress = "http://www.cryptopro.ru/tsp/tsp.srf") Можно более подробно пояснить чем вызванно данное сообщение об ошибке?
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.06.2009(UTC) Сообщений: 89 Откуда: Уфа, РРЦ "АйТи"
|
Код:
private CAPICOM.ICertificate GetCAPICOMCert(X509Certificate2 cert, X509Store store)
{
CAPICOM.Store oStore = new CAPICOM.Store();
oStore.Open(CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE,store.Name,
CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY);
foreach (ICertificate oCert in oStore.Certificates)
{
if (oCert.SerialNumber.Equals(cert.SerialNumber)) return oCert;
}
throw new CryptographicException("Невозможно найти сертификат");
}
public string Sign(XDocument document, X509Certificate2 cert, X509Store store)
{
CPSigner cpSigner = new CPSigner();
cpSigner.Certificate = GetCAPICOMCert(cert, store);
CadesSignedData oSignedData = new CadesSignedData();
oSignedData.Content = document.ToString();
//Создание и проверка подписи CAdES BES
string sSignedData = oSignedData.SignCades(cpSigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, false,
CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
oSignedData.VerifyCades(sSignedData, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, false);
// Создание параллельной подписи CAdES X Long Type 1
sSignedData = oSignedData.CoSignCades(cpSigner, CADESCOM_CADES_TYPE.CADESCOM_CADES_DEFAULT,
CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);
....
Ексепшен на последней строке примера: System.Runtime.InteropServices.COMException was unhandled by user code Message="Исключение из HRESULT: 0xC2100121" Source="Interop.CAdESCOM" ErrorCode=-1039138527 StackTrace: в CAdESCOM.CadesSignedDataClass.CoSignCades(Object pSigner, CADESCOM_CADES_TYPE CadesType, CAPICOM_ENCODING_TYPE EncodingType) ... Подскажите в чем ошибка пожалуйста p.s. Еще пара дополнительных вопросов, ну что бы уж сразу ;) 1) функция VerifyCades ничего не возвращает - как понять что подпись корректна\валидна ? 2) Я так смутно понял, прочитав эту ветку что если в oSignedData.SignCades(cpSigner вместо cpSigner передать null - то будет предложено окно выбора сертификата, а как так сделать чтобы вызывалось одно окно для ряда функций?, т.е. хотелось бы вызвать криптопрошное окно выбора сертификата, получить из него Сигнера и использовать его во всех функциях с подписанием. Отредактировано пользователем 29 октября 2009 г. 16:31:00(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Ошибка в том, что для создания подписи CAdES X Long должны быть получены штампы времени. А для этого нужно указать адрес службы штампов времени. Это можно сделать как в групповых политиках, так и через свойство TSAAddress объекта CPSigner. 1. По поводу функции VerifyCades - если подпись некорректна, то функция вызовет исключение с информацией о произошедшей ошибке. 2. Для Ваших целей Вы можете воспользоваться свойством CPSigners объекта SignedData.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 15.06.2009(UTC) Сообщений: 89 Откуда: Уфа, РРЦ "АйТи"
|
Новожилова Елена написал:Ошибка в том, что для создания подписи CAdES X Long должны быть получены штампы времени. А для этого нужно указать адрес службы штампов времени. Это можно сделать как в групповых политиках, так и через свойство TSAAddress объекта CPSigner.
Предполагалось что это требуется на этапе sSignedData = oSignedData.EnhanceCades(CADESCOM_CADES_TYPE.CADESCOM_CADES_DEFAULT, TSPServer, CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64); где TSPServer очень даже указывается. p.s. Код один-в-один с мануала! там про указание TSAAddress ни слова ;( Хотя, может я просто бейсик не умею читать ... p.p.s. Помогло, спасибо ;) Новожилова Елена написал:2. Для Ваших целей Вы можете воспользоваться свойством CPSigners объекта SignedData. Как? Хотелось бы подробнее! Отредактировано пользователем 29 октября 2009 г. 18:02:40(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close