Перейти к содержимому
ecdsa.com
Go crypto/x509Go

Сообщение об ошибке

x509: certificate signed by unknown authority

Go crypto/x509 — returned by Certificate.Verify and TLS dials

Что это означает

Go попытался построить цепочку от сертификата сервера до корневого сертификата, которому он доверяет, и не смог: ни один путь не заканчивается сертификатом из настроенного пула корневых сертификатов. Сам сертификат может быть полностью действительным — просто у Go нет причин доверять его издателю. Это самая частая ошибка TLS в развёртываниях на Go.

Почему это происходит

Как исправить

  1. 1.

    Добавьте CA в пул корневых сертификатов клиента

    Дополните системный пул, а не заменяйте его, чтобы публичные сайты продолжали работать вместе с вашим внутренним CA.

    go
    roots, err := x509.SystemCertPool()
    if err != nil { roots = x509.NewCertPool() }
    pem, _ := os.ReadFile("internal-ca.pem")
    roots.AppendCertsFromPEM(pem)
    
    client := &http.Client{Transport: &http.Transport{
        TLSClientConfig: &tls.Config{RootCAs: roots},
    }}
  2. 2.

    Исправьте сервер: отдавайте полную цепочку

    Проверьте, что сервер отправляет на самом деле; если в ответе только один сертификат, укажите в конфигурации сервера файл с полной цепочкой (например, fullchain.pem от Let's Encrypt).

    bash
    openssl s_client -connect api.example.com:443 -showcerts </dev/null \
      | grep -c "BEGIN CERTIFICATE"   # 1 = leaf only (broken), 2+ = chain present
  3. 3.

    Добавьте сертификаты CA в образ

    Для минимальных образов копируйте пакет сертификатов CA в образ при сборке. Никогда не «решайте» проблему через InsecureSkipVerify — это полностью отключает проверку.

    docker
    FROM alpine AS certs
    RUN apk add --no-cache ca-certificates
    
    FROM scratch
    COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

Связанные ошибки

Открыть всю базу ошибок подписей