Maison > développement back-end > Golang > 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
Libérer: 2024-02-05 23:00:08
avant
1386 Les gens l'ont consulté

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
Copier après la connexion

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())
    }
}
Copier après la connexion

Il affiche l'erreur comme ci-dessous

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input
Copier après la connexion

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

Que puis-je faire pour que cela fonctionne ? ? ?


Bonne réponse


Il y a plusieurs problèmes avec ce code

publiccert := out.bytes()
Copier après la connexion

Contrôle à ce stadepubliccert的内容显示了期望值。但以下语句将简单地覆盖 publiccert :

certderblock, publiccert := pem.decode(publiccert)
Copier après la connexion

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)
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion
privitkey 创建一个新缓冲区,并为 publiccertIl est préférable de créer un nouveau tampon pour privitkey et de conserver le tampon existant pour

out = &bytes.Buffer{}
Copier après la connexion

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!

Étiquettes associées:
lol
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal