pa

package
v0.0.0-...-bc8d4ca Latest Latest
Warning

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

Go to latest
Published: Feb 13, 2023 License: MIT Imports: 5 Imported by: 0

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对象至少提供签名密钥对和加密密钥以及签名证书和加密证书 当然也可以通过 Config.GetCertificate 与 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个记录层消息的头部

Jump to

Keyboard shortcuts

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