Mengapa saya menghadapi \'gagal disambungkan: x509: sijil bergantung pada medan Nama Biasa legasi, gunakan SAN atau dayakan sementara padanan Nama Biasa dengan ralat GODEBUG=x509ignoreCN=0\' w

Barbara Streisand
Lepaskan: 2024-10-28 12:10:30
asal
612 orang telah melayarinya

Why am I encountering the

Ralat: Percanggahan Medan Sijil dalam Sambungan Go TLS

Apabila cuba mewujudkan sambungan TLS ke pelayan MongoDB dengan Go, anda mungkin akan menghadapi ralat berikut:

failed to connect: x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
Salin selepas log masuk

Punca:

Ralat ini berlaku apabila sijil TLS pelayan bergantung pada medan Nama Biasa (CN) warisan untuk pengenalan, tetapi Go's masa jalan lalai menggunakan Nama Alternatif Subjek (SAN) untuk sambungan TLS.

Penyelesaian:

Terdapat dua pendekatan utama untuk menyelesaikan isu ini:

1. Gunakan SAN dalam Sijil Pelayan:

  • Jana semula sijil pelayan dengan SAN yang sepadan dengan nama hos atau alamat IP yang digunakan untuk menyambung ke pelayan.
  • Ini boleh dicapai menggunakan alatan seperti OpenSSL atau pihak berkuasa sijil pihak ketiga.

2. Lumpuhkan Padanan CN Buat Sementara:

Jika anda tidak boleh menjana semula sijil pelayan dengan segera, anda boleh melumpuhkan padanan CN buat sementara waktu dengan menetapkan pembolehubah persekitaran:

GODEBUG=x509ignoreCN=0
Salin selepas log masuk

Walau bagaimanapun, ini bukan penyelesaian jangka panjang dan hendaklah digunakan hanya untuk mewujudkan sambungan buat sementara waktu.

Pelaksanaan Kod:

Jika anda memilih untuk membetulkan isu dalam kod Go anda, pastikan bahawa sijil yang anda muatkan mengandungi SAN yang sepadan dengan nama hos yang digunakan semasa sambungan. Berikut ialah versi terkini coretan kod yang anda berikan:

<code class="go">const CONFIG_DB_CA = "/etc/ca-files/new-mongo.ca.crt"

func main() {
    cer, err := tls.LoadX509KeyPair("/mongo-server.crt", "/mongo-server.key")
    if err != nil {
        log.Println(err)
        return
    }

    roots := x509.NewCertPool()
    ca, err := ioutil.ReadFile(CONFIG_DB_CA)
    if err != nil {
        fmt.Printf("Failed to read or open CA File: %s.\n", CONFIG_DB_CA)
        return
    }
    roots.AppendCertsFromPEM(ca)

    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cer},
        RootCAs:      roots,
        VerifyPeerCertificate: func(rawCerts [][]*x509.Certificate) error {
            for _, certs := range rawCerts {
                for _, cert := range certs {
                    if len(cert.Subject.CommonName) > 0 {
                        continue
                    }
                    for _, dns := range cert.DNSNames {
                        if dns == "customhost" || dns == "customhost:port" {
                            return nil
                        }
                    }
                    return errors.New("certificate does not contain a SAN for the host")
                }
            }
            return errors.New("no valid certificate found")
        },
    }

    conn, err := tls.Dial("tcp", "customhost:port", tlsConfig)
    if err != nil {
        fmt.Printf("failed to connect: %v.\n", err)
        return
    }

    err = conn.VerifyHostname("customhost")
    if err != nil {
        panic("Hostname doesn't match with certificate: " + err.Error())
    }
    for i, cert := range conn.ConnectionState().PeerCertificates {
        prefix := fmt.Sprintf("CERT%d::", i+1)
        fmt.Printf("%sIssuer: %s\n", prefix, cert.Issuer)
        fmt.Printf("%sExpiry: %v\n", prefix, cert.NotAfter.Format(time.RFC850))
        fmt.Printf("%sDNSNames: %v\n\n", prefix, cert.DNSNames)
    }

    fmt.Printf("Success!")
}</code>
Salin selepas log masuk

Kod yang dikemas kini ini menggunakan fungsi VerifyPeerCertificate tersuai untuk mengesahkan bahawa sijil mengandungi sama ada CN yang sepadan dengan nama hos atau SAN yang sepadan dengan nama hos. Jika sijil yang sesuai ditemui, sambungan akan berjaya.

Atas ialah kandungan terperinci Mengapa saya menghadapi \'gagal disambungkan: x509: sijil bergantung pada medan Nama Biasa legasi, gunakan SAN atau dayakan sementara padanan Nama Biasa dengan ralat GODEBUG=x509ignoreCN=0\' w. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
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!