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
WBOYnach vorne
2024-02-05 23:00:081339Durchsuche

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 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())
    }
}

Der Fehler wird wie folgt angezeigt

CERTIFICATE
publicCert nil
tls: failed to find any PEM data in certificate input

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

Was kann ich tun, damit TLS funktioniert? ? ?


Richtige Antwort


Es gibt mehrere Probleme mit diesem Code

publiccert := out.bytes()

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

certderblock, publiccert := pem.decode(publiccert)

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

So sollte es sein

certderblock, _ := pem.decode(publiccert)

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()

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()
privitkey 创建一个新缓冲区,并为 publiccertEs ist besser, einen neuen Puffer für privitkey zu erstellen und den vorhandenen Puffer für

beizubehalten
out = &bytes.Buffer{}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen