我在装有 nginx/1.10.0 + letsencrypt 的 ubuntu 服务器(16.04)上有多个站点。
SSL 在浏览器中运行良好且完美。但我们的开发人员应用程序使用 curl 请求(带 SSL),它面临错误,如下所示
Update Failed: Download failed. cURL error 51: SSL: certificate subject name 'domain2.com' does not match target host name 'domain1.com'
使用 SSLLABS 检查后,显示 A_grade,但正在加载多个证书(同一服务器中另一个域的证书)
Certificate #1: RSA 2048 bits (SHA256withRSA)
和
Certificate #2: RSA 2048 bits (SHA256withRSA) No SNI
在第二个证书下,出现以下错误。
Common names domain2.com MISMATCH
Trusted No NOT TRUSTED
Curl 错误也提到了第二个域名。
cURL error 51: SSL: certificate subject name 'domain2' does not match target host name 'domain1'
domain2 是完全不同的站点。不知道 nginx 如何将其信息与 domain1 一起发送。
我还通过使用 Letsencrypt SSL 创建域在其他服务器中测试了同样的场景,并且都存在同样的问题。使用 SSLlabs 检查时ssllabs 检查器它能够与域 1 一起获取域 2 的证书详细信息。仍然域 1 等级为 A。在所有其他检查站点上也是安全的。
如果我使用 SSLlabs 检查域 2,它将获取位于同一服务器中的任何其他域的证书。(但如果有域 A、B、C、D,则其中一个域 SSL 检查将仅获取一个证书。这不是问题,所有其他域都会有此问题。)
附上截图。(一张很长的整页截图)。我认为它会澄清这个案例 :(
**我无法在应用程序中使用不安全的 Curl 请求,这会忽略此问题并使 curl 请求成功。如果有人对此有想法,请帮忙。我花了很多时间,但仍然......
上述问题与 Wordpress 插件有关,因此无法与 curl 一起添加特定参数。(它来自 WP 核心)
提前致谢。
答案1
使用的 curl 版本似乎缺少基本信噪比支持。当多个带有 SSL 的域名托管在同一个 IP 地址上时,SNI 是必需的。
你基本上有三个选择:
- 将 curl 更新为支持 SNI 的版本。
对此的支持在版本 7.18.1 中引入。 - 在客户端上自行添加主机参数:
-H "Host: domain1.com"
- 移动域名以使用不同的 IP 地址。这样就无需在客户端上进行任何更改。