2015-12-10 6 views
5

Ich verwende x/crypto/pkcs12, um eine DER-formatierte * .p12-Datei zu laden. Es gibt an example in the documentation, das tls.X509KeyPair verwendet, um einen tls.Certificate zu erstellen, der für einen HTTP-Client verwandt werden kann.Wie man ein x509.Certificate in ein tls.Certificate in Go verwandelt?

Das ist perfekt und funktioniert gut. Aber ich möchte auch überprüfen, dass das Zertifikat nicht abgelaufen ist. Die pkcs12 Bibliothek hat auch eine Decode function, die ein x509-Zertifikat zurückgibt, dass ich als Methode verwenden kann. Das funktioniert auch gut.

Es scheint mir nur merkwürdig, dass ich die DER zweimal dekodiere. Einmal für eine x509.Certificate zu verifizieren, und wieder eine tls.Certificate zu bekommen. Ich kenne die Beziehung zwischen diesen beiden Certificate-Strukturen nicht, aber da das tls-Paket eine Funktion namens tls.X509KeyPair hat, die einige Bytes benötigt, sollte es nicht auch einen offensichtlichen Weg geben, ein tls.Certificate von einem x509 zu erhalten. Zertifikat oder umgekehrt? Was vermisse ich?

Antwort

3

Ein tls.Certificate speichert oft ein Zertifikat Kette - mit anderen Worten,> 1 Zertifikat. Beachten Sie, dass das Feld Certificate vom Typ [][]byte ist, wobei jedes Zertifikat eine []byte ist.

Das Paket tls importiert das x509-Paket, daher gibt es keine Funktion in x509, um ein tls.Certificate zu erhalten; das würde einen Importzyklus verursachen. Aber wenn Sie ein x509.Certificate haben, haben Sie bereits ein tls.Certificate; Setzen Sie einfach die Raw Bytes des x509.Certificates in eine Certificate Scheibe des tls.Certificates.

+0

Danke Matt. Ich werde es versuchen. Muss ich irgendetwas mit den anderen Feldern von tls.Certificate machen oder irgendwelche Funktionen aufrufen, oder soll es "einfach funktionieren"? Ich bemerkte, dass x509.Certificate.Verify() auch Ketten zurückgibt. – nathany

+0

TLS-Server benötigen das Feld PrivateKey, um den Handshake erfolgreich abzuschließen. Ich denke, der Rest ist optional. – Matt

+0

Sieht so aus, als brauche ich einen PrivateKey für Clients. Etwas nachgehen. Tls: Client-Zertifikat privaten Schlüssel des Typs implementiert nicht Crypto.Signer – nathany

Verwandte Themen