TLCP协议作为传输层密码协议,在握手完成后认为建立TLCP连接,对于上层应用来说TLCP是透明的,上层应用依然可以使用Socket接口进行通信, 下层通信实现为TLCP协议,而不是TCP协议。
基于上述原理可以将HTTP下方的协议替换为TLCP协议,就这就是HTTPS,协议栈结构如下所示:
若您需要配置双向身份认证请参考 《GoTLCP 服务端配置》
标准库实现TLCP HTTPS流程如下:
- 创建
http.Server
对象,设置HTTP路由等。 - 通过
tlcp.Listen
方法,配置并启动TLCP Listener。 http.Server
对象的Serve
方法传入TLCP Listener对象。
package main
import (
"gitee.com/Trisia/gotlcp/tlcp"
"net/http"
)
func main() {
// 省略部分初始化代码...
config := &tlcp.Config{Certificates: certKeys}
serveMux := http.NewServeMux()
// 设置HTTP路由
serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("Hello GoTLCP!"))
})
// 1. 构造 HTTP服务
svr := http.Server{Addr: ":443", Handler: serveMux}
// 2. 创建 TLCP Listen
ln, err := tlcp.Listen("tcp", svr.Addr, config)
if err != nil {
panic(err)
}
// 3. 通过 TLCP Listen 启动HTTPS服务
err = svr.Serve(ln)
if err != nil {
panic(err)
}
}
完整示例见 https/server/std/main.go
与标准Go的HTTPS配置类似的,Gin的HTTPS配置方式如下:
- 创建
gin.Engine
对象,作为HTTP服务的处理函数。 - 创建
http.Server
对象,设置HTTP路由等。 - 通过
tlcp.Listen
方法,配置并启动TLCP Listener。 http.Server
对象的Serve
方法传入TLCP Listener对象。
package main
import (
"gitee.com/Trisia/gotlcp/tlcp"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
config := &tlcp.Config{Certificates: load()}
// 1. 创建 gin 的HTTP处理器
router := gin.Default()
router.GET("/", func(ctx *gin.Context) { ctx.String(200, "Hello GoTLCP Gin!") })
// 2. 通过Gin的处理器构造 HTTP服务
svr := http.Server{Addr: ":443", Handler: router}
// 3. 创建 TLCP Listen
ln, err := tlcp.Listen("tcp", svr.Addr, config)
if err != nil {
panic(err)
}
// 4. 通过 TLCP Listen 启动HTTPS服务
err = svr.Serve(ln)
if err != nil {
panic(err)
}
}
完整示例见 https/server/gin_demo/main.go
与标准Go的HTTPS配置类似的,Fiber的HTTPS配置方式如下:
- 创建
fiber.App
对象,注册路由。 - 通过
tlcp.Listen
方法,配置并启动TLCP Listener。 fiber.App
对象的Listener
方法传入TLCP Listener对象。
package main
import (
"gitee.com/Trisia/gotlcp/tlcp"
"github.com/gofiber/fiber/v2"
)
func main() {
config := &tlcp.Config{Certificates: load()}
// 1. 创建Fiber应用, 注册路由
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello GoTLCP Fiber")
})
// 2. 创建 TLCP Listen
ln, err := tlcp.Listen("tcp", ":3000", config)
if err != nil {
panic(err)
}
err = app.Listener(ln)
if err != nil {
panic(err)
}
}
完整示例见 https/server/fiber_demo/main.go
GoTLCP提供了简单的方法来构造HTTPS客户端,构造的HTTP客户端您可以和普通的HTTP客户端一样使用没有差别。
配置如下:
- 初始化TLCP配置。
- 创建TLCP HTTPS客户端。
- 使用 HTTP客户端通信。
package main
import (
"gitee.com/Trisia/gotlcp/https"
"gitee.com/Trisia/gotlcp/tlcp"
"io"
"os"
)
func main() {
// 1. 初始化TLCP配置
config := &tlcp.Config{RootCAs: load()}
// 2. 创建TLCP HTTPS客户端
client := https.NewHTTPSClient(config)
// 3. 使用 HTTP客户端通信
resp, err := client.Get("https://127.0.0.1")
if err != nil {
panic(err)
}
_, err = io.Copy(os.Stdout, resp.Body)
if err != nil && err != io.EOF {
panic(err)
}
}
若您需要客户端连接超时时间进行配置,请使用:
https.NewHTTPSClientDialer(dialer *net.Dialer, config *tlcp.Config) *http.Client
若您需要配置双向身份认证请参考 《GoTLCP 客户端配置》
完整示例见 https/client/main.go
关于 TLCP/TLS 自适应原理,请参考《GoTLCP 协议适配器》相关内容。
以Go语言标准库为例,TLCP/TLS 自适应HTTPS服务端配置方式如下:
- 创建PA Listener。
- 构造HTTP服务。
- 通过 PA Listen 启动HTTPS服务。
package main
import (
"crypto/tls"
"gitee.com/Trisia/gotlcp/pa"
"gitee.com/Trisia/gotlcp/tlcp"
"net/http"
)
var (
sigCert tlcp.Certificate
encCert tlcp.Certificate
rsaCert tls.Certificate
)
func main() {
var err error
tlcpCfg := &tlcp.Config{
Certificates: []tlcp.Certificate{sigCert, encCert},
}
tlsCfg := &tls.Config{
Certificates: []tls.Certificate{rsaCert},
}
// 1. 创建PA Listener
ln, err := pa.Listen("tcp", ":443", tlcpCfg, tlsCfg)
if err != nil {
panic(err)
}
// 2. 构造HTTP服务
serveMux := http.NewServeMux()
serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("Hello GoTLCP!"))
})
svr := http.Server{Addr: ":443", Handler: serveMux}
// 3. 通过 PA Listen 启动HTTPS服务
err = svr.Serve(ln)
if err != nil {
panic(err)
}
}
完整示例见 https/server/pa/main.go
类似的Gin 与 Fiber 的配置方式也是类似,详见示例: