记一次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)
}

微信公众号
关注公众号,获得及时更新

更多文章
  • Kubernetes 笔记
  • go mod 和 logrus 路径大小写的问题
  • Flask自动加载Blueprint
  • 在KVM里安装Minikube
  • 搞定面试中的系统设计题
  • Crontab + Sendmail实现定时任务并且通知
  • Nginx设置Referer来防止盗图
  • Graphviz dot简明教程
  • jQuery简明教程
  • Python RQ(Redis Queue)添加gevent支持
  • 读《超级运营术》- 如何做社区?
  • 技术人,光有技术是不行的
  • 搭建aria2服务器
  • 使用shairport-sync搭建airplay音频服务器
  • VirtManager Windows自适应屏幕