Тип tls.Certificate

Тип tls.Certificate из пакета crypto/tls представляет собой сертификат X.509 и соответствующий ему закрытый ключ. Он используется для аутентификации сервера или клиента при установлении TLS-соединения. Структура содержит поля Certificate (слайс байтовых срезов с цепочкой сертификатов), PrivateKey (закрытый ключ) и Leaf (распарсенный сертификат).

Загрузка сертификата из файлов

Функция tls.LoadX509KeyPair загружает пару сертификат-ключ из файлов. Первый параметр — путь к файлу сертификата (в формате PEM), второй — путь к файлу закрытого ключа (в формате PEM).

gopackage main

import (
  "crypto/tls"
  "fmt"
  "log"
)

func main() {
  cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Loaded certificate: %d bytes\n", len(cert.Certificate[0]))
}

Результат выполнения кода:

go"Loaded certificate: 1234 bytes"

Загрузка сертификата из строк

Функция tls.X509KeyPair создает сертификат из строк PEM. В первый параметр передается строка с сертификатом, во второй — строка с закрытым ключом.

gopackage main

import (
  "crypto/tls"
  "fmt"
  "log"
)

func main() {
  certPEM := `-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJA...
-----END CERTIFICATE-----`
  keyPEM := `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhki...
-----END PRIVATE KEY-----`

  cert, err := tls.X509KeyPair([]byte(certPEM), []byte(keyPEM))
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Certificate loaded: %s\n", cert.Leaf.Subject.CommonName)
}

Результат выполнения кода:

go"Certificate loaded: example.com"

Использование в конфигурации TLS

Загруженный сертификат используется в структуре tls.Config для настройки TLS-сервера или клиента. Поле Certificates принимает слайс сертификатов.

gopackage main

import (
  "crypto/tls"
  "log"
)

func main() {
  cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
  if err != nil {
    log.Fatal(err)
  }

  cfg := &tls.Config{
    Certificates: []tls.Certificate{cert},
    MinVersion:   tls.VersionTLS12,
  }

  ln, err := tls.Listen("tcp", ":443", cfg)
  if err != nil {
    log.Fatal(err)
  }
  defer ln.Close()

  log.Println("TLS server started on :443")
}

Результат выполнения кода:

go"TLS server started on :443"

Проверка сертификата на срок действия

Поле Leaf содержит распарсенный сертификат, позволяя проверить его срок действия до использования в соединении.

gopackage main

import (
  "crypto/tls"
  "fmt"
  "log"
  "time"
)

func main() {
  cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
  if err != nil {
    log.Fatal(err)
  }

  if cert.Leaf == nil {
    log.Fatal("Leaf certificate is nil")
  }

  now := time.Now()
  if now.Before(cert.Leaf.NotBefore) {
    fmt.Println("Certificate is not yet valid")
  } else if now.After(cert.Leaf.NotAfter) {
    fmt.Println("Certificate has expired")
  } else {
    fmt.Println("Certificate is valid")
  }
}

Результат выполнения кода:

go"Certificate is valid"

Смотрите также

  • структуру tls.Config,
    которая используется для настройки TLS-соединений
  • функцию tls.LoadX509KeyPair,
    которая загружает сертификат и ключ из файлов
  • функцию tls.X509KeyPair,
    которая создает сертификат из PEM-строк
  • функцию tls.Listen,
    которая создает TLS-сервер с использованием конфигурации