代碼
測試
用go寫后端https服務時,需要定位https包中的內容是否符合預期。
有涉獵的朋友應該了解過https有一種keylog技術,它允許在HTTPS連接中捕獲和記錄SSL或TLS會話密鑰,以便于調試和分析加密流量。
本文將的就是通過可控制開啟和關閉的keylog功能,提供安全便捷的調試方法。
代碼
服務端代碼如下
package main
?
import ("crypto/tls""github.com/gin-gonic/gin""hbp_common/Base""io""log""net/http""os""path/filepath")?var tlsConfig *tls.Configvar 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 errortlsConfig.KeyLogWriter, err = KeyLogWrite(keylogpath)if err != nil {ctx.AbortWithStatus(http.StatusForbidden)return}} else if enable == "disable" {tlsConfig.KeyLogWriter = nilerr := 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)}?// 配置TLStlsConfig = &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 keylogroute.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的安全