Как указать принятые сертификаты для проверки подлинности клиента в .NET SslStream

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать класс .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).В составе этого сообщения сервер отправляет имена центров сертификации, которые он примет в качестве эмитентов клиентского сертификата.Это тот список, который по умолчанию содержит все доверенные корни в магазине.

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

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