让我们加密SSL错误 - SSL例程:ssl3_get_record:版本号不正确

7
我已经从LetsEncrypt获取了最新的证书。我的VirtualHost配置如下:
<VirtualHost *:80>
    ServerName example.com
    Redirect 301 / https://example.com/
</VirtualHost>

<VirtualHost *:443>
    Servername example.com
    DocumentRoot /var/www/example.com/wav
    ErrorLog /var/log/apache2/example.com/www/error.log

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>

尝试使用openssl进行验证时:
openssl s_client -connect example.com -port 443

我理解到以下的内容:

我得到了以下结果:

CONNECTED(00000003)
140229655213824:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:252:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 202 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
    SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1541086087
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no

看起来握手没问题,但证书没有被发送。

值得指出的是,Apache日志没有报告任何错误 - 只有通常的“启动/关闭”消息。 apache2ctl configtest 没有报告任何问题。

7个回答

4

看起来握手没问题,但证书没有被发送。

握手不正常。客户端已发送ClientHello以开始握手,但未收到任何有用的响应:

                                            |- ClientHello
                                           ---
SSL handshake has read 5 bytes and written 202 bytes
                      ---
                       |- nothing useful from server

我不知道返回的5个字节是什么,但看起来不像TLS(太短了)。这可能是由于一些服务器配置错误导致的,但从您展示的配置部分无法看出。也可能是一些中间设备(如防火墙、负载均衡器等)影响了连接。还可能是您没有连接到预期的服务器(即example.com未解析到实际服务器上)。
我建议您首先在服务器本身上检查(即localhost),如果可以正常工作,则向离服务器更远的位置检查。您还可以进行数据包捕获,并查看客户端收到的5个字节中的内容。

1
我同意,并且这也是“ssl3_get_record:wrong version number”提示的内容:客户端尝试解析其接收到的内容作为TLS消息,但首次基本解析获取TLS版本失败,因此实际上输入很可能根本不是TLS。当然,长度也是一个强有力的指示器... - Patrick Mevzek
我们遇到了这个问题,然后我们运行了 openssl s_client -connect ip:port -debug 命令来打印包的内容。我们发现这个5字节的包是“HTTP”。原因是我们试图使用curl与一个只提供HTTP服务的服务器进行HTTPS通信。我们的解决方案如下。 - Chris

2

如果有人遇到同样的问题,我想分享一下我的经验。

在Ubuntu 20上使用Apache时,我编辑了SITES-AVAILABLE文件夹中的default-ssl.conf文件,但是无论我做什么都没有任何作用,上述相同的错误一直重复出现。

然后我将sites-available文件夹中的default-ssl.conf文件复制到SITES-ENABLED文件夹中,但不包含IfModule mod_ssl.c标签,这解决了问题。

希望这些信息能帮助到有需要的人。

谢谢。


1
谢谢。根据您的建议,我使用以下命令进行修复:sudo a2ensite default-ssl; sudo systemctl reload apache2。我不需要编辑.conf文件。 - mwfearnley
在20.04上遇到了同样的问题,仍在努力解决。 - Chad Priddle

1
似乎Apache默认的*:80 HTTP处理程序也会在443上监听未匹配的虚拟主机IP,包括回环。例如,我的机器有一个NAT IP 192.168.32.5和127.0.0.1回环。如果我的站点配置使用,那么任何解析为127.0.0.1:443的请求实际上都是由默认的HTTP处理程序回答的...而不是HTTPS。只需将SSL主机名的hosts条目设置为192.168.32.5即可解决问题。

1
我遇到了同样的问题。我的 example.com.conf 文件已经正确设置了 HTTPS,但是我的 000-default.conf 文件没有。我好像忘记在我的 000-default.conf 中包含 SSL 证书并打开 SSL 引擎,但是在我修复后,它完美地工作了。
我添加到 000-default.conf 的代码:
SSLEngine On
SSLCertificateFile /etc/ssl/example.com/domain.cert.pem
SSLCertificateKeyFile /etc/ssl/example.com/private.key.pem

0
设置 SSL 的文件类型,这是经过确认可以正常工作的。 看到 FilesMatch 部分了吗?如果缺少它,你会看到这个错误。
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
SSLCertificateFile /etc/letsencrypt/live/mysite.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3
#SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5
#SSLCipherSuite "AES256-SHA"
SSLCipherSuite HIGH:!aNULL:!MD5

0

我和你遇到了同样的错误。建议你在本地测试你的https连接,将你的域名添加到/etc/hosts中,例如: 127.0.0.1 yourdomain.com 以便保持数据包不会流出。

然后在本地环境中使用“links”测试https连接,如果没有问题,那么就是由于ISP防火墙问题或设置引起的。我最终发现本地https连接正常,并将问题交给ISP解决,祝好运!


根据您的VirtualHosts IP设置方式,这可能会失败,就像在我的系统上一样。我将我的VirtualHost绑定到了一个内部IP端口443,因此它没有绑定到回环IP。 - guru_florida

0

我们遇到了一个问题,即我们的HTTPS端口提供了未加密的HTTP。

原因是我们在同一端口上有两个VirtualHosts,并且其中一个配置为使用SSLEngine on,而另一个则没有。

停用未加密站点解决了该问题。在两个VirtualHosts上都使用SSLEngine on也可以解决该问题。

此外,我们需要适当地重新启动服务才能解决这个问题。尽管在那时配置正确,但reload并没有解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接