"The remote certificate is invalid according to the validation procedure",但仅来自同一服务器调用

"The remote certificate is invalid according to the validation procedure", but only from same server call

TLDR: 通过 https 进行的 Web 服务调用在另一台计算机上工作,但从本地服务器(本身)它给出“System.Security.Authentication.AuthenticationException,System.Net.WebException 远程证书是根据验证程序无效。

我有一个 网站(编辑:网站本身不在 https 上,仅在 http 上。它通过通过 IIS 绑定绑定到网站的 dns 名称访问.) 和一个 webservice,运行 在 serverhostnameip地址。 (我可能不被允许透露实际姓名和地址)。
公司 CA CA 颁发了 证书,具有以下属性(以及其他属性):

Issuer: CA
Subject: CN = hostname
Subject Alternative Name: IP Address =  ip-address

我删除了 IIS 中的 web 服务的 http 绑定,只留下 https。

类型 主机名 端口 IP 地址 绑定信息
https 443 ip地址

网站 使用 url:
调用 服务 https://ip地址/service.asmx
和代码:

using (WebResponse webResponse = request.GetResponse()) {
    do stuff...
}

“GetResponse()”函数连续抛出多个错误:

Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll
Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll
Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll
Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll
Exception thrown: 'System.Security.Authentication.AuthenticationException' in System.dll
Exception thrown: 'System.ObjectDisposedException' in System.dll
Exception thrown: 'System.Net.WebException' in System.dll
Exception thrown: 'System.Net.WebException' in System.dll

异常信息为:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

内部异常:

The remote certificate is invalid according to the validation procedure.

我有 网站 - website_local 的精确副本,它调用了相同的 服务。这使它成为一个远程调用(从我的电脑到 服务器 )。 它无一例外地工作。不再有 http 绑定,所以连接不可能不安全。

如果我使用 Chrome 访问“https://ip-address/service.asmx”我的电脑和 server 它说连接是安全的并且证书有效且受信任(因为 CA 证书存在于“受信任的根")

到目前为止我做了什么:

  1. 服务器上将证书放在“LocalComputer\Personal”和“LocalComputer\Trusted根证书颁发机构中“
  2. localhost 证书放入“LocalComputer\Trusted 根证书颁发机构”(它已经存在于“个人”中)
  3. 确保 CA 证书 位于“LocalComputer\Trusted 根证书颁发机构”
  4. certificate in LocalComputer\Personal did: "All tasks -> Manage private keys -> Add -> IIS_IUSRS -> Full control and Read" . (本地主机证书已有该设置)。
  5. 尝试将 url 从“https://ip-address/service.asmx”切换到“https: //localhost/service.asmx”和“https://hostname/service.asmx” - 在代码中不起作用,Chrome(我的电脑和 服务器)说,现在连接不安全并且 NET::ERR_CERT_COMMON_NAME_INVALID.

所以问题是: 为什么从我的 本地网站 调用 服务 (远程调用),但在实际 网站 调用相同的 服务 (相同的服务器调用)?

更新 1: 如果我尝试使用启用了 SSL 验证的 Postman 调用相同的服务,它会显示:“无法验证第一个证书”。 为什么它在代码中有效?
我可以向公司的 CA 申请另一个证书,但我需要规范。
有人可以详细说明吗?当前 certificate 同时具有 hostnameip-address 并且应该对该网站上的任何服务有效,不应该吗?

这就是我们最终做到的:

  1. 在企业 LAN 中注册了一个 DNS 名称;
  2. 为该特定名称颁发了新证书,没有将其绑定到服务器的 ip 地址
  3. 在 IIS 中添加了新的 dns-name 作为主机名并添加了新的证书。
  4. 将连接字符串更改为 https://dns-name/service.asmx

而且有效!

我最好的猜测是@zaitsman 关于为什么它不能在服务器本身上工作,但在我的电脑上工作的原因是正确的。

Does your certificate also have 127.0.0.1 and ::1 addresses? because most likely >when you're calling self over web underlying TCP stack just loops back after DNS >resolution.