我正在尝试编写一个客户端 - 服务器库,让我的LAN计算机相互通信。由于这主要是一种自我教育尝试,我试图通过SSL进行这些连接。我的计划是维护一台主机,让每个客户端为主机维护一个经过相互认证的System.Net.SslStream实例。主机代码(粗略地说)看起来像这样(为简洁省略了错误处理):
SslStream newStream = null;
newStream = new SslStream(this.client.GetStream(), false);
newStream.AuthenticateAsServer(
this.Certificate as X509Certificate,
true,
System.Security.Authentication.SslProtocols.Tls,
false);
if (!(
newStream.IsMutuallyAuthenticated &&
newStream.IsEncrypted &&
newStream.IsSigned))
{
throw new AuthenticationException("Authentication results unsatisfactory.");
}
在此,this.Certificate
是X509Certificate2。客户端代码如下所示:
SslStream connectionStream = new SslStream(this.client.GetStream(), false);
connectionStream.AuthenticateAsClient(
this.ServerHostname,
new X509CertificateCollection(new X509Certificate[] { (X509Certificate)this.Certificate }),
SslProtocols.Tls,
false);
if (!(
connectionStream.IsEncrypted &&
connectionStream.IsMutuallyAuthenticated &&
connectionStream.IsSigned))
{
throw new AuthenticationException("Authentication results unsatisfactory");
}
我已按照this post's instructions生成了客户端和服务器证书,并在客户端和服务器上将root权限安装到本地计算机的受信任机构中。然后,我为客户端和服务器生成证书,将.cer文件的副本放在客户端/服务器可访问的位置(加载以获取X509Certificate对象),并在各个计算机的个人存储中安装私钥。现在,当客户端和服务器在同一台机器上时,一切正常。但是当我生成一个新的证书并将其放在第二台机器上时,客户端和服务器现在无法进行相互身份验证。连接已设置,加密和签名,但IsMutuallyAuthenticated为false。我怎样才能解决这个问题?我做错了什么?
编辑:LocalCertificateSelectionCallback和另一个回调告诉我客户端找到一个本地证书,这是我的,没有远程证书,也没有可接受的发行者。我的证书已从本地证书选择中选择并返回。客户端端没有SSL策略错误,在主机端,我仍然获得RemoteCertificateNotAvailable。用Wireshark嗅探这个事务,我看到一个标准的TCP握手,接着是几百个字节的乱码,其中包括主机证书的名称,然后是标记事务结束的FIN,ACK数据包。因此,即使由LocalCertificateSelectionCallback例程选择了客户端证书,也确实没有发送客户端证书。什么可能导致这个?我该如何解决?
答案 0 :(得分:0)
SSLStream的构造函数具有RemoteCertificateVAlidationCallback参数。它应该有所帮助。