秋来冬风的博客

2025-2-11

go语言tls1.3密码套件修改研究

有些浏览器可以看到tls的一些信息,例如 笔者看到go语言默认用的aes128,其他tls1.3实现有默认用aes256的。

go语言的tls默认tls1.3使用下列密码套件按下列顺序 TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 并且文档中明确列出TLS 1.3 ciphersuites are not configurable(TLS 1.3密码套件是不可配置的)

笔者试了类似这个程序

package main

import (
	"crypto/tls"
	"fmt"
	"net/http"
	_ "unsafe"
)

//go:linkname defaultCipherSuitesTLS13 tls.defaultCipherSuitesTLS13
var defaultCipherSuitesTLS13 = []uint16{
	tls.TLS_AES_256_GCM_SHA384,
	tls.TLS_CHACHA20_POLY1305_SHA256,
}

func main() {
	c := tls.Config{
		MinVersion: tls.VersionTLS13,
	}
	s := http.Server{
		Addr:      ":443",
		TLSConfig: &c,
	}
	mux := http.NewServeMux()
	s.Handler = mux
	mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		fmt.Fprintln(w, "hello")
	})
	err := s.ListenAndServeTLS(`cert_path`, `key_path`)
	fmt.Println(err)
}

确实一般情况下无法配置。 研究确认,修改go语言tls包的defaults.go源文件中defaultCipherSuitesTLS13可以做到其他tls1.3实现的效果 只需将原本的

var defaultCipherSuitesTLS13 = []uint16{
	TLS_AES_128_GCM_SHA256,
	TLS_AES_256_GCM_SHA384,
	TLS_CHACHA20_POLY1305_SHA256,
}

改为

var defaultCipherSuitesTLS13 = []uint16{
	TLS_AES_256_GCM_SHA384,
	TLS_CHACHA20_POLY1305_SHA256,
}
Tags: