logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Randoom  
#1 Оставлено : 16 июня 2009 г. 12:53:09(UTC)
Randoom

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

Группы: Участники
Зарегистрирован: 15.06.2009(UTC)
Сообщений: 89
Откуда: Уфа, РРЦ "АйТи"

Подскажите пожалуйста :

1) Как получить список всех установленных считывателей
2) Как получить список всех крипто-контейнеров на каждый из считывателей
3) Как найти среди них именно тот с которым связан некий сертификат сертификат (в случае подписания документа)

p.s. Поправьте если где - то сказал глупость.
Offline Челпанов А.  
#2 Оставлено : 18 июня 2009 г. 18:10:30(UTC)
Челпанов А.

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

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

1) Только native способом через CryptGetProvParam PP_ENUMREADERS 114
2) Только native способом перечислить все контейнеры (PP_ENUMCONTAINERS) с флагом CRYPT_FQCN (0x10). В FQCN имени будет имя считывателя.
3) Переформулирую вопрос... Как по сертификату найти секретный ключ ему соответствующий? Если через Sharpei, то есть пример в Simple.zip (Certificate\cs\FindMy). Если на native уровне, то CryptAcquireCertificatePrivateKey. Если хочется отсеить по считывателям: CryptGetProvParam PP_FQCN (111)

P.S. Зачем так сложно? Основной способ выдать стандартное диалоговое окно со списком сертификатов в хранилище MY (они обычно имеют привязку к секретному ключу) и по нему получается секретный ключ.
С уважением, Александр.
Offline mois  
#3 Оставлено : 27 июля 2009 г. 22:46:53(UTC)
mois

Статус: Новичок

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

Челпанов А. написал:
Если через Sharpei, то есть пример в Simple.zip (Certificate\cs\FindMy).


Насколько я понял, в примере рассмотрен случай, когда сертификат установлен в хранилище и имеет привязку к закрытому ключу.
На мой взгляд, гораздо реальнее и ближе к жизни ситуация, когда есть файл сертификата (не установленный в хранилище и не связанный с контейнером) и контейнер закрытого ключа, и необходимо установить сертификат в соответствующий ему контейнер. Возможно ли в этом случае через Sharpei найти контейнер соответствующий конкретному сертификату?
Offline maxdm  
#4 Оставлено : 28 июля 2009 г. 4:50:48(UTC)
maxdm


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

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

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Странная ситуация.
Только причем тут Шарпей? Перебрать все контейнеры и выбрать с совпадающим открытым ключем - Шарпей тут явно не нужен - p\invoke достаточно. Да и для ключа в контейнере может быть несколько сертификатов.
Offline mois  
#5 Оставлено : 28 июля 2009 г. 13:46:53(UTC)
mois

Статус: Новичок

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

maxdm написал:
Только причем тут Шарпей?

При работе с .net, было бы удобно совершать подобные операции через Шарпей.

maxdm написал:
Шарпей тут явно не нужен - p\invoke достаточно.

Странный ответ. Было бы здорово, если бы вы написали: "P\invoke тут явно не нужен - достаточно Шарпей".
P\invoke достаточно для всего, возникает вопрос зачем нужен Шарпей?!

maxdm написал:
Странная ситуация.

Что странного в ситуации?!
Идея такая: у клиента есть контейнер закрытого ключа, мы ему передаем сертификат, автоматически находим соответствующий сертификату контейнер и устанавливаем в него сертификат.
Offline Челпанов А.  
#6 Оставлено : 28 июля 2009 г. 14:41:16(UTC)
Челпанов А.

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

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

по поводу
Цитата:
Идея такая: у клиента есть контейнер закрытого ключа, мы ему передаем сертификат, автоматически находим соответствующий сертификату контейнер и устанавливаем в него сертификат.

Рекомендую почитать предыдущую тему
Gost3410CryptoServiceProvider.SelectContainer(...) - выдает окно выбора контейнера
Gost3410CryptoServiceProvider.ContainerCertificate{ get; set } - получение/установка из/в контейнер
simple.zip\Certificate\InstallMy.cs - пример установки сертификата из контейнера с установкой ссылки на секретный ключ.

