Я пытаюсь выдать ошибку проверки сертификата openssl s_client
следующим образом:
$ openssl s_client -crlf -verify 9 \
-CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
-starttls smtp -host mx-ha03.web.de -port 25
Сертификат сервера web.de сертифицирован Deutsche Telekom CA, а не TURKTRUST, поэтому приведенная выше команда должна завершиться ошибкой, верно?
Но это сообщает:
Verify return code: 0 (ok)
Почему?
Я имею в виду, что аналоговая команда gnutls-cli завершается неудачно, как и ожидалось:
$ { echo -e 'ehlo example.org\nstarttls' ; sleep 1 } | \
gnutls-cli --starttls --crlf \
--x509cafile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.pem \
--port 25 mx-ha03.web.de
[..]
*** Verifying server certificate failed...
Делая перекрестную проверку, т.е. используя вместо этого --x509cafile /etc/ssl/certs/ca-certificates.crt
с gnutls-cli я получаю:
[..]
- The hostname in the certificate matches 'mx-ha03.web.de'.
- Peer's certificate is trusted
(что также ожидается)
Openssl s_client печатает для ca-certificate.crt:
Verify return code: 0 (ok)
Тот же результат, что и для TURKTRUST ...
Сначала я подозревал, что openssl использует настройку по умолчанию для -CApath
(например, / etc / ssl / certs), но когда я выполняю strace
процесс, я вижу только open
системный вызов для аргумента CAfile
.
(все тесты выполнены на сервере Ubuntu 10.04)
Обновление: я скопировал сертификат TURKTRUST в систему Fedora 20 и выполнил первый оператор openssl - там я получил другой результат:
Verify return code: 19 (self signed certificate in certificate chain)
источник
-verify_return_error
командой завершается со статусом выхода 1. С Fedora 29 и openssl-1.1.1-3.fc29.x86_64 все по-прежнему работает, как ожидалось, то есть обходной путь не обязательно-no-CAfile
( не загружать сертификаты доверенного ЦС из расположения файла по умолчанию ) и-no-CApath
( не загружать сертификаты доверенного ЦС из расположения каталога по умолчанию ), но моя система этого не делает, поэтому я их не проверял.