无法通过 GCE Ubuntu 16.04.1 映像与一台服务器完成 SSL 握手(但在其他地方可以正常工作)

无法通过 GCE Ubuntu 16.04.1 映像与一台服务器完成 SSL 握手(但在其他地方可以正常工作)

我正在尝试通过 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

https://en.wikipedia.org/wiki/Server_Name_Indication更多细节。

相关内容