Перейти к содержимому
ecdsa.com
OpenSSL CLI (openssl s_client / openssl verify)OpenSSL CLI

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

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.

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

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

  1. 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. 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. 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

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

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