Как указать принятые сертификаты для аутентификации клиента в .NET SslStream - PullRequest
3 голосов
/ 10 сентября 2008

Я пытаюсь использовать класс .Net System.Security.SslStream для обработки серверной части потока SSL / TLS с помощью аутентификации клиента.

Для выполнения рукопожатия я использую этот код:

SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);

К сожалению, это приводит к тому, что SslStream передает запрос CertificateRequest, содержащий имена всех сертификатов в моем хранилище доверенных корней CryptoAPI.

Я бы хотел изменить это. Я не могу требовать от пользователя установки или удаления сертификатов из доверенного корневого хранилища.

Похоже, что SslStream использует SSPI / SecureChannel, поэтому, если кто-нибудь знает, как сделать эквивалент с этим API, это тоже будет полезно.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2008

Не похоже, что в настоящее время это возможно при использовании библиотек .NET.

Я решил эту проблему с помощью реализации библиотеки классов Mono System.Security.SslStream, которая дает лучший доступ к переопределению поведения серверов во время рукопожатия.

1 голос
/ 10 сентября 2008

То, что делает проверка сертификата, проверяет все сертификаты в цепочке. Для того, чтобы действительно сделать это, достаточно связаться с корневым хранилищем каждого из этих сертификатов.

Если вы этого не хотите, вы можете развернуть свой собственный корневой каталог локально.

0 голосов
/ 10 сентября 2008

Это не часть проверки, которую я хочу изменить. Проблема заключается в начальном рукопожатии, сервер передает сообщение, информирующее клиента о необходимости аутентификации клиента (то есть сообщение CertificateRequest). Как часть этого сообщения, сервер отправляет имена CA, которые он примет в качестве издателей клиентского сертификата. Это тот список, который по умолчанию содержит все доверенные корни в хранилище.

Но если возможно переопределить корневое хранилище сертификатов для одного приложения, это, вероятно, решит проблему. Это то, что вы имели ввиду? И если да, то как мне это сделать?

...