Перейти к содержимому
ecdsa.com
GNU Wget built with GnuTLS (Debian, Ubuntu before 22.04 used it too)curl

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

ERROR: The certificate of 'api.example.com' is not trusted.

Также выводится как

  • ERROR: The certificate of 'api.example.com' doesn't have a known issuer.

Эту пару строк выводят только сборки wget с GnuTLS. Сборки с OpenSSL (Ubuntu 22.04 и новее, Alpine, wget 1.x в Fedora) сообщают о той же ситуации как «ERROR: cannot verify <host>'s certificate, issued by '…'», а затем «Unable to locally verify the issuer's authority.»

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

GnuTLS (TLS-библиотека, с которой wget собран в Debian) не смогла проверить сертификат сервера, поэтому wget отказывается скачивать. Эта первая строка общая; настоящую причину называет строка, которую wget выводит сразу после неё, чаще всего «doesn't have a known issuer» (нет пути к доверенному корневому сертификату) или «has expired». wget завершается с кодом 5 (ошибка проверки SSL).

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

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

  1. 1.

    Прочитайте следующую строку

    Настоящий диагноз — во втором сообщении об ошибке, которое тоже начинается с ERROR. «doesn't have a known issuer» указывает на проблему с CA или цепочкой; «has expired» и «is not yet activated» — на даты; «owner does not match hostname» — на несовпадение имени.

    bash
    wget -O /dev/null https://api.example.com/ 2>&1 | grep '^ERROR'
    # ... is not trusted.
    # ... doesn't have a known issuer.   <- chain/CA problem
    # ... has expired.                   <- date problem
  2. 2.

    Укажите wget, какому CA доверять

    --ca-certificate принимает PEM-файл с одним или несколькими сертификатами CA; параметр ca_certificate в ~/.wgetrc или /etc/wgetrc делает это постоянной настройкой. --ca-directory работает с каталогом сертификатов, проиндексированным по хешам.

    bash
    wget --ca-certificate=/opt/certs/corp-root-ca.pem https://api.example.com/
    
    # permanently, for this user or system-wide (/etc/wgetrc)
    echo 'ca_certificate = /opt/certs/corp-root-ca.pem' >> ~/.wgetrc
  3. 3.

    Установите CA в системный пакет сертификатов

    В Debian и Ubuntu утилита update-ca-certificates добавляет сертификаты с расширением .crt из /usr/local/share/ca-certificates в файл /etc/ssl/certs/ca-certificates.crt, который GnuTLS читает по умолчанию.

    bash
    sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt
    sudo update-ca-certificates
    # minimal images: install the bundle first
    apt-get install -y --no-install-recommends ca-certificates
  4. 4.

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

    Если в рукопожатии только один сертификат и его издатель — промежуточный CA, укажите в конфигурации сервера файл с полной цепочкой.

    bash
    # Server side: count the certificates in the handshake (1 = leaf only)
    openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \
      | grep -c 'BEGIN CERTIFICATE'
  5. 5.

    Временная диагностика: один раз пропустите проверку

    --no-check-certificate показывает, есть ли проблемы помимо доверия. Флаг отключает всю проверку сертификата, поэтому прокси или злоумышленник может незаметно подменить то, что вы скачиваете; никогда не используйте его для установщиков или скриптов.

    bash
    # Diagnostic only: proves the download works when trust is ignored
    wget --no-check-certificate -O /dev/null https://api.example.com/

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

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