Protocol Adapter 协议适配器
协议适配器用于适配标准TLS与TLCP协议的自动切换,在适配选择完成后支持双协议同时工作。
若需要使用GoTLCP PA您需要同时提供TLCP的连接配置对象tlcp.Config
以及TLS的连接配置对象tls.Config
除此之外无需任何额外配置,
若您需要双向身份认证以及其它特性只需按照标准的tls.Config
或tlcp.Config
配置对应对象即可。
实例代码如下:
package main
import (
"crypto/tls"
"gitee.com/Trisia/gotlcp/pa"
"gitee.com/Trisia/gotlcp/tlcp"
)
func main() {
var err error
tlcpCfg := &tlcp.Config{
Certificates: []tlcp.Certificate{sigCert, encCert},
}
tlsCfg := &tls.Config{
Certificates: []tls.Certificate{rsaCert},
}
listen, err := pa.Listen("tcp", ":9443", tlcpCfg, tlsCfg)
if err != nil {
panic(err)
}
defer listen.Close()
for {
conn, err := listen.Accept()
if err != nil {
panic(err)
}
// do something
}
}
GoTLCP PA利用TLS/TLCP协议具有相同的记录层头的特征,在连接建立后首先对连接进行检测。
- 接受连接,构造一个特殊协议类型检测连接对象,该对象会读取来自于客户端的个记录层消息的头部。
- 通过记录层头部的协议版本号来区分TLCP、TLS协议,并记录协议主版本号(major version)。
- 通过缓存读取的方式将自己伪装成一个原始的
net.Conn
接口,然后根据协议的主版本号进入对应的协议栈实现TLS/TLCP。
实现原理如下:
见代码: