curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

回答 10 浏览 62.3万 2018-06-13

当我试图用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  

我想这是一个与我的程序安装有关的问题。 谁能向我解释一下这个错误信息的意思吗?

Bernhard Jaeger 提问于2018-06-13
为什么要暴露你的真实代理tedyyu 2021-10-21
10 个回答
#1楼 已采纳
得票数 407
* Uses proxy env variable http_proxy == 'https://proxy.in.tum.de:8080'   
                                         ^^^^^

https://是错误的,它应该是http://。代理本身应该通过HTTP访问,而不是HTTPS,尽管目标URL是HTTPS。但代理将正确处理HTTPS连接并保持端到端加密。请参阅HTTP CONNECT method了解如何做到这一点的细节。

Steffen Ullrich 提问于2018-06-13
如果你在Docker中遇到这个错误,将443端口暴露给公众就可以解决这个问题了。Dr.X 2019-05-06
有趣的是。这让我明白,一个网站在乌克兰被屏蔽了。看完这个答案后,我做了curl http://siteiwouldnotmention.com:443/,我看到网站被故意阻止的信息。akostadinov 2021-11-22
如果你在推送代码到git时看到这个错误,请删除环境变量中的HTTPS_PROXY。在intellij中,有一个选项可以通过HTTP Porxy设置来增加本地测试。P.D 2022-07-04
我想和大家分享一下我的情况......curl可以到达服务器,而服务器又试图通过代理(envoy)进行https调用,结果失败了,问题中的错误被返回给了客户端(curl)。所以,答案基本上是一样的,只是代理在服务器后面而不是前面,错误是在服务器调用(backend)而不是在客户端调用(curl)。服务器的错误被转发到客户端的事实引起了一些混乱...afarah 2022-09-29
#2楼
得票数 60

如果有人在使用Nginx时遇到这个错误,请尝试在服务器配置中加入以下内容:

server {
    listen 443 ssl;
    ...
}

这个问题源于Nginx向一个期望HTTPS的客户提供HTTPS服务,无论你在什么端口监听。当你在listen指令中指定ssl时,你可以在服务器端清除这个问题。

Arcsector 提问于2020-06-08
谢谢,这让我找到了解决方案,只是在提到的nginx配置行中漏掉了'ssl'的内容。normic 2020-09-26
ssl对我来说也是一个问题。arturas 2021-05-11
#3楼
得票数 18

这是一个提示性的错误,说明你正在从HTTPS端口提供HTTP服务。

你可以很容易地用telnet进行测试

telnet FQDN 443
GET / HTTP/1.0
[hit return twice]

如果你在这里看到普通的HTTP文件[而不是某种错误],你就知道你的配置不正确,而且响应的服务器没有对响应进行SSL加密。

Bret Weinraub 提问于2022-03-04
拯救了我的流量服务器,我忘了在 records.config 中的端口 443 后面添加 SSL。Mijo 2022-06-30
#4楼
得票数 12

简单的答案

如果你在一个代理服务器后面,请为curl设置代理。打开subl ~/.curlrc或使用其他文本编辑器来设置代理。然后在文件中添加以下一行:

proxy= proxyserver:proxyport

例如,proxy = 10.8.0.1:8080

如果你不在代理服务器后面,请确保curlrc文件不包含代理服务器的设置。

Sachit Yadav 提问于2020-02-18
Liam 修改于2021-09-28
#5楼
得票数 3

还要检查你的/etc/hosts文件。在这方面浪费了2个小时。如果你有一个网址重路由到127.0.0.1或任何其他回环,这将使ssl握手失败。

1D0BE 提问于2022-05-01
#6楼
得票数 1

在我的案例中,这个错误的原因是我的网络服务器没有被配置为在SSL 443端口上监听IPv6。启用后,错误就消失了。

下面是你如何为阿帕奇做这件事:

<VirtualHost ip.v4.address:443 ip:v::6:address:443>
...
</VirtualHost>

而对于nginx来说:

listen 443 ssl http2;
listen [::]:443 ssl http2; 
Ilyich 提问于2021-05-12
#7楼
得票数 0

感谢@bret-weinraub的帮助、

我发现,服务器的回复有些奇怪。经过一番调查,发现我在/etc/hosts文件中为目标域设置了一个静态IP,由于他们改变了IP地址,我没有进入到正确的服务器。

mahyard 提问于2022-07-04
#8楼
得票数 -1

更简单地用一句话概括:

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]
Biddut Mitra 提问于2020-07-11
Liam 修改于2021-09-28
#9楼
得票数 -1

另一个可能的原因是,如果你没有在Apache中启用虚拟主机的配置文件(或者你根本就没有那个虚拟主机),而Apache中的默认虚拟主机只被配置为非SSL连接--即没有默认的虚拟主机可以讲SSL。在这种情况下,由于Apache是在443端口监听,对不存在的虚拟主机的请求将到达默认的虚拟主机--但该虚拟主机不讲SSL。

Colin 't Hart 提问于2021-10-18
#10楼
得票数 -3

在使用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

这是为了开发,有时安全和这些东西在某些情况下,在一个封闭的私人开发环境中可以被放弃。

Yes Barry 提问于2022-08-18
E_net4 is on strike 修改于2023-01-21
为了安全起见,禁用SSL并不是一个好主意。Cameron Hudson 2022-10-31
标签