Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mendapatkan clientCert.Subject.CommonName daripada golang tcp handshake?
Saya mempunyai ramai pelanggan yang menyambung ke titik akhir TLS tcp saya menggunakan sijil yang berbeza. Saya cuba guna RequireAndVerifyClientCert
:
certPool := x509.NewCertPool() clientCACert, err := ioutil.ReadFile("client-ca.crt") if err != nil { log.Fatal(err) } certPool.AppendCertsFromPEM(clientCACert) // Create a base TLS config baseTLSConfig := &tls.Config{ ClientCAs: certPool, ClientAuth: tls.RequireAndVerifyClientCert, }
Jadi saya mempunyai akses kepada ConnectionState().PeerCertificates[0]
并首先读取 clientCert.Subject.CommonName
sebelum saya memberitahunya sijil pelayan dan kunci yang hendak digunakan. Iaitu, setiap sijil CommonName memerlukan sijil dan kunci sisi pelayan yang berbeza. Ia bukan hanya satu sijil pelayan dan kunci yang digunakan untuk semua sambungan.
listener, err := tls.Listen("tcp", ":8080", baseTLSConfig) for { conn, _ := listener.Accept() clientCert := conn.(*tls.Conn).ConnectionState().PeerCertificates[0] switch clientCert.Subject.CommonName {
Tetapi penukaran ini gagal: (*tls.Conn)
并且我无法调用 ConnectionState
或者我进行另一个 tcp.Server 调用,但 len(PeerCertificates)
ialah sifar. Saya cuba:
GetConfigForClient: func(hello *tls.ClientHelloInfo) (*tls.Config, 错误) {
Hantar kepada tls.RequireAndVerifyClientCert
atau selain itu, tetapi *tls.ClientHelloInfo tidak mempunyai maklumat yang saya perlukan.
Tiada cara untuk memutuskan sijil pelayan yang hendak digunakan berdasarkan sijil pelanggan.
Dalam jabat tangan TLS, pelayan mula-mula menghantar sijil pelayannya dan kemudian meminta sijil klien dan hanya selepas itu pelanggan menghantar sijil kliennya kepada pelayan.
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan clientCert.Subject.CommonName daripada golang tcp handshake?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!