2015-12-10 1 views
5

Я использую x/crypto/pkcs12 для загрузки форматированного файла * .p12 в формате DER. Существует an example in the documentation, который использует tls.X509KeyPair, чтобы сделать tls.Certificate, который может использоваться для HTTP-клиента.Как превратить x509.Certificate в tls.Certificate в Go?

Это прекрасно, и отлично работает. Но тогда я также хочу проверить, что сертификат не истек. Библиотека pkcs12 также имеет Decode function, которая возвращает сертификат x509, который я могу использовать, используя метод Verify. Это также отлично работает.

Мне кажется странным, что я дважды декодирую DER. Один раз для x509.Certificate, чтобы проверить, и снова, чтобы получить tls.Certificate. Я не знаю отношений между этими двумя структурами сертификатов, но, видя, что в пакете tls есть функция с именем tls.X509KeyPair, которая занимает несколько байтов, не должно быть очевидного способа получить tls.Certificate из x509. Сертификат или наоборот? Что мне не хватает?

ответ

3

A tls.Certificate часто хранит сертификат chain - другими словами,> 1 сертификат. Обратите внимание, что его поле Certificate имеет тип [][]byte, где каждый сертификат является []byte.

Пакет tls импортирует пакет x509, поэтому в x509 нет функции для получения tls.Certificate; что вызовет цикл импорта. Но если у вас есть сертификат x509.Certificate, у вас уже есть tls.Certificate; просто введите x509.Certificate's Raw байт в фрагмент tts.Certificate's Certificate.

+0

Thanks Matt. Я попробую. Нужно ли мне что-либо делать с другими полями tls.Certificate или вызвать какие-либо функции, или же «просто работать»? Я заметил, что x509.Certificate.Verify() также возвращает цепочки. – nathany

+0

Для серверов TLS потребуется поле 'PrivateKey' для успешного завершения рукопожатия. Я думаю, что остальное необязательно. – Matt

+0

Похоже, мне нужен PrivateKey для клиентов. Вглядываясь в него. tls: закрытый ключ клиента сертификата типа не реализует crypto.Signer – nathany