| 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Спасибо, после патча все заработало. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                maxdm написал:avorobev написал:2) Во время работы примера, при выполнении строчки кода  Код:signedCms.ComputeSignature(cmsSigner, false);
 появилось окошко, предлагающее ввести пароль для доступа к приватному ключу. Но нам необходимо создать сервис, который будет подписывать документы автоматически, никто вручную вводить ничего не будет. Соответственно вопрос - можно ли задавать пароль в коде? Пароль (пин) проще всего запомнить средствами КриптоПро CSP или не задавать вовсе. Программно конечно можно тоже. А не дадите ли пример, как это можно сделать программно? Сколько я не пытался, у меня ничего не получается. Вроде бы надо через CspParameters. Но при передаче CspParameters с паролем в конструктор CmsSigner все время получаю разные exception. Отредактировано пользователем 23 апреля 2012 г. 18:22:45(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 |  | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 |  | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Спасибо большое! Теперь все работает. Первый пример очень помог. Второй я нашел сам до этого и пытался использовать, но не получалось. Проблема видимо была с установкой флагов в параметрах. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Что-то я рано обрадовался. Сертификат описанным в первом примере способом получается. Но при вызове метода  Код:signedCms.ComputeSignature(cmsSigner, true);
 все равно получается exception Цитата:System.Security.Cryptography.CryptographicException was caughtMessage=The card cannot be accessed because the wrong PIN was presented.
 
 Source=System.Security
 StackTrace:
 at System.Security.Cryptography.Pkcs.SignedCms.Sign(CmsSigner signer, Boolean silent)
 at System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature(CmsSigner signer, Boolean silent)
 at PdfDigitalSign.Test1.Sign(String sourceFile, String destFile, String certificateId, String storeName, StoreLocation storeLoaction) in C:\Projects\POC_iTextSharp\PdfDigitalSign\Test1.cs:line 140
 at PdfDigitalSign.Program.Main(String[] args) in C:\Projects\POC_iTextSharp\PdfDigitalSign\Program.cs:line 32
 InnerException:
 
 | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРОСказал «Спасибо»: 37 разПоблагодарили: 729 раз в 630 постах
 
 |  | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Ну что ж, понятно, спасибо. | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Задача решена. Нужно использовать оба примера одновременно.  То есть, сначала получить сертификат из хранилища, как в первом примере (http://www.cryptopro.ru/forum2/Default.aspx?g=posts&t=4422 ) с указанием пароля в CspParameters.  А потом, перед инициализацией CmsSigner, еще раз задать теже самые CspParameters с указанием пароля, создать с этими параметрами провайдера, и присвоить этого провайдера приватному ключу сертификата, как указано внизу этого примера (http://forums.asp.net/t/1531893.aspx ). Тогда все работает. Если использовать только один из примеров, то нет. Немного тупо, что надо делать два раза одно и тоже, но зато работает. Отредактировано пользователем 23 апреля 2012 г. 22:06:46(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Активный участник
 Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
 Сообщений: 109
 
 | 
            
		      
                Можно сделать проще. В первом примере, в методе, который возвращает сертификат Код:
internal X509Certificate2 GetCertificate()
{
    //true - MachineKeyStore; false - UserKeyStore
    _provider = BuildCryptoProviderByKeyStore(false) ?? BuildCryptoProviderByKeyStore(true);
    if (_provider == null)
    {
         throw new Exception("... текст ...");
    }
    CheckCertificatePassword(_provider);
    return GetX509Certificate2(_provider);
}
 надо сразу же, перед возвращением сертификата, присвоить его приватному ключу сам провайдер Код:
internal X509Certificate2 GetCertificate()
{
    //true - MachineKeyStore; false - UserKeyStore
    _provider = BuildCryptoProviderByKeyStore(false) ?? BuildCryptoProviderByKeyStore(true);
    if (_provider == null)
    {
        throw new Exception("... текст ...");
    }
    CheckCertificatePassword(_provider);
    X509Certificate2 _certificate = GetX509Certificate2(_provider);
    _certificate.PrivateKey = _provider;
    return _certificate;
}
 Тогда не надо будет несколько раз создавать параметры. Отредактировано пользователем 23 апреля 2012 г. 22:18:05(UTC)
 | Причина: Не указана | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
	                           
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close