| 
	Статус: Участник
 Группы: Участники
Зарегистрирован: 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) Сообщений: 939  Откуда: Крипто-ПроПоблагодарили: 115 раз в 104 постах
 | 
            
		      
                Ошибка в том, что для создания подписи 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