为什么我可以使用 Firefox 或 WGET 访问网站,但不能使用 CURL 或 Ruby

Why can I access a website using Firefox or WGET, but I can't using CURL or Ruby

当我尝试访问 this website 时,根据我使用的工具,我得到了不同的结果:CURL 和 Ruby 的 Net::HTTP 模块都 returns a SSLError wrong signature type。虽然我没有详尽地测试访问它的每一种方式,但我想知道是什么导致了这种差异。我的猜测是对 TLS 的不同支持,好像某些工具在面对旧的 TLS 版本时更宽容。

一些附加信息:

                                 OpenSSL 1.0.1e-48.el6_8.1 RHEL 6:  95.93%
                             OpenSSL 1.0.1e-42.el6_7.4 RHEL 6.7.z:  95.93%
                          OpenSSL 1.0.1e-30.el6_6.12 RHEL 6.6.AUS:  95.93%
                              OpenSSL 1.0.1h default source build:  95.83%
                          OpenSSL 1.0.1e-16.el6_5.16 RHEL 6.5.AUS:  92.88%
                               OpenSSL 1.0.1 default source build:  92.54%
                                   OpenSSL 1.0.1k Debian 8 Apache:  91.67%
                              OpenSSL 1.0.1g default source build:  91.67%
                               OpenSSL 1.0.2 default source build:  90.51%
                              OpenSSL 1.0.1a default source build:  87.50%

谁能给我一个高层次的解释,为什么有些工具得到 200OK,而另一些工具 returns SSLError 'wrong signature type'?

您常用的网络浏览器和 CURL(以及其他一些浏览器)之间的区别在于 SNI 的使用 (Server Name Indication)。总而言之,SNI 是客户端将在请求中发送的信息,用于告诉服务器他正在访问哪个域,它允许您在同一 IP 地址上配置多个网站,但也可以配置不同的证书。

从您网站上的 SSLLab test 来看,您域的证书(使用 SNI 时提供)是好的,但默认证书(未提供 SNI 时)无效。这就是为什么您仅在特定软件上出现错误。

因此您需要修复默认证书,为默认网站使用有效的证书(如果此服务器托管多个网站),或使用相同的证书(如果您在此服务器上只有此网站)。