Go 实现 TLS 双向认证

Python014

Go 实现 TLS 双向认证,第1张

将会在 config 文件夹中生成 ca.key 和 ca.crt 文件

将会在 config 文件夹中生成 server.key 、 server.csr 和 server.crt 文件

签名方式: SHA-256 ,默认的 SHA-1 签名算法安全性不够高,Go 中会出现警告。

将会在 config 文件夹中生成 client.key 、 client.csr 和 client.crt 文件

签名方式: SHA-256 ,默认的 SHA-1 签名算法安全性不够高,Go 中会出现警告。

wireshark 截图如下:

在写websocket包的时候发现一个比较有趣问题!go 使用 TLS验证的时候发现 websocket 使用不了。深入了解发现其中奥秘:go 在执行 TLS 验证时候默认是使用 http2 协议进行的!但是 websocket 是无法支持 http2 协议(暂时),导致这个问题所在的原因!

使用空 map 来使用 http1.x协议

因为默认支持h2,所有我们把降到http1.x。

使用 http.Hijacker 对其进行劫持 net.Conn , 让程序员自己控制使用!其实这个时候已经脱离 http 协议规范!

发现使用 Hijacker 会脱离 http 协议范畴,可以解决h2与websocket的相关问题!

协议: 状态码:101 , Upgrade , Connection, Sec-WebSocket-Accept

实现最简单 websocket 连接!

websocket连接已经建立,有些 sec 是默认添加上去!

根据 http.Listen 进行向下追踪

在 func (srv *Server) Serve(l net.Listener) error 发现原由

对 c.setState 进入分析

发现当 case 是 Hijack【StateHijacked, StateClosed】状态时候执行 trackConn

add 为 false ,对其 delete(s.activeConn,c) 。Hijacker是满足相关条件

所以在 go c.serve(connCtx) 里面不在给 Hijacker 进行操作!导致 http header 无法设置!最后交给程序员自己操作!

go中自带的rpc可以直接复用http server处理请求的那一套流程去创建连接,连接创建完毕后再使用Hijack方法拿到连接。

注: github.com/gorilla/websocket

这包就接入 HIjacker ,直接使用现成包就香~~~~~