3

我正在尝试使用 .Net System.Security.SslStream 类来处理带有客户端身份验证的 SSL/TLS 流的服务器端。

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

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

不幸的是,这会导致 SslStream 传输一个 CertificateRequest,其中包含我的 CryptoAPI Trusted Root Store 中所有证书的主题名。

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

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

有任何想法吗?

4

3 回答 3

3

目前使用 .NET 库似乎无法做到这一点。

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

于 2008-09-15T12:10:32.083 回答
2

证书验证所做的是验证链中的所有证书。为了真正做到这一点,它只需联系每个证书的根存储。

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

于 2008-09-10T15:07:38.097 回答
1

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

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

于 2008-09-10T17:15:58.740 回答