Импортировать сертификат с закрытым ключом программно - PullRequest
12 голосов
/ 01 мая 2009

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

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

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

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

Ответы [ 3 ]

28 голосов
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

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

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

0 голосов
/ 01 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...