Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mendapatkan clientCert.Subject.CommonName daripada golang tcp handshake?

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

王林
王林ke hadapan
2024-02-06 09:36:03383semak imbas

如何从 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,
    }

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.


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam