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

时间:2013-03-01 21:11:33

标签: apache ssl openssl 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:

如果我在另一个站点上执行相同的命令,它会显示整个证书。

也许ssl证书从未在Apache的conf文件中为该域设置?

如果是这样,我应该在虚拟主机中指定什么?除了指定--no-check-certificate之外还有其他选择,因为我不想这样做吗?

8 个答案:

答案 0 :(得分:87)

  

SSL23_GET_SERVER_HELLO:未知协议

当OpenSSL在其从服务器理解的协议版本中收到ServerHello以外的内容时,会发生此错误。如果服务器使用普通(未加密)HTTP进行应答,则可能会发生这种情况。如果服务器仅支持例如,也会发生这种情况。 TLS 1.2和客户端不了解协议版本。通常,服务器向后兼容至少SSL 3.0 / TLS 1.0,但是这个特定服务器可能不是(通过实现或配置)。

目前还不清楚您是否试图通过--no-check-certificate。如果能有效,我会感到很惊讶。

一个简单的测试是使用wget(或浏览器)来请求http://example.com:443(请注意http://,而不是https://);如果它工作,则不在端口443上启用SSL。要进一步调试,请使用openssl s_client-debug选项,在错误消息转储服务器响应的前几个字节之前,OpenSSL是无法解析。这可能有助于识别问题,尤其是在服务器未回复ServerHello消息的情况下。要查看OpenSSL的具体内容,请查看来源:在SSL_R_UNKNOWN_PROTOCOL中查找ssl/s23_clnt.c

在任何情况下,查看apache错误日志也可能提供一些见解。

答案 1 :(得分:10)

只是快速记录(可能的原因)。

您可以在Apache .conf文件中使用VirtualHost等完全正确的_default_:443设置。

但是...... 如果甚至有一个.conf文件启用了不正确的设置,也会侦听端口443,那么它将使整个SSL系统关闭。

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

答案 2 :(得分:4)

有几种可能性:

  1. 您的工作站没有用于签署服务器证书的根CA证书。你究竟如何解决这个问题取决于你正在运行什么操作系统以及什么版本等等。(我怀疑这不相关)
  2. 您的证书安装不正确。如果您的SSL证书要求提供中间证书并且您没有设置,则可以收到这些警告。
  3. 您确定在端口443上启用了SSL吗?
  4. 对于初学者来说,要消除(3),如果你telnet到那个端口会发生什么?

    假设它不是(3),那么根据您的需要,您可以很好地忽略这些错误并且只是传递--no-certificate-check。您可能希望使用常规浏览器(通常会直接捆绑根证书)并查看事情是否满意。

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

答案 3 :(得分:2)

设置新的EC2实例时出现此问题。我没有将HTTPS添加到我的安全组,因此端口443没有打开。

答案 4 :(得分:1)

对我来说,我的服务器的DNS名称已添加到/ etc / hosts中,并且已映射到127.0.0.1,导致

  

SL23_GET_SERVER_HELLO:未知协议

删除我的真实DNS名称到127.0.0.1的映射解决了这个问题。

答案 5 :(得分:0)

我遇到了同样的问题。港口443在Centos没有开放。

使用以下命令检查443端口:

  

sudo lsof -i tcp:443

/etc/httpd/conf.d/ssl.conf 的第一行添加以下两行:

LoadModule ssl_module modules/mod_ssl.so
Listen 443

答案 6 :(得分:0)

这个问题仅在特殊情况下才发生,当我从一些互联网提供商处致电网站时,

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

答案 7 :(得分:-2)

我遇到的问题是在客户端服务器环境中。客户端尝试通过http端口80进行连接,但希望服务器代理将请求重定向到其他端口,数据为https。所以基本上通过http询问安全信息。所以服务器应该有http端口80以及端口客户端请求,比如说urla:1111\subB

问题是服务器在其他端口e,g urla:2222\subB上托管了这个问题;所以客户端试图访问超过1111收到错误。更正端口号应解决此问题。在这种情况下,端口号为1111。