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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline avorobev  
#11 Оставлено : 20 апреля 2012 г. 17:58:41(UTC)
avorobev

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

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

Спасибо, после патча все заработало.
Offline avorobev  
#12 Оставлено : 23 апреля 2012 г. 18:19:33(UTC)
avorobev

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

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

maxdm написал:

avorobev написал:
2) Во время работы примера, при выполнении строчки кода
Код:
signedCms.ComputeSignature(cmsSigner, false);

появилось окошко, предлагающее ввести пароль для доступа к приватному ключу. Но нам необходимо создать сервис, который будет подписывать документы автоматически, никто вручную вводить ничего не будет. Соответственно вопрос - можно ли задавать пароль в коде?

Пароль (пин) проще всего запомнить средствами КриптоПро CSP или не задавать вовсе.
Программно конечно можно тоже.

А не дадите ли пример, как это можно сделать программно? Сколько я не пытался, у меня ничего не получается. Вроде бы надо через CspParameters. Но при передаче CspParameters с паролем в конструктор CmsSigner все время получаю разные exception.

Отредактировано пользователем 23 апреля 2012 г. 18:22:45(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#13 Оставлено : 23 апреля 2012 г. 18:42:44(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,413
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 723 раз в 626 постах
Если сертификат в контейнере, то можно использовать код из http://www.cryptopro.ru/....aspx?g=posts&t=4422
Знания в базе знаний, поддержка в центре поддержки
Offline Максим Коллегин  
#14 Оставлено : 23 апреля 2012 г. 18:45:53(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,413
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 723 раз в 626 постах
Знания в базе знаний, поддержка в центре поддержки
Offline avorobev  
#15 Оставлено : 23 апреля 2012 г. 19:47:49(UTC)
avorobev

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

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

Спасибо большое! Теперь все работает. Первый пример очень помог. Второй я нашел сам до этого и пытался использовать, но не получалось. Проблема видимо была с установкой флагов в параметрах.
Offline avorobev  
#16 Оставлено : 23 апреля 2012 г. 20:55:32(UTC)
avorobev

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

Группы: Участники
Зарегистрирован: 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:
Offline Максим Коллегин  
#17 Оставлено : 23 апреля 2012 г. 20:58:11(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,413
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 723 раз в 626 постах
Ответ на ваш вопрос не может быть предоставлен специалистом технической поддержки и требует привлечения группы разработки.

http://www.cryptopro.ru/...6-e111-9235-0025900a9ce7
Знания в базе знаний, поддержка в центре поддержки
Offline avorobev  
#18 Оставлено : 23 апреля 2012 г. 21:19:26(UTC)
avorobev

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

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

Ну что ж, понятно, спасибо.
Offline avorobev  
#19 Оставлено : 23 апреля 2012 г. 22:04:41(UTC)
avorobev

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline avorobev  
#20 Оставлено : 23 апреля 2012 г. 22:12:27(UTC)
avorobev

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.