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
Lepaskan: 2024-02-05 23:00:08
ke hadapan
1386 orang telah melayarinya

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

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

Ia menunjukkan ralat seperti di bawah

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input
Salin selepas log masuk

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

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


Jawapan betul


Terdapat beberapa masalah dengan kod ini

publiccert := out.bytes()
Salin selepas log masuk

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

certderblock, publiccert := pem.decode(publiccert)
Salin selepas log masuk

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

Sepatutnya begini

certderblock, _ := pem.decode(publiccert)
Salin selepas log masuk

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

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()
Salin selepas log masuk
privitkey 创建一个新缓冲区,并为 publiccertLebih baik buat penimbal baharu untuk privitkey dan simpan penimbal sedia ada untuk

out = &bytes.Buffer{}
Salin selepas log masuk

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!

Label berkaitan:
lol
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