golang https server如何设计方便抓包定位且安全

文章目录

    • 代码
    • 测试

用go写后端https服务时,需要定位https包中的内容是否符合预期。

有涉猎的朋友应该了解过https有一种keylog技术,它允许在HTTPS连接中捕获和记录SSL或TLS会话密钥,以便于调试和分析加密流量。

本文将的就是通过可控制开启和关闭的keylog功能,提供安全便捷的调试方法。

代码

服务端代码如下

package main

go 复制代码
 import (
     "crypto/tls"
     "github.com/gin-gonic/gin"
     "hbp_common/Base"
     "io"
     "log"
     "net/http"
     "os"
     "path/filepath"
 )
 ​
 var tlsConfig *tls.Config
 var keylogpath string
 ​
 const (
     ApiCertPath = "/root/testssl/cert.pem"
     ApikeyPath  = "/root/testssl/key.pem"
 )
 ​
 func main() {
     route := gin.Default()
 ​
     route.GET("/hello", func(c *gin.Context) {
         c.JSON(http.StatusOK, gin.H{"result": "word"})
     })
 ​
     ListenAndSeverTls(route)
 }
 ​
 func SetEnableKeyLog(ctx *gin.Context) {
     enable := ctx.Param("enable")
     if enable == "enable" {
         var err error
         tlsConfig.KeyLogWriter, err = KeyLogWrite(keylogpath)
         if err != nil {
             ctx.AbortWithStatus(http.StatusForbidden)
             return
         }
     } else if enable == "disable" {
         tlsConfig.KeyLogWriter = nil
         err := os.RemoveAll(keylogpath)
         if err != nil {
             ctx.AbortWithStatus(http.StatusForbidden)
             return
         }
     } else {
         ctx.AbortWithStatus(http.StatusBadRequest)
         return
     }
     ctx.Status(http.StatusOK)
 }
 ​
 func KeyLogWrite(path string) (io.Writer, error) {
     keyLogFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
     if err != nil {
         log.Fatal(err.Error())
     }
     return keyLogFile, err
 }
 ​
 func ListenAndSeverTls(route *gin.Engine) {
     defer Base.SafePanic()
     keylogpath = filepath.Dir(ApiCertPath) + "/keylog"
 ​
     // 加载证书和密钥
     cert, err := tls.LoadX509KeyPair(ApiCertPath, ApikeyPath)
     if err != nil {
         log.Panic("ListenAndSeverTls failed! LoadX509KeyPair err:[%s]", err)
     }
 ​
     // 配置TLS
     tlsConfig = &tls.Config{KeyLogWriter: nil}
     tlsConfig.Certificates = []tls.Certificate{cert}
 ​
     listener, err := tls.Listen("tcp", ":24443", tlsConfig)
     if err != nil {
         log.Panic("ListenAndSeverTls failed! ListenTLS err:[%s]", err)
     }
     server := http.Server{Handler: route, Addr: ":24443", TLSConfig: tlsConfig}
 ​
     //注册keylog记录使能接口
     //PUT https://localhost:8443/debug/keylog/enable 使能tls keylog
     //PUT https://localhost:8443/debug/keylog/disable 失能tls keylog
     route.PUT("/debug/keylog/:enable", SetEnableKeyLog)
 ​
     err = server.Serve(listener)
     if err != nil {
         log.Panic("ListenAndSeverTls failed! Serve err:[%s]", err)
     }
 }

通过 //PUT https://localhost:8443/debug/keylog/enable 使能tls keylog //PUT https://localhost:8443/debug/keylog/disable 失能tls keylog

可以开启和关闭该功能,可以做到不使用使防止keylog泄露。在开启和关闭操作时可以再加上鉴权校验等操作使方法更安全。

测试

可以看到,前面收到了客户端的hello,但是我没有使能,所以没有keylog生成。

开启后便有了keylog

我在此抓了包

目前是加密的

通过ctrl+shift+p打开首选项窗口

找到Protocols中的TLS,将刚才生成的keylog路径设置到图中位置

点击ok,就可以看到https明文了


disable后会删除keylog文件,确保keylog的安全

相关推荐
科技云报道4 小时前
2025全球数字经济大会—云智算安全论坛暨第三届“SecGo论坛”成功召开!共筑安全新生态
安全
群联云防护小杜7 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构
独行soc8 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
花木偶9 小时前
【郑大二年级信安小学期】Day6:CTF密码学&杂项&工具包
安全·web安全·密码学
qq_3129201110 小时前
主机安全-开源HIDS字节跳动Elkeid使用
安全
2501_9159184115 小时前
接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 实战指南
websocket·网络协议·tcp/ip·http·网络安全·https·udp
不老刘15 小时前
基于LiveKit Go 实现腾讯云实时音视频功能
golang·腾讯云·实时音视频
黑客老李17 小时前
EDUSRC:智慧校园通用漏洞挖掘(涉校园解决方案商)
服务器·前端·网络·安全·web安全
玥轩_52118 小时前
BUUCTF [WUSTCTF2020]spaceclub 1
安全·网络安全·ctf·buuctf·ascii·spaceclub·wustctf2020
薄荷椰果抹茶18 小时前
【网络安全基础】第七章---无线网络安全
网络·安全·web安全