【问题标题】:Override HTTPS certificate覆盖 HTTPS 证书
【发布时间】:2017-12-13 15:57:12
【问题描述】:

我正在使用 URL 连接使用 SOAP 的 Web 服务。显然该 URL 没有正确的 https 协议,如果我想通过浏览器访问它,我需要接受此连接的“风险”。

当我想以编程方式访问时,我的问题就开始了。当我尝试发送 SOAP POST 请求时,连接已关闭并捕获到异常。

“底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。”

显然这个问题很常见,可以找到很多资源,thisthis 是最受好评的。

当我尝试这部分代码时:

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

不仅连接不起作用,而且现在给我一个:

“远程服务器返回错误:(500)内部服务器错误。”

现在我的问题是。上面的代码将协议从https切换到http

如果不是,这行代码到底做了什么?

【问题讨论】:

  • "连接不工作,但现在我得到一个:"远程服务器返回一个错误:(500) 内部服务器错误。"实际上这意味着连接 did 工作,但是远程服务器在尝试处理请求时崩溃了。
  • "上面的代码将协议从https切换到http?"不。代码意味着用于您请求的 http 堆栈将忽略任何证书验证错误,并让请求通过。值得考虑的是,正如所写,这将影响对所有主机的所有请求。
  • @spender 我有很多连接,但它们都在同一个主机上,所以我不必担心。所以基本上那段代码正在发挥它的作用,并且不会以任何方式“改变” URL 或连接。那么要么我的请求不正确,要么远程服务器无法处理?
  • @ADyson 你是对的,这是一个错误的选择。虽然我没想到连接会出现 500 错误代码,但这是可以理解的。
  • @Noel 很公平。显然我们无法分辨,因为一个 500 故意混淆服务器错误以保护服务器的安全,但也许服务器不接受 http 连接?

标签: c# ssl soap https


【解决方案1】:

我不知道这是否会是你的答案,但因为它不适合发表评论......

不要绕过证书验证。您可能只需要设置正确版本的 TLS。您可以尝试通过一次使用一个而不是将它们组合在一起来尝试找到支持的最高版本。:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12

如果这不起作用,您可能需要获取证书,该证书可以是服务使用的证书,也可以是证书链中更高级别的证书。

【讨论】:

  • 我认为这是我尝试的第一个想法.. 但明天我会再试一次,因为我现在没有代码
  • 我只能尝试第一个。 Tls11Tls12 不是编译器已知的命令。
  • 您使用的是什么版本的 .net 框架?您至少需要 4.5。您可能需要更新它,因为大多数服务开始需要 TLS1.1 或 1.2。
  • 是的,我怀疑这与版本有关。当前版本是 4.0... 我有义务使用 Visual Studio 2010(因为这是我工作环境中唯一安装的)。我想我现在会坚持绕过安全协议。
  • 如果问题出在 TLS 上,那是行不通的,因为那是服务器端的。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2014-09-02
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2011-10-18
相关资源
最近更新 更多