Статус: Активный участник
Группы: Участники
Зарегистрирован: 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,413  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 723 раз в 626 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,413  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 723 раз в 626 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
Спасибо большое! Теперь все работает. Первый пример очень помог. Второй я нашел сам до этого и пытался использовать, но не получалось. Проблема видимо была с установкой флагов в параметрах.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.04.2012(UTC) Сообщений: 109
|
Что-то я рано обрадовался. Сертификат описанным в первом примере способом получается. Но при вызове метода Код:signedCms.ComputeSignature(cmsSigner, true);
все равно получается exception Цитата:System.Security.Cryptography.CryptographicException was caught Message=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,413  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 723 раз в 626 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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