Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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

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
Barbara Streisandasal
2024-10-28 12:10:30609semak imbas

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

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

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>

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!

Kenyataan:
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