16.06.2006 11:32:52Установка и использование сертификата с закрытым ключом Ответов: 5
Владимир
Использую утилиту makecert для создания собственного сертификата. Есть задача установить этот сертификат на серверные и клиентские машины. На клиентской машине выполняется приложение, проверяющее с помощью сертификата подлинность ответа сервера. Соответсвенно сервер подписывает свой ответ закрытым ключом, соответствующим данному сертификату. Закрытый ключ можно при генерации сертификата с помощью makecert экспортировать в .pvk-файл. Чтобы установить на серверные машины сертификат и закрытый ключ использую приложение pvkimprt от Microsoft (можно найти на их сайте). Программка эта требует .spc-файла с сертификатом и .pvk с закрытым ключом. После установки получаем сертификат с привязанным к нему закрытым ключом. Поскольку makecert генерирует .cer-файл сертификата, а не .spc, то предварительно требуется поместить сертификат в .spc-файл с помощью утилиты cert2spc (можно найти в поставке Visual Studio). Описанная процедура, хоть и слегка замудренная, но прекрасно работает. Кстати, если кто знает более прямой способ установки сертификата с закрытым ключом, созданного с помощью makecert, на несколько серверных машин — рекомендации только приветствуются.

Но у этого способа есть один существенный для меня недостаток. pvkimprt не позволяет указать, для какой учетной записи на данной машине устанавливается сертификат и устанавливает его для текущего пользователя. Если серверное приложение запущено не как служба — то все прекрасно работает. Проблема, однако в том, что серверное приложение (в отличие от клиентского) должно запускаться именно как служба. Соответственно, сертификат нужно установить для локального компьютера, иначе серверное приложение его не находит. Попробовал при генерации сертификата задавать параметр -sr localmachine, который должен задавать хранилище сертификатов локального кмпьютера по умолчанию, но pvkimprt по-прежнему упорно устанавливает сертификат в хранилище текущего пользователя. Ладно, попробовал другой вариант — в оснастке управления сертификатами серверной машины скопировал сертификат в хранилище локального компьютера. При запуске приложение сертификат нашло (функция CertFindCertificateInStore() отработала нормально), однако при попытке подписать сообщение, CryptSignMessage() возвращает ошибку CRYPT_E_NO_KEY_PROPERTY (0x8009200B) — "Не удается найти сертификат и закрытый ключ для расшифровки.". Подозреваю, что дело в том, что закрытый ключ установлен в хранилище текущего пользователя и приложение не может его найти. Как поступить в такой ситуации? Нужно, чтобы и сертификат и его закрытый ключ были установлены в хранилища локального компьютера.
 
Ответы:
16.06.2006 13:01:12Василий
Собственно говоря, самый честный вариант - делать запрос на сертификат именно с той машины, где сертификат (и секретный ключ, соответствующий ему) будет использоваться. Далее запрос можно передать на ЦС на обработку (можно в онлайне, через веб-интерфейс ЦС), после получения сертификата установить его (в онлайне это готовая ссылка на странице, в оффлайне - установить из файла *.cer - при установке можно выбрать хранилище Личные локального компьютера.
Либо - проделать эту процедуру на одном сервере, дальше сохранить сертификат с ключом в pvk (например, через оснастку mmc "Сертификаты") и установить на прочих серверах.
Или требуется автоматизация процесса? Хотя, серверов и их сертификатов не должно быть много...

Примечание такое - ГОСТовые сертификаты, сделанные КриптоПро CSP, нельзя экспортировать в файлы вместе с закрытым ключом (по требованиям безопасности).
16.06.2006 14:45:40Владимир
"в оффлайне - установить из файла *.cer - при установке можно выбрать хранилище Личные локального компьютера."

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

Что касается ЦС - нет желания с этим связываться, лучше без него обойтись (да и не стоит оно того, серверов немного и сертификаты меняться будут редко)
16.06.2006 17:55:39Василий
Установить можно через оснастку mmc Сертификаты (локального компьютера).

По поводу нежелания использовать ЦС - Ваше право, конечно, но мне кажется, сложнее именно без ЦС. Причём, не только выпускать и устанавливать, но и в дальнейшем управлять этими сертификатами.
16.06.2006 18:01:22Владимир
Ок, устанавливать сертификат можно через саму оснастку. А как быть с файлом .pvk, содержащим закрытый ключ? Его как устанавливать в таком случае?
16.06.2006 18:15:24Василий
А так же - через эту же оснастку, импортом