Postmortem: CA 信任链没安装造成的一次大型悲剧

查看原文

本文介绍了一个团队关于一台 Linux Server 完全无法响应用户请求,但是 CPU / IO 负载等等指标又好的不能再好的 Case。事情简单说来是这样子的:他们使用了 Let's Encrypt 证书,他们的服务器上没有安装 SSL 证书的整个 chain,导致每来一个用户请求,服务器就需要向外部发送 HTTP 请求获取 ca chain;很不巧,防火墙还把这种请求给墙了,所以就会看到长达两分钟的 timeout。从这份 postmortem 里面,我们可以学到很多知识点:

  • 使用 strace 可以看到具体进程发生的系统调用。如果想看到哪里卡了,用 strace 一查 syscall 的调用序列就知道。
  • 在一次 SSL handshake 中,如果服务器没有安装 entire certificate chain, 那么服务器会在握手途中发出同步的一次 http 请求,向 identrust 获取 full chain,然后发送给客户端。
  • 如果 http 请求失败了,会有一次大型的 timeout。但握手依然会成功,服务端会把服务器上的不带 root 信息的证书发送给客户端。(客户端不会出错,因为客户端一般都安装了 root ca
  • 评论中有人提到 certificate revocation lists 也需要下载。

衍生思考:配置 ssl 不是配个证书就完事了,相关的防火墙,以及服务端预装证书链等等都要核查。