【问题标题】:Overwritten SSL certificate working on browser but not working in C#覆盖的 SSL 证书在浏览器上工作但在 C# 中不工作
【发布时间】:2020-01-14 21:08:55
【问题描述】:

由于 SSL 证书覆盖,我的 C# 应用程序无法连接到我们公司网络中的 url。怎么解决?

我有一个 Web 应用程序在两个单独的服务器上运行,每个服务器都绑定到不同的子域。类似的东西;

  • 应用程序:WebApp,服务器:1.2.3.4,主机名:a.myapp.com
  • 应用程序:WebApp,服务器:5.6.7.8,主机名:b.myapp.com

通常,我的本地 C# 应用程序可以通过 subdmoain 与两台服务器进行交互,而不会出现任何问题。但是,当 PC 连接到公司网络时,本地 C# 应用程序可以连接到绑定到子域 a.myapp.com 的 Web 应用程序,但无法连接到运行在 b.myapp.com 上的 Web 应用程序(接收超时错误)。我认为这是因为公司重写了现有的 SSL 证书并注入了自己的 SSL 证书。

请注意,我可以通过浏览器(chrome 和 IE)进行连接,没有任何问题。

到目前为止我已经尝试过;

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;

 var handler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
            };
var client = new HttpClient(handler);

没用。

问题是,为什么浏览器可以毫无问题地连接,但 System.Net.Http.HttpClient 收到超时?有什么方法可以模拟 HttpClient 中的浏览器证书流?

【问题讨论】:

  • 什么是“SSL证书覆盖”?
  • @John 这是公司重写网站现有 SSL 证书的时候。通常,网站 SSL 证书由 LetsEncrypt 颁发。但是,当我连接到公司互联网并访问网站并检查证书时,我看到“CompanyCA”作为证书颁发者。这意味着,公司使用自己的证书,因为证书颁发者已更改。我认为 SSL 证书覆盖是正确的术语。
  • 哦,所以公司在所有机器上都安装了自己的证书,并且有一个代理服务器可以剥离现有的SSL并替换他们自己的证书?
  • @John 设备连接网络时安装。是的,公司用自己的证书代替。
  • 如果是因为ssl,它不会给出超时错误作为它无法通信的原因。这就是为什么您尝试禁用 ssl 检查不起作用 - 因为它不是问题。我怀疑该网站前面有一些东西(我认为是防火墙)认为您的请求是恶意的并立即断开连接,请仔细检查您的应用程序在抛出错误之前等待多长时间。如果它在开始请求后立即出错,那么它可能会导致我的理论。请尝试使用postman 或更好的curl 来模仿您的应用请求。

标签: c# ssl-certificate


【解决方案1】:

问题出在公司防火墙上。显然,防火墙在 .net 客户端应用程序和服务器之间的 SSL 握手期间丢弃了包。这是因为 .net 客户端默认使用 SChannel 密码套件,并且在防火墙上必须有这些密码套件的规则。唯一的方法定制 .net SSL 密码套件正在使用 Bouncy castle。手动设置 SSL 密码套件后,它起作用了。

Used this stackoverflow question as reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2015-06-17
    • 1970-01-01
    • 2019-08-26
    • 2014-03-27
    • 2021-05-10
    相关资源
    最近更新 更多