Bagaimana untuk mendapatkan clientCert.Subject.CommonName daripada golang tcp handshake?

王林
Lepaskan: 2024-02-06 09:36:03
ke hadapan
382 orang telah melayarinya

如何从 golang tcp 握手中获取 clientCert.Subject.CommonName?

Kandungan soalan

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,
    }
Salin selepas log masuk

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 {
Salin selepas log masuk

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.


Jawapan Betul


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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!