Rumah >pembangunan bahagian belakang >Golang >tls.X509KeyPair muncul ralat 'Tidak dapat mencari sebarang data PEM dalam input sijil'.
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? ? ?
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
创建一个新缓冲区,并为 publiccert
Lebih 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!