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

StackOverflow https://stackoverflow.com/questions/812105

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top