c# - sslStream.AuthenticateAsServer 忽略 RemoteCertificateValidationCallback

标签 c# ssl certificate

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

这是一个接受 SSL/TLS 连接的 TCP 服务器。正如预期的那样,在端口 443 上运行。它用于响应 Yealink 配置请求。您可以在手机中弹出 url,它会获取设置等(反正不重要。)

问题是,当旧手机请求此服务时,它可以正常工作,但现在,自从新版本的手机以来,它就不起作用了。

这是最后的代码:

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: the certificate chain was issued by an authority that is not trusted.

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

我不知道(也永远不会知道)用户手机发送的证书类型。

证书“cert.pfx”(我的证书)是从 DigiCert 购买的(它是一个通配符证书)。它是用密码导出的,哦,是的,我有没有提到这在所有常规浏览器和旧手机上都可以正常工作……只是 Yealink 的新手机不行。

我如何才能跳过整个身份验证过程,我只想让它工作,而不是公共(public)系统?对于新手机,“RemoteCertificateValidationCallback(AcceptAllCertifications)”永远不会被调用,我已经用调试器跟踪了它,它完全被跳过了。

编辑: Certificate Checker

最佳答案

我刚刚阅读了中间证书(我的内存在上面的早期评论中失败了)并且我想我知道问题是什么:您的手机已经信任信任链顶部的 DigiCert 根证书,但您的服务器和您的手机对证书实用程序显示的中间证书一无所知。除了拥有私钥的服务器证书之外,您还需要在服务器上安装中间证书的公钥。这是一个有用的链接,更详细地解释了中间证书的功能:SSL Installing Intermediate Certificates

我引用:

The intermediate certificate, or certificates, completes the chain to a root certificate trusted by the browser. During SSL negotiation, the server sends the trust chain to the client to assist the client in building and verifying the trust chain.

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

关于c# - sslStream.AuthenticateAsServer 忽略 RemoteCertificateValidationCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358002/

相关文章:

c# - SQL 创建触发器命令通过 MySQL Workbench 运行良好,但通过 Entity Framework 调用时出错

c# -> Kafka 通过 TLS : "The message received was unexpected or badly formatted"

amazon-web-services - AWS CDK Python - 使用 Route53 的证书管理器 DNS 验证

ssl - 证书错误DLG_FLAGS_SEC_CERT_CN_INVALID

c# - 如何获取 Web 浏览器元素的 css 样式?

c# - 在 Windows 窗体中隐藏和重新显示面板/组件

c# - 如何在 C# 中找到 Windows Phone7 应用程序的应用程序 contentIdentifier?

c++ - OpenSSL 在 C++ 中验证对等(客户端)证书

java - 如何定义(在 Java 中)服务器使用哪种加密协议(protocol)(SSL 或 TLS)?

windows - LogonSessionId 帐户在新证书中分配了读取权限?