Подтвердить что ты не робот

Импортировать сертификат с секретным ключом программно

Я пытаюсь использовать класс HttpListener в приложении С#, чтобы мини-веб-сервер обслуживал контент через SSL. Для этого мне нужно использовать инструмент httpcfg. У меня есть файл .pfx с моей парой открытого и закрытого ключей. Если я импортирую эту пару ключей вручную, используя mmc в локальный магазин, все будет хорошо. Однако, если я импортирую эту пару ключей программно, используя класс X509Store, я не могу подключиться к моему мини-серверу. Обратите внимание, что в обоих методах сертификат импортируется в МОЙ магазин в LocalMachine. Как ни странно, я могу просмотреть сертификат в mmc, как только я его программно импортирую, и когда я его просмотрю, пользовательский интерфейс указывает, что для этого сертификата также доступен закрытый ключ.

Копая немного глубже, я замечаю, что когда я вручную импортирую пару ключей, я вижу, что новый файл появляется в C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, но не появляется, когда я импортирую программно. В связанной заметке, когда я удаляю вручную импортированный сертификат, он не удаляет соответствующий файл закрытого ключа из ранее упомянутого каталога.

В конечном счете, мой вопрос заключается в следующем: когда я программно добавляю сертификат в хранилище, где хранится закрытый ключ и почему он не доступен для класса HttpListener (HttpApi)?

Обратите внимание, что этот вопрос немного связан, но я не думаю, что это проблема, поскольку все это делается как один и тот же пользователь Windows: Как установить разрешение чтения в файле закрытого ключа сертификата X.509 из .NET

4b9b3361

Ответ 1

Хорошо, я понял это. Это связано с параметрами хранения ключа для объекта сертификата. Для всех, кто сталкивается с этой проблемой, убедитесь, что вы создаете объекты X509Certificate2, которые вы добавляете в хранилище, используя флаги X509KeyStorageFlags.PersistKeySet и X509KeyStorageFlags.MachineKeySet. Это заставит закрытый ключ сохраняться в месте установки машинного ключа, который требуется HttpApi (HttpListener обертывает это).

Ответ 2

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

Также вы пытались присвоить разрешение cert для учетной записи пользователя, которая используется для запуска веб-приложения? Вы можете сделать это, используя инструмент Microsoft WSE 3.0.

Ответ 3

Не совсем ответ на ваш вопрос, но здесь для ссылки других, идущих по этому пути:

Здесь есть ссылка на чат MS, который дает образец кода С# для выполнения того, что делает httpcfg, тем самым устраняя необходимость в инструменте развертывание.