Golang Go语言中如何用 golang 创建一个 https 服务用来获取来自浏览器的 tls 扩展信息?

发布于 1周前 作者 caililin 来自 Go语言

我创建了一个类似这样的服务 package main

import ( "crypto/tls" "log" "net" )

func main() { cert, err := tls.LoadX509KeyPair("server.crt", "server.key") if err != nil { panic(err) }

tlsConfig := &tls.Config{
	// GetClientCertificate:     nil,
	PreferServerCipherSuites: true,
	CipherSuites: []uint16{
		tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
		tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
		tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
	},
	MinVersion:             tls.VersionTLS12,
	CurvePreferences:       []tls.CurveID{tls.CurveP256, tls.CurveP384, tls.CurveP521},
	InsecureSkipVerify:     true,
	SessionTicketsDisabled: true,
	// ClientAuth:             tls.RequireAndVerifyClientCert,
	Certificates: []tls.Certificate{cert},
	ClientAuth:   tls.NoClientCert,
	GetCertificate: func(chi *tls.ClientHelloInfo) (*tls.Certificate, error) {
		return &cert, nil
	},
	GetClientCertificate: func(cri *tls.CertificateRequestInfo) (*tls.Certificate, error) {
	return &cert, nil
},

// GetConfigForClient: func(ch *tls.ClientHelloInfo) (*tls.Config, error) {
// 	fmt.Println("GetConfigForClientHandler for:", ch.ServerName)
// 	// ja3.ComputeJA3FromSegment(ch.Context())
// 	return nil, nil
// },

} // tlsConfig := tls.Config{Certificates: []tls.Certificate{cert}}

listener, err := tls.Listen(“tcp”, “:8443”, tlsConfig) if err != nil { panic(err) } defer listener.Close()

for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn) }

}

func handleConnection(conn net.Conn) { defer conn.Close()

buf := make([]byte, 4096)
for {
	n, err := conn.Read(buf)
	if err != nil {
		log.Println(err)
		return
	}
	log.Printf("Received %d bytes: %s", n, string(buf[:n]))
}

}

我想计算浏览器的 ja3 指纹,按照 ja3 的格式,其他信息都可以拿到,目前只有 tls extensions (类似 negetiaion_info,application_settings )这部份信息拿不到,看资料说是 tls 准备库不支持! 请问有没有其他办法拿到?


Golang Go语言中如何用 golang 创建一个 https 服务用来获取来自浏览器的 tls 扩展信息?

更多关于Golang Go语言中如何用 golang 创建一个 https 服务用来获取来自浏览器的 tls 扩展信息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

if conn, ok := c.(*tls.Conn); ok {
for i, v := range conn.ConnectionState().PeerCertificates {
//edit: use %X for uppercase hex printing
log.Printf(“cert %d sha1 fingerprint:%x \n”, i, sha1.Sum(v.Raw))
}
}

更多关于Golang Go语言中如何用 golang 创建一个 https 服务用来获取来自浏览器的 tls 扩展信息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html




这个之前试过

peerCertificates:
[]*crypto/x509.Certificate len: 0, cap: 0, nil


但我证书是有效,而且我通过 wiresharke 抓包是可以获取这些 extensions list

补充下,我想要的不是证书的指纹,而 tls 指纹

TLSVersion ,Ciphers ,Extensions ,EllipticCurves ,EllipticCurvePointFormats
目前 Extensions 这个字段里的信息拿不到!

在Go语言中,创建一个HTTPS服务并获取来自浏览器的TLS扩展信息,你可以使用标准库中的net/http包以及crypto/tls包。以下是一个简单的示例,展示了如何设置HTTPS服务并访问TLS连接信息:

  1. 生成证书和密钥:首先,你需要一个TLS证书和密钥。可以使用openssl生成自签名证书,或购买一个正式的证书。

  2. 编写代码

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    state := r.TLS
    if state != nil {
        for _, ext := range state.PeerCertificates[0].Extensions {
            fmt.Printf("TLS Extension: %x\n", ext)
        }
    }
    fmt.Fprintln(w, "Hello, TLS!")
}

func main() {
    cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
    if err != nil {
        log.Fatalf("failed to load key pair: %s", err)
    }

    caCert, err := ioutil.ReadFile("ca.pem")
    if err != nil {
        log.Fatalf("failed to read ca cert: %s", err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

    server := &http.Server{
        Addr:      ":8443",
        TLSConfig: &tls.Config{Certificates: []tls.Certificate{cert}, ClientCAs: caCertPool, ClientAuth: tls.RequestClientCert},
    }

    http.HandleFunc("/", helloHandler)
    log.Fatal(server.ListenAndServeTLS("", ""))
}

这段代码创建了一个HTTPS服务器,监听8443端口,并在处理请求时打印出TLS扩展信息。确保替换"cert.pem", "key.pem", 和"ca.pem"为你的证书文件路径。

回到顶部