Golang Go语言中如何用 golang 创建一个 https 服务用来获取来自浏览器的 tls 扩展信息?
我创建了一个类似这样的服务 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
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
补充下,我想要的不是证书的指纹,而 tls 指纹
TLSVersion ,Ciphers ,Extensions ,EllipticCurves ,EllipticCurvePointFormats
目前 Extensions 这个字段里的信息拿不到!
在Go语言中,创建一个HTTPS服务并获取来自浏览器的TLS扩展信息,你可以使用标准库中的net/http
包以及crypto/tls
包。以下是一个简单的示例,展示了如何设置HTTPS服务并访问TLS连接信息:
-
生成证书和密钥:首先,你需要一个TLS证书和密钥。可以使用
openssl
生成自签名证书,或购买一个正式的证书。 -
编写代码:
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"
为你的证书文件路径。