记一次Golang TLS编程踩坑

最近在写一个HTTP/2代理,一开始使用h2c玩的好好的,结果往测试环境发布,因为跨了公网,因此要加证书,踩了一个坑。

发起连接的客户端代码:

var backendConn net.Conn
var err error
if useTLS {
    backendConn, err = tls.Dial("tcp", backendAddr, nil)
} else {
    backendConn, err = net.Dial("tcp", backendAddr)
}

就会发现,没有TLS的情况下,是OK的,但是一旦连上了TLS(我用的Nginx来起TLS服务),Nginx直接返回400。400,那就是客户端错误。对TLS并不熟悉, 最后在 @jingwei大神 的指点下,发现原来是 ALPN 的问题,ALPN是TLS用来给服务端和客户端协商上层协议用的扩展,而上面的代码并没有提供客户端支持什么协议,因此Nginx直接报400。加入即可:

var backendConn net.Conn
var err error
if useTLS {
    backendConn, err = tls.Dial("tcp", backendAddr, &tls.Config{NextProtos: []string{"h2"}})
} else {
    backendConn, err = net.Dial("tcp", backendAddr)
}

更多文章
  • ufw简明教程
  • zerotier简明教程
  • 提取kindle笔记
  • 一个Golang gRPC握手错误的坑
  • Golang(Go语言)爬虫框架colly简明教程及源码阅读与分析
  • 选择合适的技术栈
  • Golang的template(模板引擎)简明教程
  • 毕业三年,一路走来
  • 代码的坏味道
  • 消息分帧(字符串设计或协议设计)的两种形式
  • C, Go, Python的错误处理和异常机制杂谈
  • 好的命名是最好的文档
  • 读《系统之美:决策者的系统思考》
  • Linux高分屏支持
  • GCC默认的头文件搜索路径