Rumah >pembangunan bahagian belakang >Golang >tls.X509KeyPair muncul ralat 'Tidak dapat mencari sebarang data PEM dalam input sijil'.

tls.X509KeyPair muncul ralat 'Tidak dapat mencari sebarang data PEM dalam input sijil'.

WBOY
WBOYke hadapan
2024-02-05 23:00:081346semak imbas

tls.X509KeyPair 弹出“无法在证书输入中找到任何 PEM 数据”错误

Kandungan soalan

Saya cuba buat sijil tls untuk pelayan https melalui pakej golang x509

Saya mendapat ralat ini

tls: failed to find any pem data in certificate input

Selepas beberapa kajian, saya mencipta sijil saya seperti ini

func generatecert()  {
    ca := &x509.certificate{
        serialnumber: big.newint(2023),
        subject: pkix.name{
            organization:       []string{"company"},
            organizationalunit: []string{"lol"},
            country:            []string{"us"},
            province:           []string{""},
            locality:           []string{"ny"},
            streetaddress:      []string{"no street"},
            postalcode:         []string{"77777"},
        },
        notbefore:             time.now(),
        notafter:              time.now().adddate(10, 0, 0),
        subjectkeyid:          []byte{1, 2, 3, 4, 5},
        basicconstraintsvalid: true,
        isca:                  true,
        extkeyusage:           []x509.extkeyusage{x509.extkeyusageclientauth, x509.extkeyusageserverauth},
        keyusage:              x509.keyusagedigitalsignature | x509.keyusagecertsign,
    }

    certpubl, certpriv, err := ed25519.generatekey(rand.reader)
    if err != nil {
        log.println("key generate failed", err)
        return
    }

    certcert, err := x509.createcertificate(rand.reader, ca, ca, certpubl, certpriv)
    if err != nil {
        log.println("create cert failed", err)
        return
    }

    out := &bytes.buffer{}

    //encoding cert
    certtestpem := &pem.block{type: "certificate", bytes: certcert}
    pem.encode(out, certtestpem)
    publiccert := out.bytes()
    certderblock, publiccert := pem.decode(publiccert)

    //check decoded cert
    print(certderblock.type, "\n")
    if publiccert != nil {
        print("publiccert nil\n")
    }

    //encoding private key
    out.reset()
    privatepem, _ := x509.marshalpkcs8privatekey(certpriv)
    pem.encode(out, &pem.block{type: "private key", bytes: privatepem})
    privitkey := out.bytes()

    //check keypair
    _, err = tls.x509keypair(publiccert, privitkey)
    if err != nil {
        print(err.error())
    }
}

Ia menunjukkan ralat seperti di bawah

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input

Saya cuba menyahkod selepas pem.encodetomemory

pem.type betul tetapi pembolehubah "publiccert" adalah sifar, saya cuba menambah n pada permulaan sijil dan ia tidak melakukan apa-apa tetapi sijil itu sendiri bukan sifar, sesiapa boleh membantu saya p>

Apakah yang boleh saya lakukan untuk menjadikan tls berfungsi? ? ?


Jawapan betul


Terdapat beberapa masalah dengan kod ini

publiccert := out.bytes()

Pemeriksaan pada peringkat inipubliccert的内容显示了期望值。但以下语句将简单地覆盖 publiccert:

certderblock, publiccert := pem.decode(publiccert)

Dengan menyemak publiccert 可以看到这一点。 如文档所述 publiccert selepas penyata ini, data kini akan dipaparkan selepas sijil sebenar.

Sepatutnya begini

certderblock, _ := pem.decode(publiccert)

Menyemak kandungan publiccert selepas pernyataan yang diperbetulkan ini menunjukkan nilai yang dijangkakan sekali lagi.

out.reset()
privatepem, _ := x509.marshalpkcs8privatekey(certpriv)
pem.encode(out, &pem.block{type: "private key", bytes: privatepem})
privitkey := out.bytes()

Ini akan mendapatkan nilai yang dijangkakan ke dalam privitkey. Walau bagaimanapun, ia akan berubah privitkey 中。但是,它将更改 publiccert,因为它只是 out 的一部分,并且 out 已更改操作。因此,out 现在将在开头包含 privitkey,而不再是证书的开头 - 这反映在 publiccert kerana ia hanyalah sebahagian daripada out dan out telah mengubah tindakan. Oleh itu, out kini akan mengandungi privitkey pada permulaan dan bukannya permulaan sijil - ini ditunjukkan dalam nilai

.

Lihat juga dokumentasi untuk bytes.buffer.bytes

Sliceshanya sah sehingga pengubahsuaian penimbal seterusnya

(iaitu, hanya sah sehingga kaedah baca, tulis, set semula atau potong seterusnya dipanggil)

Jadi, bukan sekadar menetapkan semula penimbal sedia ada

out.reset()
privitkey 创建一个新缓冲区,并为 publiccertLebih baik buat penimbal baharu untuk privitkey dan simpan penimbal sedia ada untuk

out = &bytes.Buffer{}

Atas ialah kandungan terperinci tls.X509KeyPair muncul ralat 'Tidak dapat mencari sebarang data PEM dalam input sijil'.. 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