当我curl
从命令行运行时
curl "https://example.com"
它立即成功并返回请求的结果。
当我运行相同的 wget 命令时
wget https://example.com
它最终超时并显示“无法建立 SSL 连接”,没有任何具体错误消息。它连接了,但无法进行 SSL 握手。我试过了,--no-check-certificate
但没什么效果 - 似乎与超时有关。
然而:
wget http://example.com
运行良好(HTTP 与 HTTPS)。
这也影响了PHP 的“ file()
”方法调用。
我的问题是,是什么原因导致 curl 能够成功检索页面(针对我们域中的所有站点),但 wget 或 php 解释器却无法检索?这是周末出现的新问题,之前服务器都很好。
(操作系统为Red Hat Enterprise Linux 6.4)
答案1
这似乎是选择 SSL 协议时出现的问题。出于某种原因,服务器对协议很挑剔。有些客户端碰巧猜对了,有些则猜错了。
使用wget
,例如尝试--secure-protocol=tlsv1
或--secure-protocol=sslv3
。有关更多详细信息,请参阅GNU Wget 手册页。
使用 PHP,请参阅这个问题。
答案2
在 Red Hat Enterprise Linux 6.x 及之前的主要版本中,wget
不支持服务器名称指示,这是正确访问越来越多受 TLS/SSL 保护的网站(可能包括您的网站)所必需的。另一方面,curl
RHEL 6 确实支持 SNI。
Red Hat 已意识到此问题和在 RHEL 6.6 中发布了修复。该问题也在 RHEL 7.0 中得到修复。
答案3
从表面上看,这当然没有什么意义。第一步是确认 wget 是否适用于 ssl(您可以使用 wget 访问其他 ssl 站点吗?)。
如果不是:将其作为 wget 问题进行追踪
(请注意,如果您使用 wget 尝试了四个不同的 SSL 站点,其中两个中断了,那么这仍然是 wget 问题)
另一种诊断:浏览器对 https url 做了什么?(chrome 和 ffox)——它们会发出警告还是干净地连接?
答案4
Centos 6.5 上的 wget 最新版(1.15)
我必须编译 wget 1.15,然后替换 yum 的 wget
wget http://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz
tar -zxvf wget-1.15.tar.gz
cd wget-1.15
./configure --prefix=/usr/local/bin --with-ssl=openssl
# replace wget, confirm
cp /usr/local/bin/wget /usr/bin/wget