无法建立SSL连接,我该如何修复我的SSL证书?

72
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我想将wget下载到自己的盒子上,但不能使用wget中的内部地址(另一个开发人员这样说)。

当我使用wget时,我得到了这个:

wget http://example.com
--2013-03-01 15:03:30--  http://example.com/
Resolving example.com... 172.20.0.224
Connecting to example.com|172.20.0.224|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://www.example.com/ [following]
--2013-03-01 15:03:30--  https://www.example.com/
Resolving www.example.com... 172.20.0.224
Connecting to www.example.com|172.20.0.224|:443... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.

我认为这是因为我的证书设置不正确。使用openssl:

openssl s_client -connect example.com:443
CONNECTED(00000003)
15586:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:

如果我在另一个网站上执行相同的命令,它会显示整个证书。也许该域名在Apache的conf文件中从未设置ssl证书?如果是这样,我应该在虚拟主机中指定什么?除了指定--no-check-certificate之外,还有其他选择吗?因为我不想那样做。

3
在服务器端的端口上启用SSL/TLS。通常这个错误意味着HTML(通过HTTP提供)被解释为SSL记录(就像它是通过HTTPS提供的一样)。另外,关于创建包含所有必需名称和IP地址(而不仅仅是一个名称)的证书,请参阅以下内容:如何使用OpenSSL生成带有SubjectAltName的自签名证书 - jww
9个回答

103

SSL23_GET_SERVER_HELLO:unknown protocol

当OpenSSL从服务器接收到一个它理解的协议版本之外的内容时,就会出现此错误。这可能是因为服务器用纯文本(未加密)HTTP进行回答,也可能是因为服务器只支持TLS 1.2等协议版本,而客户端不理解该协议版本。通常情况下,服务器向后兼容至少SSL 3.0 / TLS 1.0,但也许这个特定的服务器没有(由于实现或配置原因)。

不清楚您是否尝试使用--no-check-certificate参数。如果这样做,我会感到非常惊讶。

一个简单的测试是使用wget(或浏览器)请求http://example.com:443(注意http://,而不是https://);如果它可以工作,则端口443上未启用SSL。要进一步调试此问题,请使用带有-debug选项的openssl s_client,在错误消息之前会转储OpenSSL无法解析的服务器响应的前几个字节。这可能有助于识别问题,特别是如果服务器没有回答ServerHello消息。要查看OpenSSL具体期望什么,请检查源代码:在ssl/s23_clnt.c中查找SSL_R_UNKNOWN_PROTOCOL。在任何情况下,查看Apache错误日志也可能提供一些见解。

1
非常感谢您提供的wget提示! - sjas
1
通常情况下,服务器至少向后兼容SSL 3.0 / TLS 1.0,但也许这个特定的服务器不是。例如,自DSM 6.2以来,Synology NAS默认只接受TLS v1.2或更高版本。 - Kaz
3
没问题 - 那篇回答写下来时,SSL/TLS的世界与现在相比截然不同。 - Daniel Roethlisberger

21

在我的情况下,我没有启用网站'default-ssl'。在/etc/apache2/sites-enabled文件夹中只列出了'000-default'。

在Ubuntu 14 LTS上启用SSL网站,Apache 2.4.7:

a2ensite default-ssl
service apache2 reload

在我的情况下,只需重新启动apache2(显然在添加SSL vhost配置后我忘记了这样做)。D'oh! - geerlingguy

16

简要说明(可能是原因)。

在 Apache 的 .conf 文件中,您可以拥有一个完全正确的 VirtualHost 设置,并具有 _default_:443 等设置。

但是... 如果有一个 .conf 文件启用了不正确的设置,并且还监听了端口 443,则会导致整个 SSL 系统崩溃。

因此,如果您确定您的 .conf 文件是正确的,请尝试禁用 sites-enabled 中的其他站点 .conf 文件。


1
这解决了我数小时的调试问题。检查每个使用SSL/TLS的虚拟主机,确认它们都是有效的。禁用所有虚拟主机,然后逐个测试,直到找到罪魁祸首。 - Jeremy Glover
1
我阅读了数十页有关调试SSL配置的文章和帖子。这是第一个指出服务器中所有SSL配置必须正确才能正常工作的文章。这就是我的问题所在。我忘记了我为另一个客户端设置了不完整的配置。一次快速搜索和大量使用#,我们就解决了问题!谢谢! - Kevin Morwood

4
有几种可能性:
  1. 您的工作站没有用于签署服务器证书的根CA证书。如何修复取决于您使用的操作系统和版本等。(我怀疑这与问题无关)
  2. 您的证书未正确安装。如果您的SSL证书需要呈现中间证书并且您没有设置它,您会收到这些警告。
  3. 您确定已在443端口上启用了SSL吗?

首先,为了排除(3),如果您telnet到该端口会发生什么?

假设不是(3),那么根据您的需求,您可以忽略这些错误并仅通过--no-certificate-check传递。您可能需要使用常规浏览器(通常直接捆绑根证书)并查看是否正常。

如果您想手动验证证书,请从openssl s_client输出中发布更多详细信息。或者使用openssl x509 -text -in /path/to/cert将其打印到终端。


我无法理解 1)如何可能在s23_clnt.c:588导致“未知协议”错误。2)如果服务器回退到普通HTTP并给出错误消息,也有可能会出现这种情况。 - Daniel Roethlisberger
1
没错,我会把它移除的,谢谢。我怀疑是第三个,你的回答表明你完全同意。 :) - Dave S.

2

我在设置新的EC2实例时遇到了这个问题。我没有将HTTPS添加到我的安全组中,因此443端口没有打开。


1
对我来说,我的服务器的DNS名称被添加到了/etc/hosts中,并映射到127.0.0.1,导致了SL23_GET_SERVER_HELLO:未知协议的问题。删除我的真实DNS名称到127.0.0.1的映射解决了这个问题。

0
我遇到了同样的问题。在Centos中,端口443没有打开。
使用以下命令检查443端口:
sudo lsof -i tcp:443
/etc/httpd/conf.d/ssl.conf的第一行添加这两行:
LoadModule ssl_module modules/mod_ssl.so
Listen 443

0

这个问题只在我从某些互联网服务提供商访问网站时出现,

我在apache的VirtualHost配置中仅配置了ip v4, 但一些路由器使用ip v6,当我将ip v6添加到apache配置中时,问题得到解决。


-2
我遇到的问题是在客户端服务器环境中。客户端试图通过http端口80连接,但希望服务器代理将请求重定向到其他端口,并且数据是https。因此基本上是在http上请求安全信息。因此,服务器应该具有http端口80以及客户端请求的端口,例如urla:1111\subB
问题在于服务器托管在其他端口上,例如urla:2222\subB;因此,客户端尝试访问1111时会收到错误。更正端口号应该解决此问题。在这种情况下,更正为端口号1111。

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