我正在尝试通过 SSL 连接到 swift.ca-ns-1.clouda.ca:8443。我可以从多台其他机器(包括其他新的 16.04.1 机器(不在 GCE 上))连接到此服务器,并且我可以从其他非 Ubuntu 16.04.1 的 GCE 实例连接到它,但是当我尝试从任何 Ubuntu 16.04.1 GCE 实例连接时,SSL 握手失败。我在下面发布了一个来自 openssl 的示例输出。请注意,我可以连接到我尝试过的所有其他 SSL 服务器。CloudA 自己无法弄清楚。有什么想法吗?
% openssl s_client -connect swift.ca-ns-1.clouda.ca:8443
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 305 bytes
---
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:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1475846555
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
更新:我已确认这种情况仅发生在 us-central1 区域(任何子字母也受影响)。在 us-east1 中创建实例完全没问题。
答案1
写入:errno=104
...
SSL 握手已读取 0 个字节并写入 305 个字节
这意味着
- 与服务器的 TCP 连接成功
- openssl s_client 尝试通过发送 ClientHello 来启动 TLS 握手
- 服务器或某些中间件(防火墙、负载均衡器……)
ECONNRESET
可能对 TCP 连接发出 RST(errno 104)作为对 ClientHello 的响应
从这些信息中无法判断是什么导致了 RST 以及哪个系统发送了它。但可以通过一些实验尝试缩小范围:
- 检查所有 16.04.1(工作和非工作)是否使用相同的 openssl 版本。调用
openssl version
是不够的,因为发行版会将更改反向移植到旧版本,并且版本号不会改变。改为使用openssl version -a
并比较构建时间。如果它们不相同,请确保它们相同并再次测试。 - 检查在所有系统上对目标是否使用了相同的 IP 地址,即尝试使用
s_client
已知的良好目标 IP。 - 通过隧道连接(例如使用 OpenSSH)检查服务器的原始 IP 地址是否存在问题,以便它来自已知良好的系统。如果您不幸,您的系统 IP 地址会因为前任所有者的活动而被列入黑名单。
答案2
我遇到过类似的问题。通过添加 servername 选项解决了这个问题。例如,如果您要连接到 gmail:openssl s_client -connect imap.gmail.com:993 -servername gmail.com