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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline timkin_vn  
#1 Оставлено : 27 декабря 2010 г. 10:37:35(UTC)
timkin_vn

Статус: Участник

Группы: Участники
Зарегистрирован: 14.12.2010(UTC)
Сообщений: 25
Откуда: Новосибирск

Здравствуйте!

Стоит такая задача. Требуется подписывать файл, чтобы потом проверять подпись. При работе с RSA просто экспортировали ключ и приладывали его к подписи. На стороне проверки извлекали оттуда и проверяли, примерно так:

Код:
        // Подписывание
        byte[] fileContent;
        // Здесь прочитывается содержимое pfx-файла
        cert = new X509Certificate2(fileContent, pid.txtPassword.Text);
        byte[] pubcert = cert.Export(X509ContentType.Cert);
        RSACryptoServiceProvider cspRsa = cert.PrivateKey as RSACryptoServiceProvider;
        byte[] bSign = crypto.SignData(arr, new SHA1CryptoServiceProvider());
        // Здесь упаковка pubcert и bSign

        // Проверка
        byte[] bSign = null;
        byte[] pubcert = null;
        // Извлечение сертификата и подписи
        // ...
        X509Certificate2 cert = new X509Certificate2(pubcert);
        RSACryptoServiceProvider cspRsa = cert.PublicKey.Key as RSACryptoServiceProvider;
        if (!cspRsa.VerifyData(arr, new SHA1CryptoServiceProvider(), bSign))
            throw new Exception("RSA подпись документа неверна!");


Пытаемся выполнить нечто подобное с КриптоПро:

Код:
        string containerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
        Console.WriteLine(containerName);
        CspParameters cp = new CspParameters(75, "", containerName);
        Gost3410CryptoServiceProvider cspGost = new Gost3410CryptoServiceProvider(cp);
        byte[] pubcert = cspGost.ExportParameters(true).PrivateKey;


При экспорте выбрасывается исключение, что экспорт долговременного секретного ключа CSP в чистом виде не поддерживается. Каким образом можно передать содержимое ключа для проверки подписи на принимающей стороне?
Offline Максим Коллегин  
#2 Оставлено : 27 декабря 2010 г. 11:18:55(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Для проверки подписи отправлять закрытый ключ? - абсурд. Обычно для этой цели используют открытый.
Знания в базе знаний, поддержка в техподдержке
Offline timkin_vn  
#3 Оставлено : 27 декабря 2010 г. 12:10:14(UTC)
timkin_vn

Статус: Участник

Группы: Участники
Зарегистрирован: 14.12.2010(UTC)
Сообщений: 25
Откуда: Новосибирск

Хорошо, пусть. А как с ключом передать информацию о сертификате подписавшего?

Отредактировано пользователем 27 декабря 2010 г. 12:37:11(UTC)  | Причина: Не указана

Offline Челпанов А.  
#4 Оставлено : 27 декабря 2010 г. 18:10:11(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
С каким ключом?
Cертификат это и есть открытый ключ + информация о владельце.
С уважением, Александр.
Offline timkin_vn  
#5 Оставлено : 28 декабря 2010 г. 9:22:44(UTC)
timkin_vn

Статус: Участник

Группы: Участники
Зарегистрирован: 14.12.2010(UTC)
Сообщений: 25
Откуда: Новосибирск

Извинюяь, возможно, я неправильно выражаюсь. В общем, на данный момент получается вот что. Открываю имеющийся контейнер (выбор через диалог сейчас только для отладки и проверки), получаю провайдера, извлекаю открытый ключ:
Код:
        string containerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
        CspParameters cp = new CspParameters(75, null, containerName);
        Gost3410CryptoServiceProvider cspGost = new Gost3410CryptoServiceProvider(cp);
        byte[] pubcert = cspGost.ExportCspBlob(false);

Далее подписываем, прикладываем ключ к подписи. Проверка происходит правильно. Однако если я пытаюсь получить ссылку на сертификат, которым производится подпись:
Код:
        X509Certificate2 cert = cspGost.ContainerCertificate;

в ответ получаю null. Вот, собственно, и вопрос: как получить не только открытый ключ, но и остальной сертификат?
Offline Челпанов А.  
#6 Оставлено : 28 декабря 2010 г. 11:26:07(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Для того, чтобы
Цитата:
X509Certificate2 cert = cspGost.ContainerCertificate;
работало, необходимо, чтобы в контейнера секретного ключа был установлен сертификат. Его может там не быть, потому что:
- его туда не устанавливали
- устанавливали, но не хватило места, поэтому он не установился.
Проверить наличие и установить сертификат в контейнер можно при помощи контрольной панели КриптоПро CSP (правда только для ГОСТ, для RSA придется пользоваться другими средствами).

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