2015-12-10 13 views
5

Używam x/crypto/pkcs12 do załadowania pliku * .p12 sformatowanego w DER. Jest an example in the documentation, który używa tls.X509KeyPair do utworzenia tls.Certificate, który może być użyty dla klienta HTTP.Jak zmienić certyfikat x509.Clicencja w certyfikat Tls.Certyfikat w Go?

To jest idealne i działa dobrze. Ale chcę też sprawdzić, czy certyfikat nie wygasł. Biblioteka pkcs12 ma także Decode function, która zwraca certyfikat x509, który można użyć, niż do korzystania z metody Verify. To również działa dobrze.

Po prostu wydaje mi się dziwne, że dwukrotnie dekoduję DER. Raz do sprawdzenia, aby uzyskać x509.Certificate, aby uzyskać tls.Certificate. Nie znam relacji między tymi dwiema strukturami certyfikatów, ale widząc, że pakiet tls ma funkcję o nazwie tls.X509KeyPair, która zajmuje kilka bajtów, nie powinien istnieć również oczywisty sposób uzyskania certyfikatu tls.certificate z x509. Certyfikat lub wiza versa? czego mi brakuje?

Odpowiedz

3

Certyfikat tls. często przechowuje certyfikat łańcuch - innymi słowy,> 1 certyfikat. Należy zauważyć, że jego pole Certificate jest typu [][]byte, gdzie każdy certyfikat to []byte.

Pakiet tls importuje pakiet x509, więc nie ma funkcji w x509, aby uzyskać certyfikat tls.c; które spowodowałoby cykl importu. Ale jeśli posiadasz certyfikat x509, masz już certyfikat Tls.Certyfikat; po prostu umieść bajty x509.Certificate na Raw w plasterku tls.Certificate's Certificate.

+0

Dzięki Matt. Dam temu szansę. Czy muszę zrobić cokolwiek z innymi polami tls.Certificate lub zadzwonić do dowolnej funkcji, czy powinien "po prostu działać"? Zauważyłem, że x509.Certificate.Verify() również zwraca łańcuchy. – nathany

+0

Serwery TLS będą wymagały pola 'PrivateKey', aby pomyślnie ukończyć uzgadnianie. Myślę, że reszta jest opcjonalna. – Matt

+0

Wygląda na to, że potrzebuję klucza PrivateKey dla klientów. Patrząc w to. tls: klucz prywatny certyfikatu klienta typu nie implementuje crypto.Signer – nathany