我有以下的C#客户端代码,用于检查在SSL通信(使用WCF)中传入的证书:
private bool ValidateClientCertificate(System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
_certificateValid = sslPolicyErrors == System.Net.Security.SslPolicyErrors.None ? true : false;
return true;
}
进入该方法时,我可以看到sslPolicyErrors被设置为RemoteCertificateNameMismatch?
我是这样创建服务器证书的:
1. 在Server 1上创建MyCert根CA 2. 请求在Server 2上创建的子CA证书,并将其发送到Server 1以便签发 3. 在Server 2上安装已签发的MyCert CA(子CA)证书 4. 使用MyCert CA从Server 2请求Server 1上的函数证书 5. 在Server 1上安装MyCert Services Server 1并将其绑定到服务 6. 在客户端上安装MyCert根CA和MyCert CA,并检查它是否验证整个3级链 7. 启动客户端并连接到Server 1上的服务
因为MyCert Services Server 1的请求是在Server 1上创建的,而它也已经安装在Server 1上,所以我不应该收到SSL错误,对吧?是否需要在函数证书上设置任何属性或其他内容以针对Server 1进行验证?
据我所知,名称不必与服务器相同?
编辑:我创建了一个新的函数证书,并将CN设置为服务器本身的DNS名称。每台客户端计算机都有一个主机文件,将此CN名称指向服务器的特定IP。然而,仍然在ValidateClientCertificate方法中收到相同的SSL策略错误?需要在证书上设置什么设置才能通过验证?
ValidateClientCertificate()
,我想提醒一下:尽管变量_certificateValid
的状态是正确的,但如果返回true
,连接将建立,即使证书是 无效 的。在大多数情况下,允许无效证书是不可取的。 - James