Maison > Article > développement back-end > tls.X509KeyPair affiche l'erreur "Impossible de trouver des données PEM dans l'entrée du certificat"
J'essaie de créer un certificat tls pour le serveur https via le package golang x509
J'ai eu cette erreur
tls: failed to find any pem data in certificate input
Après quelques recherches, j'ai créé mon certificat comme ça
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()) } }
Il affiche l'erreur comme ci-dessous
CERTIFICATE publicCert nil tls: failed to find any PEM data in certificate input
J'essaie de décoder après pem.encodetomemory
pem.type est correct mais la variable "publiccert" est nulle, j'ai essayé d'ajouter n au début du certificat et cela n'a rien fait mais le certificat lui-même n'est pas nul, quelqu'un peut-il m'aider p>
Que puis-je faire pour que cela fonctionne ? ? ?
Il y a plusieurs problèmes avec ce code
publiccert := out.bytes()
Contrôle à ce stadepubliccert
的内容显示了期望值。但以下语句将简单地覆盖 publiccert
:
certderblock, publiccert := pem.decode(publiccert)
En cochant publiccert
可以看到这一点。 如文档所述 publiccert
après cette déclaration, les données seront désormais affichées après le certificat lui-même.
Ça devrait être comme ça
certderblock, _ := pem.decode(publiccert)
La vérification du contenu publiccert
après cette déclaration corrigée montre à nouveau la valeur attendue.
out.reset() privatepem, _ := x509.marshalpkcs8privatekey(certpriv) pem.encode(out, &pem.block{type: "private key", bytes: privatepem}) privitkey := out.bytes()
Cela obtiendra la valeur attendue dans privitkey
. Cependant, cela va changer privitkey
中。但是,它将更改 publiccert
,因为它只是 out
的一部分,并且 out
已更改操作。因此,out
现在将在开头包含 privitkey
,而不再是证书的开头 - 这反映在 publiccert
car cela fait juste partie de out
et out
a modifié l'action. Par conséquent, out
contiendra désormais privitkey
au début au lieu du début du certificat - cela se reflète dans la valeur de
Voir également la documentation de bytes.buffer.bytes
Les tranchesne sont valables que jusqu'à la prochaine modification du tampon
(c'est-à-dire, valables uniquement jusqu'à ce que la prochaine méthode de lecture, d'écriture, de réinitialisation ou de troncature soit appelée)Donc, pas seulement réinitialiser le tampon existant
out.reset()
privitkey
创建一个新缓冲区,并为 publiccert
Il est préférable de créer un nouveau tampon pour privitkey
et de conserver le tampon existant pour
out = &bytes.Buffer{}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!