Вроде этого должно хватить...
С уважением, Александр.
Offline mois  
#7 Оставлено : 28 июля 2009 г. 15:53:04(UTC)
mois

Статус: Новичок

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

Челпанов А. написал:
Рекомендую почитать предыдущую тему
Gost3410CryptoServiceProvider.SelectContainer(...) - выдает окно выбора контейнера
Gost3410CryptoServiceProvider.ContainerCertificate{ get; set } - получение/установка из/в контейнер
simple.zip\Certificate\InstallMy.cs - пример установки сертификата из контейнера с установкой ссылки на секретный ключ.

Вроде этого должно хватить...


Да, я читал эту тему, ознакомился с рекоммендациями, которые вы дали, и с изменениями, которые внесли в Шарпей. Хотелось автоматизировать процесс, чтобы упростить жизнь неопытному пользователю, чтобы ему не надо было даже выбирать контейнер.
Задача решена с использованием p\invoke, просто интересовался, можно ли это сделать через Шарпей.
Offline Челпанов А.  
#8 Оставлено : 28 июля 2009 г. 19:32:07(UTC)
Челпанов А.

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

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

Пока нельзя... Пока я не совсем понимаю, как наличие функции перечисления считывателей сможет упростить процесс установки сертификата в контейнер.
Каким образом идет поиск соответствующего сертификату контейнера? Перебором? Храните доп. информацию? Какую? Где?
Если действительно упростит жизнь многим, так можно и протащить в Sharpei...
С уважением, Александр.
Offline mois  
#9 Оставлено : 29 июля 2009 г. 18:44:14(UTC)
mois

Статус: Новичок

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

Челпанов А. написал:
как наличие функции перечисления считывателей сможет упростить процесс установки сертификата в контейнер

Основная цель не перечислить контейнеры, а установить сертификат. Просто функция перечисления контейнеров и считывателей, на мой взгляд, помогла бы сделать более удобный API. Пример:

Код:
[Flags]
public enum Readers
{
    Registry,
    Floppy

    // Другие считыватели
}

public sealed class Gost3410CryptoServiceProvider
{
    // Возвращает все контейнеры на указанных считывателях
    public static string[] GetContainers( Readers readers );

    // Возвращает все контейнеры на всех носителях,
    // у которых открытый ключ совпадает с открытым ключем сертификата.
    public static string[] GetContainers( X509Certificate2 certificate );

    // Возвращает все контейнеры на указанных считывателях,
    // у которых открытый ключ совпадает с открытым ключем сертификата.
    public static string[] GetContainers( X509Certificate2 certificate, Readers readers );

    ...
}

Я использую только имена контейнеров, но возможно пригодились бы перегруженные функции возвращающие экземпляры CspParameters.

По поводу самой установки. Последовательность моих действий:
1. Получаю список всех контейнеров на всех носителях.
2. Перебираю все контейнеры. Если открытый ключ сертификата и контейнера совпадает, устанавливаю в контейнер сертификат.

Челпанов А. написал:
Храните доп. информацию? Какую? Где?

Никакой доп. информации не использую. Не понимаю о какой информации идет речь и зачем она нужна, но раз вы спрашиваете, возможно я что-то не так делаю?!

Единственное, на мой взгляд, негативное последствие, такого способа установки сертификата, в том что, если у нас есть несколько экземпляров контейнера на нескольких носителях, то сертификат устанавливается во все. Но в подавляющем большинстве наших случаев, существует лишь один экземпляр контейнера, и, в принципе, я не вижу ничего страшного, если сертификат будет установлен во все контейнеры (опять же в нашем случае).

Я не специалист в криптографии, поэтому, если я где-то допускаю ошибки, поправьте пожалуйста.

Отредактировано пользователем 30 июля 2009 г. 3:19:21(UTC)  | Причина: Не указана

Offline Челпанов А.  
#10 Оставлено : 29 июля 2009 г. 20:28:12(UTC)
Челпанов А.

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

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

