【问题标题】:Why can I access a website using Firefox or WGET, but I can't using CURL or Ruby为什么我可以使用 Firefox 或 WGET 访问网站,但无法使用 CURL 或 Ruby
【发布时间】:2026-02-20 01:10:02
【问题描述】:

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

一些附加信息:

  • 本地机器:Linux debian 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64 GNU/Linux
  • 本地机器OpenSSL版本:OpenSSL 1.1.1d 10 Sep 2019
  • 服务器加密:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 256bit keys, TLS 1.
  • 服务器最可能的 SSL/TLS 实现(使用 tls_prober
                                 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,而其他工具返回 SSLError '错误的签名类型'?

【问题讨论】:

    标签: ruby ssl curl openssl wget


    【解决方案1】:

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

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

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

    【讨论】:

    • 好东西。但是在哪里做呢?人们需要用来执行此操作的菜单上是否有配置文件或配置选项? (我知道每个软件可能会有所不同,请问 CURL 该怎么做?)谢谢,祝大家好运。
    • 对于 SNI whith CURL 的使用,这个问题已经在另一个 SO topic 上得到了回答。对于服务器端(修复默认证书),这取决于您使用 Web 服务器的软件,在 apache2 端,请注意虚拟主机配置。
    • 感谢您的回答,没想到对 SNI 的介绍如此精彩。如果我做对了(我怀疑),如果有多个网站在这个 IP 上运行,管理员必须通过将其证书设置为默认证书来优先处理一个网站,以防客户端不支持 SNI?我想一旦我找到如何捕获和比较 TLS 握手与 curl、wget 和 Ruby,我就会有更好的理解。再次感谢!