如何在.NET SslStream中为客户端身份validation指定接受的证书

我试图使用.Net System.Security.SslStream类来处理具有客户端身份validation的SSL / TLS流的服务器端。

要执行握手,我使用此代码:

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

不幸的是,这会导致SslStream传输一个CertificateRequest,其中包含我的CryptoAPI受信任的根存储中所有证书的主题名。

我希望能够覆盖它。 我不能要求用户在受信任的根存储中安装或删除证书。

看起来SslStream下面使用了SSPI / SecureChannel,所以如果有人知道如何使用该API进行等效,那么这也会有所帮助。

有任何想法吗?

目前使用.NET库看起来不太可能。

我通过使用System.Security.SslStream的Mono类库实现解决了这个问题,它可以更好地访问在握手期间覆盖服务器的行为。

证书validation正在进行的是validation链中的所有证书。 为了真正做到这一点,它只需联系每个cerficates的根商店。

如果这不是您想要发生的事情,您可以在本地部署自己的根存储。

这不是我想要改变的validation部分。 问题在于初始握手,服务器发送消息,通知客户端需要客户端身份validation(即CertificateRequest消息)。 作为此消息的一部分,服务器将发送它将接受的CA的名称作为客户端证书的颁发者。 默认情况下,该列表包含商店中的所有受信任根。

但是,如果可以覆盖单个应用程序的证书根存储,那么可能会解决问题。 你是这个意思吗? 如果是这样,我该怎么做?