pa

package
v1.3.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 22, 2023 License: MIT Imports: 7 Imported by: 3

README

GoTLCP 协议适配器

Protocol Adapter 协议适配器

协议适配器用于适配标准TLS与TLCP协议的自动切换,在适配选择完成后支持双协议同时工作。

1. 快速入门

若需要使用GoTLCP PA您需要同时提供TLCP的连接配置对象tlcp.Config以及TLS的连接配置对象tls.Config除此之外无需任何额外配置, 若您需要双向身份认证以及其它特性只需按照标准的tls.Configtlcp.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
	}
}

示例见 server/pa/main.go

2. 实现原理

GoTLCP PA利用TLS/TLCP协议具有相同的记录层头的特征,在连接建立后首先对连接进行检测。

  1. 接受连接,构造一个特殊协议类型检测连接对象,该对象会读取来自于客户端的个记录层消息的头部。
  2. 通过记录层头部的协议版本号来区分TLCP、TLS协议,并记录协议主版本号(major version)。
  3. 通过缓存读取的方式将自己伪装成一个原始的 net.Conn 接口,然后根据协议的主版本号进入对应的协议栈实现TLS/TLCP。

实现原理如下:

见代码:

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Listen

func Listen(network, laddr string, tlcpCfg *tlcp.Config, tlsCfg *tls.Config) (net.Listener, error)

Listen tlcp/tls协议自适应,在指定的网络协议上,监听指定地址的端口 创建一个 TLCP的listener接受客户端连接 配置参数对象 tlcpCfg 或 tlsCfg 两者不能全为空, 当其中一方为空时工作工作模式切换至单一的一种协议。

对于tlcpCfg对象至少提供签名密钥对和加密密钥以及签名证书和加密证书 当然也可以通过 Config.GetCertificate 与 Config.GetKECertificate 以动态的方式获取相应密钥对于证书。

func NewListener

func NewListener(inner net.Listener, tlcpCfg *tlcp.Config, tlsCfg *tls.Config) net.Listener

NewListener tlcp/tls协议自适应,基于现有的一个可靠连接的 net.Listener 创建TLCP的Listener对象 配置参数对象 tlcpCfg 或 tlsCfg 两者不能全为空, 当其中一方为空时工作工作模式切换至单一的一种协议。

对于tlcpCfg对象至少提供签名密钥对和加密密钥以及签名证书和加密证书 当然也可以通过 tlcp.Config.GetCertificate 与 tlcp.Config.GetKECertificate 以动态的方式获取相应密钥对于证书。

Types

type ProtocolDetectConn

type ProtocolDetectConn struct {
	net.Conn
	// contains filtered or unexported fields
}

ProtocolDetectConn 连接类型检测连接 该类型连接对象将会对连接到来的客户端Hello消息进行分析解析出连接协议, 并缓存收到的消息,将自己作为原始连接对象。

func (*ProtocolDetectConn) Raw

func (c *ProtocolDetectConn) Raw() net.Conn

Raw 返回原始连接对象

func (*ProtocolDetectConn) Read

func (c *ProtocolDetectConn) Read(b []byte) (n int, err error)

func (*ProtocolDetectConn) ReadFirstHeader

func (c *ProtocolDetectConn) ReadFirstHeader() error

ReadFirstHeader 读取第1个记录层消息的头部

type ProtocolNotSupportError added in v1.3.5

type ProtocolNotSupportError struct{}

func (ProtocolNotSupportError) Error added in v1.3.5

func (ProtocolNotSupportError) Temporary added in v1.3.5

func (ProtocolNotSupportError) Temporary() bool

func (ProtocolNotSupportError) Timeout added in v1.3.5

func (ProtocolNotSupportError) Timeout() bool

type ProtocolSwitchServerConn added in v1.3.6

type ProtocolSwitchServerConn struct {
	net.Conn
	// contains filtered or unexported fields
}

ProtocolSwitchServerConn 自适应协议切换连接对象

func NewProtocolSwitchServerConn added in v1.3.6

func NewProtocolSwitchServerConn(ln *listener, rawConn net.Conn) *ProtocolSwitchServerConn

NewProtocolSwitchServerConn 创建一个自适应协议切换连接对象 ln: 监听器上下文 rawConn: 原始连接对象

func (*ProtocolSwitchServerConn) ProtectedConn added in v1.3.6

func (c *ProtocolSwitchServerConn) ProtectedConn() net.Conn

ProtectedConn 返回被保护的连接对象

func (*ProtocolSwitchServerConn) Read added in v1.3.6

func (c *ProtocolSwitchServerConn) Read(b []byte) (n int, err error)

func (*ProtocolSwitchServerConn) Write added in v1.3.6

func (c *ProtocolSwitchServerConn) Write(b []byte) (n int, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL