Импортирование сертификатов

Добрый день.
Возникла необходимость импорта сертификатов из файлов *.p7b.
Есть утилита Cert2Cont, но нужно чтоб утилита запускалась с командной строки.
Или возможно у вас есть какой нибудь класс, в котором это реализовано (VC++ SDK).

Re: Импортирование сертификатов

Добрый день.

Уточните, пожалуйста, задачу.

Дело в том, что утилита Cert2Cont, по средствам CryptoAPI позволяет импортировать на Rutoken сертификат в контейнер, открытый ключ в котором, соответствует открытому ключу сертификата.
Хранить сертификаты отдельно от ключевой пары на Rutoken на данный момент нет возможности.

Если в контейнере p7b находится один сертификат, а на токене есть контейнер соответствующий сертификату, то сертификат можно загрузить программно во временное хранилище. Потом выгрузить в der или base64 кодировке и потом импортировать в токен при помощи Cert2Cont (она есть в консольном исполнении) либо rtCert.

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

В Rutoken SDK таких функций нет - это стандартная функциональность, которая присутствует в Windows SDK.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

(2010-06-02 08:41:02 отредактировано Bolat)

Re: Импортирование сертификатов

1) Создаем запрос сертификата,  в этот момент на токене формируется контейнер и файл запроса.
   certreq -new... .
2) Командой certreq -submit -f -q -config "\\cert\***" %1 *.cer *.p7b, мы формируем два файла
    *.cer формат X509 Base64 - encoded
    *.p7b  -   pkcs7 Base64 - encoded
   После того как у нас на токене создался контейнер (пункт 1) и файл *.cer (X509 Base64) - мы утилитой        Cert2Cont пытаемся загрузить сертификат, из файла *.cer, в существующий контейнер.
Но он на токен не загружается.

Где можно получить Cert2Cont в консольном исполнении.

Re: Импортирование сертификатов

Отображается ли контейнер без сертификата, как доступный к выбору для импорта сертификата?
Какую ошибку выдает Cert2Cont при попытке импорта серитификата?

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Добрый день.
С Cert2Cont разобрались.
В момент отсылки запроса к серверу поставили ключ -binary
certreq -submit -f -binary -config "\\cert\test.kg"1.req 1.cer 1.p7b
теперь сертификаты на выходе формируются в бинари формате и записываются утилитой Cert2Cont. Так же мы получили SDK и скомпилировали консольную утилиту Cert2Cont.
Теперь вопрос в следующем как можно установить контейнер по умолчанию, не через rtCert.exe, а через какую либо консольную утилиту, либо через функции, реализованные в вашем SDK?

Re: Импортирование сертификатов

Это можно сделать по средствам rtCSP - "Aktiv ruToken CSP v1.0".
1. CryptAcquireContext( ... имя контейнера ... );
Имя контейнера можно указать как полное (с именем ридера), так и короткое (только имя).
Если Rutoken c указанным контейнером не подключен будет отображен диалог с предложение подключить токен с указанным контейнером.
Если нужен Silent режим, тогда необходимо передать флаг CRYPT_SILENT. В этом случае, если токен не подключен будет возвращена ошибка NTE_BAD_KEYSET.
2. CryptSetProvParam ( ... PP_RTCSP_SET_DEF_CONT ... );
#define PP_RTCSP_SET_DEF_CONT 0x10009
Если в CryptAcquireContext не был передан флаг CRYPT_SILENT, то будет запрошен PIN пользователя.
Если нужен silent режим, тогда предварительно нужно вызвать:
CryptSetProvParam( ... PP_SIGNATURE_PIN ... ), где в качестве данных pbData надо передать PIN пользователя в ANSI кодировке, с завершающим терминатором NULL.
3. CryptReleaseContext.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Добрый день.
1)Не могли бы вы привести небольшой пример с использованием данных функций.
Не совсем понятно какие параметры принимают эти функции.

В вашем SDK нашел пример с CryptAcquireContext, но там создается новый контейнер.

2) Как можно получить список контейнеров на токене.

Re: Импортирование сертификатов

В MSDN Library есть примеры по всем этим функциям.
В частности перебор контейнеров осуществляется по средствам функции CryptGetProvParam(... PP_ENUMCONTAINERS ... ) - http://msdn.microsoft.com/en-us/library … S.85).aspx

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Спасибо со списком контейнеров разобрались.

По этой ссылке не нашел, что у CryptSetProvParam есть параметр PP_RTCSP_SET_DEF_CONT http://msdn.microsoft.com/en-us/library … S.85).aspx

Re: Импортирование сертификатов

Да, этот параметр не указан в документации MSDN, а является пользовательским расширением Aktiv Rutoken CSP v1.0.
PP_RTCSP_SET_DEF_CONT - это наша внутренная константа.
Изменять мы ее никогда не будем, и поэтому ее можно использовать конечным клиентам.
Для использования, у себя в коде достаточно объявить константу #define PP_RTCSP_SET_DEF_CONT 0x10009.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Добрый день.
Не получается импортировать сертификат из cer файла в контейнер с помощью консольной утилиты certt2cont.exe.
Перед выполнением cert2cont.exe логинимся с правами пользователся в утилите "Администрирование ruToken".
Тот же самый суртификат из cer файла успешно импортируется графическим cert2cont.
Выводится ошибка, приведенная ниже.

C:\rutoken\Cert2Cont.exe /p "Aktiv ruToken CSP v1.0"
Rutoken project| 2008  (C) Aktiv Co. | www.rutoken.ru
Welcome to "Certificate import to container utility".

Selected CSP: "Aktiv ruToken CSP v1.0".
CSP type is 1.

Select container:
[0] - 87f6230f-12b7-4853-b021-c2113f9129cc
0
Selected container: "87f6230f-12b7-4853-b021-c2113f9129cc".
Enter der-certificate file name:
"hello2.cer"
ERROR - CreateFile; Error code: 0x7B
ERROR Description: ?????????????? ?????? ? ????? ?????, ????? ????? ??? ????? ????.

Error occurred.
Press Enter to exit.

Re: Импортирование сертификатов

Добрый день.

Ошибка, возвращаемая из консольного cert2cont в WinError.h имеет такое описание:

// MessageId: ERROR_INVALID_NAME
//
// MessageText:
//
// The filename, directory name, or volume label syntax is incorrect.
//
#define ERROR_INVALID_NAME               123L    // dderror

Имя файла не может содержать кавычки - скорее всего дело в них.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Указал файл без кавычек, теперь следующая ошибка.



Selected container: "608c6ff4-b74d-4db2-b228-2663bc26d441".

Enter der-certificate file name:

Hello10.cer

ERROR - Certificate not corresponds with public key in container.

Error occurred.

Press Enter to exit.



Хотя с помощью графического Cert2Con с этого же файла сертификат в контейнер загружается.

Re: Импортирование сертификатов

У Вас, видимо достаточно не актуальная версия консольной версии Cert2Cont.
Раньше сравнение было сделано не корректно, сейчас это исправлено.

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

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"

Re: Импортирование сертификатов

Отправил Вам на email актуальную консольную версию Cert2Cont.

Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания "Актив"