Проблема кроется в
Цитата:
2. Перебираю все контейнеры. Если открытый ключ сертификата и контейнера совпадает, устанавливаю в контейнер сертификат.
Для того, чтобы получить открытый ключ (и соответственно проверить соответствует ли ключ сертификату), нужен пароль на контейнер (или pin на носитель...).
Поэтому тупой перебор не поможет, не будите же вы спрашивать пароли на все контейнеры?
Если же генерация запроса на сертификат идет Вашими средствами, то можно просто где-то хранить информацию о имени контейнера, тогда и перечисление контейнеров не потребуется.

P.S.
Цитата:
я не вижу ничего страшного, если сертификат будет установлен во все контейнеры (опять же в нашем случае).
Ничего страшного нет, вот только привязка от сертификата на контейнер секретного ключа сохранится только одна.
С уважением, Александр.
Offline mois  
#11 Оставлено : 30 июля 2009 г. 2:49:26(UTC)
mois

Статус: Новичок

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

По поводу пароля, действительно очень не удобно. Но мы его почти не используем (а точнее я вообще ни разу не встречал, чтобы мы или наши клиенты использовали пароль), поэтому в нашем конкретном случае, это не критично. Теперь стало понятно почему у вас возник вопрос, о том как мы сопостовляем сертификат с контейнером. Тогда сразу возникает встречный вопрос, есть ли другой способ определить соответсвует ли сертификат контейнеру, не требующий прав доступа к контейнеру?

И по поводу привязки. Вы имели ввиду, что сертификат установленный в хранилище на компьютере будет иметь привязку только к одному контейнеру? Если да, то нам надо установить сертификат только в контейнер закрытого ключа.

P.S. У меня есть еще несколько вопросов к вам, но я и так уже отклонился от темы топика, поэтому думаю лучше задать их в отдельной теме.
Offline Челпанов А.  
#12 Оставлено : 30 июля 2009 г. 15:43:30(UTC)
Челпанов А.

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

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

Цитата:
По поводу пароля, действительно очень не удобно. Но мы его почти не используем (а точнее я вообще ни разу не встречал, чтобы мы или наши клиенты использовали пароль), поэтому в нашем конкретном случае, это не критично. Теперь стало понятно почему у вас возник вопрос, о том как мы сопостовляем сертификат с контейнером. Тогда сразу возникает встречный вопрос, есть ли другой способ определить соответсвует ли сертификат контейнеру, не требующий прав доступа к контейнеру?
Документированных способов нет, недокументированные описывать не буду ).
Цитата:
И по поводу привязки. Вы имели ввиду, что сертификат установленный в хранилище на компьютере будет иметь привязку только к одному контейнеру? Если да, то нам надо установить сертификат только в контейнер закрытого ключа.
Да, я писал именно о привязке с сертификата установленного в хранилище MY на контейнер. В любом случае, установка сертификатов во все контейнеры - "ничего страшного" не принесет.
Цитата:
P.S. У меня есть еще несколько вопросов к вам, но я и так уже отклонился от темы топика, поэтому думаю лучше задать их в отдельной теме.
К Вашим услугам Angel
С уважением, Александр.
Offline chikory  
#13 Оставлено : 7 января 2013 г. 9:23:02(UTC)
chikory

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

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

Добрый день.
Чтобы не плодить тем, осмелюсь задать вопрос тут.
Не подскажите ли каким образом через криптопро .net можно получить следующую цепочку носитель->контейнер->сертификат?
Задача вести учет таких связок. По этому функции списка носителей, контейнеров на каждом носителе и сертификатов в них были бы весьма удобны.
Я понял из общения выше, прямого способа через .net пока что нет.
Offline maxdm  
#14 Оставлено : 10 января 2013 г. 0:41:57(UTC)
maxdm


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

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

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Подобного api нет. Принятые абстракции для CSP - контейнеры, для ОС - сертификаты, от последних и стоит отталкиваться.
Offline chikory  
#15 Оставлено : 11 января 2013 г. 14:34:36(UTC)
chikory

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

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

