2008-09-10 48 views
3

我正在尝试使用.Net System.Security.SslStream类通过客户端身份验证处理SSL/TLS流的服务器端。如何在.NET中为客户端身份验证指定接受的证书SslStream

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

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

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

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

它看起来像SslStream在底下使用SSPI/SecureChannel,所以如果有人知道如何做相当于该API,这也会有所帮助。

任何想法?

回答

2

它看起来不像是目前使用.NET库的可能性。

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

1

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

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

0

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

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

+0

Rasmus,我试图解决同样的问题。你有没有找到特别的解决方案? – cdpnet 2013-06-17 05:58:42

相关问题