Сообщение об ошибке
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).
Почему это происходит
Сертификат выпущен частным CA
частоЦепочки корпоративных и лабораторных сертификатов, а также сертификатов Kubernetes ведут к корневым сертификатам, которых нет в пакете ca-certificates в Debian; GnuTLS в таком случае сообщает о неизвестном издателе.
Сервер не отправляет свой промежуточный сертификат
частоGnuTLS не загружает недостающие промежуточные сертификаты. Если сервер отдаёт только конечный сертификат, здесь возникает ошибка, хотя браузеры, которые кешируют и сами загружают промежуточные сертификаты, показывают сайт как безопасный.
Прокси с инспекцией TLS переподписывает соединение
иногдаКорпоративный прокси предъявляет сертификаты, выпущенные его собственным корневым CA. Пока этот корневой сертификат не установлен в системный пакет сертификатов на этой машине (или в контейнере), любое скачивание по HTTPS завершается ошибкой.
В системе нет пакета сертификатов CA
иногдаМинимальные образы Debian и Ubuntu не содержат пакета сертификатов ca-certificates. Тогда даже для известных публичных сайтов wget сообщает «not trusted».
Как исправить
- 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.
Укажите 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.
Установите 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.
Владельцам серверов: отправляйте полную цепочку
Если в рукопожатии только один сертификат и его издатель — промежуточный 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.
Временная диагностика: один раз пропустите проверку
--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/
Связанные ошибки
ERROR: cannot verify api.example.com's certificate, issued by 'CN=Example Priva…GNU Wget built with OpenSSL (Ubuntu 22.04+, Alpine, RHEL/CentOS)ERROR: The certificate of 'api.example.com' has expired.GNU Wget built with GnuTLS (Debian)curl: (60) SSL certificate problem: unable to get local issuer certificatecurl (OpenSSL backend)fatal: unable to access 'https://git.example.com/team/app.git/': server verific…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)