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

问题描述 投票:0回答:9

我正在尝试

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
之外,还有其他选择吗,因为我不想这样做?

apache ssl openssl wget
9个回答
103
投票

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 错误日志也可能提供一些见解。


21
投票

就我而言,我没有启用网站“default-ssl”。

/etc/apache2/sites-enabled
文件夹中仅列出了“000-default”。

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

a2ensite default-ssl
service apache2 reload

16
投票

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

您可以在 Apache .conf 文件中使用

VirtualHost
等进行完全正确的
_default_:443
设置。

但是... 如果即使有一个 .conf 文件启用了不正确的设置,并且还监听端口 443,那么它就会导致整个 SSL 系统瘫痪。

因此,如果您确定您的 .conf 文件正确,请尝试禁用

sites-enabled
中的其他站点 .conf 文件。


4
投票

有以下几种可能性:

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

对于初学者来说,为了消除 (3),如果您远程登录到该端口会发生什么?

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

如果您想手动验证证书,请发布

openssl s_client
输出的更多详细信息。或者使用
openssl x509 -text -in /path/to/cert
将其打印到您的终端。


2
投票

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


1
投票

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

SL23_GET_SERVER_HELLO:未知协议

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


0
投票

这个问题只在特殊情况下发生在我身上,当我从一些互联网提供商调用网站时,

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


0
投票

我也遇到同样的问题。 Centos 中 443 端口未开放。

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

sudo lsof -i tcp:443

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

LoadModule ssl_module modules/mod_ssl.so
Listen 443

-2
投票

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

urla:1111\subB

问题是服务器将其托管在其他端口上,例如

urla:2222\subB
;因此客户端尝试访问 1111 时收到错误。更正端口号应该可以解决此问题。在本例中为端口号 1111。

© www.soinside.com 2019 - 2024. All rights reserved.