sslStream.AuthenticateAsServer忽略RemoteCertificateValidationCallback

时间:2015-09-02 16:07:42

标签: c# ssl certificate

我正在尝试修复现有的.Net 2.0服务/应用程序。

它是接受SSL / TLS连接的TCP服务器。正如预期的那样,在端口443上运行。它用于响应Yealink配置请求。你可以弹出手机中的网址,它会获得设置等(无论如何不重要。)

问题在于,当旧手机请求此服务时,它可以正常工作,但现在,由于手机的新版本,它不起作用。

这是fials的代码:

using (SslStream sslStream = new SslStream(tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(AcceptAllCertifications)))
{
    X509Certificate c = new X509Certificate2("cert.pfx", "XXXX");
    sslStream.AuthenticateAsServer(c, false, SslProtocols.Tls, false);

    // Process request etc
}

这是" AcceptAllCertifications"

private bool AcceptAllCertifications(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}

新手机导致应用在sslStream.AuthenticateAsServer(...)上产生错误;

  

System.componentmodel.win32exception:颁发了证书链   由不信任的权威机构。

是,"证书"他们在这里提到我的证书(一个在服务器上)或他们的证书(一个从手机发送)?

我不知道(并且永远不会有任何想法)关于用户手机发送的证书类型。

证书" cert.pfx" (我的证书)是从DigiCert(它的通配证书)购买的。它是用密码导出的,哦,是的,我提到这对于所有常规浏览器和旧款手机来说绝对没问题......只不是Yealink的新手机。

我如何跳过整个身份验证的事情,我只想让它工作,它不是一个公共系统?使用新手机" RemoteCertificateValidationCallback(AcceptAllCertifications)"永远不会被调用,我已经使用调试器,它完全跳过了。

编辑: Certificate Checker

1 个答案:

答案 0 :(得分:0)

我刚刚阅读了中间证书(我的记忆在上面的早期评论中失败了)我认为我知道问题所在:您的手机已经信任信任链顶部的DigiCert根证书,但既不是您的服务器也不是您的手机知道有关证书实用程序显示的中间证书的任何信息。除了具有私钥的服务器证书之外,您还需要在服务器上安装中间证书的公钥。这是一个有用的链接,可以更详细地解释中间证书的功能:SSL Installing Intermediate Certificates

我引用:

  

中间证书或证书完成链到浏览器信任的根证书。在SSL协商期间,服务器将信任链发送到客户端,以帮助客户构建和验证信任链。

该页面还包含有关如何测试是否在Web服务器上正确安装必要的中间证书的说明。