为什么我会收到RemoteCertificateNameMismatch错误?

5

我有以下的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策略错误?需要在证书上设置什么设置才能通过验证?

检查证书的友好名称 - Prateek Shrivastava
关于上面的 ValidateClientCertificate(),我想提醒一下:尽管变量 _certificateValid 的状态是正确的,但如果返回 true,连接将建立,即使证书是 无效 的。在大多数情况下,允许无效证书是不可取的。 - James
2个回答

13
尝试在证书的“主题备用名称”字段中填写客户端所调用的服务器的DNS名称。当客户端系统向服务器发出请求(即“https://myserver.com:443/someaction”)时,如果公共名称或主题备用名称字段中的一个值不像“myserver.com”,则会出现此错误。如果这不能解决问题,请尝试向您的问题添加以下信息: - WCF客户端正在调用的URL - 服务器上证书的公共名称值

谢谢,问题已解决!添加了一堆不同的URL。 - Banshee
我有一个用于开发Azure虚拟机的自签名证书。名称是正确的(mymachine.westeurope.cloudapp.azure.com),主题备用名称似乎也是正确的(DNS Name=mymachine.westeurope.cloudapp.azure.com)。然而,当进行wss握手时,我收到了“RemoteCertificateNameMismatch”异常。有什么想法吗? - Alexander

0
还有第二种可能性。
您尝试调用的服务器缺少有效证书,或者证书是为其他名称颁发的。
例如,如果您使用负载均衡器,并且证书仅为其名称颁发,如果您尝试调用“底层”服务器URL而不是负载均衡器URL,您将收到此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接