Maison  >  Article  >  développement back-end  >  tls.X509KeyPair affiche l'erreur "Impossible de trouver des données PEM dans l'entrée du certificat"

tls.X509KeyPair affiche l'erreur "Impossible de trouver des données PEM dans l'entrée du certificat"

WBOY
WBOYavant
2024-02-05 23:00:081326parcourir

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

Contenu de la question

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 ? ? ?


Bonne réponse


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 创建一个新缓冲区,并为 publiccertIl 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer