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

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

x509: certificate is valid for example.com, not api.example.com

Оба значения подставляются при каждой ошибке свои: сначала имена, которые покрывает сертификат, затем имя, которое запросил ваш клиент.

Go crypto/x509 — HostnameError from VerifyHostname / TLS dials

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

Установка TLS-соединения дошла до чтения сертификата, но ни одно из его альтернативных имён субъекта (SAN) не совпадает с именем хоста, к которому подключался клиент. Ошибка показывает обе стороны, поэтому расхождение видно сразу: сертификат покрывает X, а вы запрашивали Y. Обратите внимание: современная проверка использует только SAN, а устаревшее поле общего имени (CN) игнорируется.

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

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

  1. 1.

    Перевыпустите сертификат со всеми именами, которые вы действительно используете

    Укажите все имена хостов как SAN при выпуске сертификата; чтобы узнать, что покрыто сейчас, посмотрите текущий список SAN.

    bash
    echo | openssl s_client -connect host:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -ext subjectAltName
    # request with SANs:
    openssl req -new -key key.pem -out req.csr \
      -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:api.example.com"
  2. 2.

    Подключайтесь по имени или явно задайте ServerName

    Если сетевой адрес должен отличаться от имени в сертификате (VIP, проброс портов, sidecar), сохраните проверку полноценной: явно укажите в настройках TLS, какой идентификатор сервера вы ожидаете.

    go
    conn, err := tls.Dial("tcp", "10.0.0.5:443", &tls.Config{
        ServerName: "api.example.com",   // matched against SANs, sent as SNI
    })

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

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