Как указать принятые сертификаты для проверки подлинности клиента в .NET SslStream
Вопрос
Я пытаюсь использовать класс .Net System.Security.SslStream для обработки серверной части потока SSL/TLS с аутентификацией клиента.
Чтобы выполнить рукопожатие, я использую этот код:
SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);
К сожалению, это приводит к тому, что SslStream передает запрос сертификата, содержащий имена субъектов всех сертификатов в моем доверенном корневом хранилище CryptoAPI.
Я хотел бы иметь возможность переопределить это.Я не могу требовать от пользователя установки или удаления сертификатов из доверенного корневого хранилища.
Похоже, что SslStream использует SSPI/SecureChannel, поэтому, если кто-нибудь знает, как сделать эквивалент с этим API, это тоже будет полезно.
Есть идеи?
Решение
Не похоже, что в настоящее время это возможно с использованием библиотек .NET.
Я решил эту проблему, используя реализацию System.Security.SslStream библиотеки классов Mono, которая обеспечивает лучший доступ к переопределению поведения серверов во время рукопожатия.
Другие советы
Проверка сертификата проверяет все сертификаты в цепочке.Чтобы это сделать, просто обратитесь к корневому хранилищу каждого из этих сертификатов.
Если вы не хотите этого, вы можете развернуть собственное корневое хранилище локально.
Я хочу изменить не часть проверки.Проблема в начальном рукопожатии, сервер передает сообщение, информирующее клиента о том, что требуется аутентификация клиента (то есть сообщение CertificateRequest).В составе этого сообщения сервер отправляет имена центров сертификации, которые он примет в качестве эмитентов клиентского сертификата.Это тот список, который по умолчанию содержит все доверенные корни в магазине.
Но если можно переопределить корневое хранилище сертификатов для одного приложения, это, вероятно, устранит проблему.Это то, что вы имели ввиду?И если да, то как мне это сделать?