Т.е. я полагаю, чтобы по сертификату узнать серийный номер носителя на котором он записан, нужно через P\invoke получить список носителей и имена контейнеров, затем по сертификату выяснить имя контейнера для сертификата и сопоставить (может есть более простой способ?)
Просмотрел темы на форуме где используют функцию CryptGetProvParam(hProv, PP_ENUMREADERS, sb, ref pdwDataLen, dwFlags). Опробовал ее. список контейнеров получить у меня вышло, а вот список считывателей не получается, не подскажите в чем моя ошибка, или может быть уже была тема с разъяснением?

Пишу на c#:

Код:

      
        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool CryptGetProvParam(
        IntPtr hProv,
        uint dwParam,
        [In, Out] byte[] pbData,
        ref uint dwDataLen,
        uint dwFlags);

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool CryptGetProvParam(
        IntPtr hProv,
        uint dwParam,
        [MarshalAs(UnmanagedType.LPStr)] StringBuilder pbData,
        ref uint dwDataLen,
        uint dwFlags);
        
        [DllImport("advapi32.dll")]
        public static extern bool CryptReleaseContext(
        IntPtr hProv,
        uint dwFlags);

        const uint PP_ENUMREADERS = 114;
        const uint CRYPT_FIRST = 0x00000001;
        const uint PROV_RSA_FULL = 0x00000001;
        static uint CSPKEYTYPE = 0;	//default is CU keystores

Отредактировано пользователем 11 января 2013 г. 14:43:43(UTC)  | Причина: Не указана

Offline chikory  
#16 Оставлено : 11 января 2013 г. 14:44:35(UTC)
chikory

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

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

public string[] GetReaderNames()
{
int BUFFSIZE = 512;
ArrayList readernames = new ArrayList();
uint pdwDataLen = 0;
String provider = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
IntPtr hProv = IntPtr.Zero;
uint dwFlags = CRYPT_FIRST;



StringBuilder sb = null;
CryptGetProvParam(hProv, PP_ENUMREADERS, sb, ref pdwDataLen, dwFlags);
BUFFSIZE = (int)(2 * pdwDataLen);
sb = new StringBuilder(BUFFSIZE);

/* ---------- Get KeyContainer Names ------------- */
while (CryptGetProvParam(hProv, PP_ENUMREADERS, sb, ref pdwDataLen, dwFlags))
{
dwFlags = 0; //required to continue entire enumeration
readernames.Add(sb.ToString());
}
if (hProv != IntPtr.Zero)
CryptReleaseContext(hProv, 0);

if (readernames.Count == 0)
readernames.Add("0 штук");

return (string[]) readernames.ToArray(Type.GetType("System.String"));
}

Ну и плюс функция которая вызывает метод

Отредактировано пользователем 15 января 2013 г. 15:31:54(UTC)  | Причина: Не указана

Offline chikory  
#17 Оставлено : 16 января 2013 г. 13:30:17(UTC)
chikory

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

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

Разобрался, указывал не совсем те параметры и не совсем те значения.
Offline chikory  
#18 Оставлено : 17 января 2013 г. 9:50:50(UTC)
chikory

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

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

Не подскажите пример как через p\invoke, зная имя контейнера, извлечь сертификат?
Offline Андрей *  
#19 Оставлено : 17 января 2013 г. 10:04:45(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Автор: chikory Перейти к цитате
Не подскажите пример как через p\invoke, зная имя контейнера, извлечь сертификат?


По списку установленных сертификатов в цикле пройти и сверить информацию по контейнеру ... (?)
Offline chikory  
#20 Оставлено : 17 января 2013 г. 10:20:59(UTC)
chikory

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

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

Автор: Андрей * Перейти к цитате
Автор: chikory Перейти к цитате
Не подскажите пример как через p\invoke, зная имя контейнера, извлечь сертификат?


По списку установленных сертификатов в цикле пройти и сверить информацию по контейнеру ... (?)


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