curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
当我试图用curl(或libcurl)连接到任何服务器(如google.com)时,我得到了错误的信息:
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
详细输出:
$ curl www.google.com --verbose
* Rebuilt URL to: www.google.com/
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1,localaddress,.localdomain.com'
* Uses proxy env variable http_proxy == 'https://proxy.in.tum.de:8080'
* Trying 131.159.0.2...
* TCP_NODELAY set
* Connected to proxy.in.tum.de (131.159.0.2) port 8080 (#0)
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number'
由于某些原因,curl似乎使用了TLSv1.3,即使我用命令-tlsv1.2强制它使用TLSv1.2(它仍然会打印TLSv1.3(OUT),..."我正在使用最新版本的Curl和OpenSSL :
$ curl -V
curl 7.61.0-DEV (x86_64-pc-linux-gnu) libcurl/7.61.0-DEV OpenSSL/1.1.1 zlib/1.2.8
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy
我想这是一个与我的程序安装有关的问题。 谁能向我解释一下这个错误信息的意思吗?
* Uses proxy env variable http_proxy == 'https://proxy.in.tum.de:8080' ^^^^^
https://
是错误的,它应该是http://
。代理本身应该通过HTTP访问,而不是HTTPS,尽管目标URL是HTTPS。但代理将正确处理HTTPS连接并保持端到端加密。请参阅HTTP CONNECT method了解如何做到这一点的细节。
curl http://siteiwouldnotmention.com:443/
,我看到网站被故意阻止的信息。
- akostadinov 2021-11-22
如果有人在使用Nginx时遇到这个错误,请尝试在服务器配置中加入以下内容:
server {
listen 443 ssl;
...
}
这个问题源于Nginx向一个期望HTTPS的客户提供HTTPS服务,无论你在什么端口监听。当你在listen
指令中指定ssl
时,你可以在服务器端清除这个问题。
这是一个提示性的错误,说明你正在从HTTPS端口提供HTTP服务。
你可以很容易地用telnet进行测试
telnet FQDN 443
GET / HTTP/1.0
[hit return twice]
如果你在这里看到普通的HTTP文件[而不是某种错误],你就知道你的配置不正确,而且响应的服务器没有对响应进行SSL加密。
简单的答案
如果你在一个代理服务器后面,请为curl设置代理。打开subl ~/.curlrc或使用其他文本编辑器来设置代理。然后在文件中添加以下一行:
proxy= proxyserver:proxyport
例如,proxy = 10.8.0.1:8080
如果你不在代理服务器后面,请确保curlrc文件不包含代理服务器的设置。
还要检查你的/etc/hosts
文件。在这方面浪费了2个小时。如果你有一个网址重路由到127.0.0.1或任何其他回环,这将使ssl握手失败。
在我的案例中,这个错误的原因是我的网络服务器没有被配置为在SSL 443端口上监听IPv6。启用后,错误就消失了。
下面是你如何为阿帕奇做这件事:
<VirtualHost ip.v4.address:443 ip:v::6:address:443>
...
</VirtualHost>
而对于nginx来说:
listen 443 ssl http2;
listen [::]:443 ssl http2;
感谢@bret-weinraub的帮助、
我发现,服务器的回复有些奇怪。经过一番调查,发现我在/etc/hosts
文件中为目标域设置了一个静态IP,由于他们改变了IP地址,我没有进入到正确的服务器。
更简单地用一句话概括:
proxy=192.168.2.1:8080;curl -v example.com
例如:$proxy=192.168.2.1:8080;curl -v example.com
xxxxxxxxx-ASUS:~$ proxy=192.168.2.1:8080;curl -v https://google.com|head -c 15 % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
* Trying 172.217.163.46:443...
* TCP_NODELAY set
* Connected to google.com (172.217.163.46) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
另一个可能的原因是,如果你没有在Apache中启用虚拟主机的配置文件(或者你根本就没有那个虚拟主机),而Apache中的默认虚拟主机只被配置为非SSL连接--即没有默认的虚拟主机可以讲SSL。在这种情况下,由于Apache是在443端口监听,对不存在的虚拟主机的请求将到达默认的虚拟主机--但该虚拟主机不讲SSL。
在使用MySQL CLI连接到外部MySQL数据库的情况下,根据MySQL的版本,你可以传递--ssl-mode=disabled
这样的信息:
$ mysql --ssl-mode=disabled -h yourhost.tld -p
或者干脆在你的客户配置中,例如在/etc/my.cnf.d/client.cnf
中:
[client]
ssl-mode=DISABLED
这是为了开发,有时安全和这些东西在某些情况下,在一个封闭的私人开发环境中可以被放弃。