最近在开发的项目用到了 gRPC,并且要求使用证书进行双向认证。于是便生成了一个 CA 证书,并以此签名生成了服务端和客户端所需的各种证书,且在周五进行客户端服务端连接测试时一切正常。周末两天过去了,周一再进行测试时,连接出现了如下错误:

transport: authentication handshake failed: EOF

一开始还以为是证书验证出了问题,对相关证书以及涉及到的代码进行了回退,然后进行测试,仍然出现该问题。后续经过排查,排除了证书出错的这一原因,最后莫名在重启电脑后恢复了正常。后来发现是电脑上安装的梯子导致了这一问题。该问题的产生涉及到的前置原因如下:

  1. 由于办公网络环境较差,于是临时安装梯子,搭配手机热点进行开发工作
  2. 由于需要使用证书双向认证,在证书 SANs 中添加了域名 *.sample.com
  3. 由于证书的使用需验证域名,因此本地测试时,修改 /etc/hosts 文件将相关域名解析到了本地地址 127.0.0.1
  4. 测试用的域名匹配了代理规则

由于使用域名测试连接,匹配了代理的规则,导致本地测试的连接无法建立,出现了上述的问题。由于客户端和服务端均在本地进行测试,因此一开始并未考虑连接问题,但最终发现问题是经梯子代理导致无法建立连接。