Heim > Backend-Entwicklung > Golang > tls.X509KeyPair zeigt den Fehler „Es konnten keine PEM-Daten in der Zertifikatseingabe gefunden werden' an

tls.X509KeyPair zeigt den Fehler „Es konnten keine PEM-Daten in der Zertifikatseingabe gefunden werden' an

WBOY
Freigeben: 2024-02-05 23:00:08
nach vorne
1340 Leute haben es durchsucht

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

Frageninhalt

Ich versuche, ein TLS-Zertifikat für einen https-Server über das Golang x509-Paket zu erstellen

Ich habe diesen Fehler erhalten

tls: failed to find any pem data in certificate input
Nach dem Login kopieren

Nach einiger Recherche habe ich mein Zertifikat so erstellt

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())
    }
}
Nach dem Login kopieren

Der Fehler wird wie folgt angezeigt

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input
Nach dem Login kopieren

Ich versuche nach pem.encodetomemory zu dekodieren

pem.type ist korrekt, aber die Variable „publiccert“ ist Null. Ich habe versucht, n am Anfang des Zertifikats hinzuzufügen und es hat nichts bewirkt, aber das Zertifikat selbst ist nicht Null. Kann mir jemand helfen

Was kann ich tun, damit TLS funktioniert? ? ?


Richtige Antwort


Es gibt mehrere Probleme mit diesem Code

publiccert := out.bytes()
Nach dem Login kopieren

Inspektion in dieser Phasepubliccert的内容显示了期望值。但以下语句将简单地覆盖 publiccert:

certderblock, publiccert := pem.decode(publiccert)
Nach dem Login kopieren

Durch Ankreuzen publiccert 可以看到这一点。 如文档所述 publiccert nach dieser Anweisung werden nun die Daten nach dem eigentlichen Zertifikat angezeigt.

So sollte es sein

certderblock, _ := pem.decode(publiccert)
Nach dem Login kopieren

Eine Überprüfung des publiccert Inhalts nach dieser korrigierten Aussage zeigt wieder den erwarteten Wert.

out.reset()
privatepem, _ := x509.marshalpkcs8privatekey(certpriv)
pem.encode(out, &pem.block{type: "private key", bytes: privatepem})
privitkey := out.bytes()
Nach dem Login kopieren

Dadurch wird der erwartete Wert in privitkey übernommen. Es wird sich jedoch ändern privitkey 中。但是,它将更改 publiccert,因为它只是 out 的一部分,并且 out 已更改操作。因此,out 现在将在开头包含 privitkey,而不再是证书的开头 - 这反映在 publiccert, da es nur ein Teil von out ist und out die Aktion geändert hat. Daher enthält out jetzt privitkey am Anfang statt am Anfang des Zertifikats – dies spiegelt sich im Wert von

wider.

Siehe auch die Dokumentation für bytes.buffer.bytes

Slicessind nur bis zur nächsten Pufferänderung gültig

(d. h. nur gültig, bis die nächste Lese-, Schreib-, Reset- oder Truncate-Methode aufgerufen wird)

Also nicht nur den vorhandenen Puffer zurücksetzen

out.reset()
Nach dem Login kopieren
privitkey 创建一个新缓冲区,并为 publiccertEs ist besser, einen neuen Puffer für privitkey zu erstellen und den vorhandenen Puffer für

beizubehalten
out = &bytes.Buffer{}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vontls.X509KeyPair zeigt den Fehler „Es konnten keine PEM-Daten in der Zertifikatseingabe gefunden werden' an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
lol
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage