66

我正在尝试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除了指定因为我不想这样做之外,还有其他选择吗?

4

9 回答 9

101

SSL23_GET_SERVER_HELLO:未知协议

当 OpenSSLServerHello从服务器接收到的协议版本不是它所理解的协议版本时,就会发生此错误。如果服务器使用普通(未加密的)HTTP 应答,就会发生这种情况。如果服务器仅支持例如 TLS 1.2 而客户端不理解该协议版本,也会发生这种情况。通常,服务器至少向后兼容 SSL 3.0 / TLS 1.0,但也许这个特定的服务器不是(通过实现或配置)。

目前尚不清楚您是否试图通过--no-check-certificate。如果这行得通,我会感到相当惊讶。

一个简单的测试是使用wget(或浏览器)请求http://example.com:443(注意http://,不是https://);如果有效,则 SSL 未在端口 443 上启用。要进一步调试,请使用openssl s_client-debug选项,该选项在错误消息转储 OpenSSL 无法解析的服务器响应的前几个字节之前。这可能有助于识别问题,尤其是在服务器没有回复ServerHello消息的情况下。要查看 OpenSSL 到底期待什么,请查看源代码:SSL_R_UNKNOWN_PROTOCOLssl/s23_clnt.c.

无论如何,查看 apache 错误日志也可以提供一些见解。

于 2013-03-01T22:50:23.567 回答
21

就我而言,我没有启用站点“default-ssl”。/etc/apache2/sites-enabled文件夹中仅列出了“000-default” 。

在 Ubuntu 14 LTS、Apache 2.4.7 上启用 SSL 站点:

a2ensite default-ssl
service apache2 reload
于 2015-05-02T01:03:57.973 回答
15

只是一个简短的说明(和可能的原因)。

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

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

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

于 2015-12-02T09:04:06.980 回答
4

有几种可能:

  1. 您的工作站没有用于签署服务器证书的根 CA 证书。您如何修复这取决于您正在运行的操作系统和版本等。 (我怀疑这无关)
  2. 您的证书未正确安装。如果您的 SSL 证书需要提供中间证书而您没有设置它,您会收到这些警告。
  3. 您确定您已在端口 443 上启用 SSL 吗?

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

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

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

于 2013-03-01T21:22:56.760 回答
2

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

于 2015-11-09T20:35:12.333 回答
1

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

SL23_GET_SERVER_HELLO:未知协议

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

于 2018-03-13T10:26:33.717 回答
0

我遇到了同样的问题。Centos 中没有打开 443 端口。

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

须藤 lsof -i tcp:443

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

LoadModule ssl_module modules/mod_ssl.so
Listen 443
于 2017-03-31T09:47:11.460 回答
0

这个问题只在特殊情况下发生在我身上,当我从一些互联网提供商那里打电话时,

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

于 2019-05-31T16:18:24.110 回答
-2

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

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

于 2013-12-23T09:32:26.687 回答