Сообщение об ошибке
verify error:num=18:self-signed certificate
Также выводится как
- verify error:num=18:self signed certificate
- Verify return code: 18 (self-signed certificate)
- error 18 at 0 depth lookup: self-signed certificate
OpenSSL 3.x выводит «self-signed», 1.1.1 — «self signed». s_client показывает «verify error:num=18:…» и «Verify return code: 18 (…)»; openssl verify — «error 18 at 0 depth lookup: …».
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
Что это означает
Ошибка OpenSSL 18 (X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT): сертификат на глубине 0 самоподписанный (его издатель — он сам), и его нет в хранилище доверенных сертификатов. Над ним нет CA, поэтому ни промежуточный сертификат, ни пакет сертификатов не помогут: этому сертификату нужно доверять напрямую или заменить его сертификатом, выпущенным CA.
Почему это происходит
Сервер использует самоподписанный сертификат
частоСерверы разработки, специализированные устройства, административные интерфейсы и только что установленные сервисы часто начинают работу со сгенерированным сертификатом.
Для неизвестного имени отдаётся сертификат по умолчанию
иногдаОбратные прокси и ingress-контроллеры отвечают на имена, для которых у них нет конфигурации, самоподписанным сертификатом по умолчанию; проверьте SNI и маршрутизацию.
openssl verify запущен для корневого сертификата
иногдаЗапуск openssl verify root.pem без -CAfile root.pem выдаёт ошибку 18 для любого самоподписанного корневого сертификата, даже действительного.
Как исправить
- 1.
Убедитесь, что субъект и издатель совпадают
Если субъект совпадает с издателем, сертификат самоподписанный; с ожидаемым значением нужно сравнивать его отпечаток.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -issuer -fingerprint -sha256 # subject == issuer: self-signed - 2.
Для тестов доверяйте именно этому сертификату
Если передать сам сертификат в -CAfile, OpenSSL будет принимать именно этот сертификат. Предварительно сверьте отпечаток по доверенному каналу.
bash # Trust this exact certificate for a check (after confirming the fingerprint out of band) echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -out api.pem echo | openssl s_client -connect api.example.com:443 -servername api.example.com -CAfile api.pem 2>&1 | grep 'Verify return code' - 3.
Проверьте корневой сертификат по нему самому
Самоподписанный корневой сертификат проходит проверку, только когда он и есть якорь доверия: передайте его в -CAfile.
bash # Verifying a root CA certificate itself needs the root as its own trust anchor openssl verify -CAfile root.pem root.pem # root.pem: OK