Тип tls.Certificate
Тип tls.Certificate из пакета crypto/tls
представляет собой сертификат X.509 и соответствующий
ему закрытый ключ. Он используется для аутентификации
сервера или клиента при установлении TLS-соединения.
Структура содержит поля Certificate (слайс байтовых
срезов с цепочкой сертификатов), PrivateKey
(закрытый ключ) и Leaf (распарсенный сертификат).
Загрузка сертификата из файлов
Функция tls.LoadX509KeyPair загружает пару
сертификат-ключ из файлов. Первый параметр — путь к
файлу сертификата (в формате PEM), второй — путь к
файлу закрытого ключа (в формате PEM).
package 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]))
}
Результат выполнения кода:
"Loaded certificate: 1234 bytes"
Загрузка сертификата из строк
Функция tls.X509KeyPair создает сертификат из
строк PEM. В первый параметр передается строка с
сертификатом, во второй — строка с закрытым ключом.
package 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)
}
Результат выполнения кода:
"Certificate loaded: example.com"
Использование в конфигурации TLS
Загруженный сертификат используется в структуре
tls.Config для настройки TLS-сервера или клиента.
Поле Certificates принимает слайс сертификатов.
package 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")
}
Результат выполнения кода:
"TLS server started on :443"
Проверка сертификата на срок действия
Поле Leaf содержит распарсенный сертификат,
позволяя проверить его срок действия до использования
в соединении.
package 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")
}
}
Результат выполнения кода:
"Certificate is valid"
Смотрите также
-
структуру
tls.Config,
которая используется для настройки TLS-соединений -
функцию
tls.LoadX509KeyPair,
которая загружает сертификат и ключ из файлов -
функцию
tls.X509KeyPair,
которая создает сертификат из PEM-строк -
функцию
tls.Listen,
которая создает TLS-сервер с использованием конфигурации