Почему openssl s_client проверяет сертификат на несоответствующий файл CA?

Я пытаюсь получить ошибку проверки сертификата с помощью 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-certificates.crt:

  Verify return code: 0 (ok) 

Тот же результат, что и для TURKTRUST …

Сначала я подозревал, что openssl использует настройку по умолчанию для -CApath (например, / etc / ssl / certs), но когда я strace процесс, я просто вижу только open syscall для аргумента CAfile .

(все тесты, выполненные на сервере Ubuntu 10.04)

Обновление: я скопировал сертификат TURKTRUST в систему Fedora 20 и выполнил первый оператор openssl – там я получаю другой результат:

 Verify return code: 19 (self signed certificate in certificate chain) 

One Solution collect form web for “Почему openssl s_client проверяет сертификат на несоответствующий файл CA?”

Оказывается, что openssl s_client на Ubuntu 10.04 по-прежнему запрашивает местоположение по умолчанию для системных сертификатов, даже если -CApath и -CAfile :

 8466 open("/usr/lib/ssl/certs/4e18c148.0", O_RDONLY) = 4 

(выход strace)

Где:

 $ ls -l /usr/lib/ssl/certs/4e18c148.0 lrwxrwxrwx 1 root root 30 2014-04-11 21:50 /usr/lib/ssl/certs/4e18c148.0 -> Deutsche_Telekom_Root_CA_2.pem 

Каталог /usr/lib/ssl/certs является символической /usr/lib/ssl/certs на /etc/ssl/certs на Ubuntu 10.04, поэтому open строка из журнала strace не выбрана, когда grepping для '/ etc / ssl' …

Источник

Если посмотреть на openssl-0.9.8k, источник этой проблемы находится в crypto/x509/by_dir.c , dir_ctrl() :

 dir=(char *)Getenv(X509_get_default_cert_dir_env()); if (dir) ret=add_cert_dir(ld,dir,X509_FILETYPE_PEM); else ret=add_cert_dir(ld,X509_get_default_cert_dir(), X509_FILETYPE_PEM); 

Где X509_get_default_cert_dir возвращает /usr/lib/ssl/certs и X509_get_default_cert_dir_env возвращает SSL_CERT_DIR .

Временное решение

Таким образом, для получения ожидаемого поведения можно использовать следующее обходное решение под Ubuntu 10.04 / openssl 0.9.8k:

 $ SSL_CERT_DIR="" openssl s_client -crlf -verify 9 \ -CAfile /etc/ssl/certs/TURKTRUST_Certificate_Services_Provider_Root_1.crt \ -starttls smtp -host mx-ha03.web.de -port 25 

И с проверкой не удается:

 Verify return code: 19 (self signed certificate in certificate chain) 

Текущая ситуация

К счастью, с openssl 1.0.1e (например, в Fedora 20) это обходное решение не требуется, поскольку проблема исправлена. Это означает, что при указании параметра, такого как -CAfile или -CApath , -CAfile -CApath умолчанию не добавляется в список поиска каталога.

  • Почему один ящик может дешифровать файл с помощью openssl, но другой нельзя?
  • Включить шифрование 3DES для openssl 1.0.1t на Debian 7
  • Что означают все буквы и цифры в номере версии RPM Red Hat, например, openssl-devel-0.9.8e-27.el5_10.1?
  • Агент SSH не работает с частным ключом pkcs8
  • ням установить openssl-devel не удалось
  • Попытка установить spotify с помощью libssl1.0.0
  • `openssl`: Альтернативное имя субъекта
  • RHEL 6.4: Openssl 1.0.0-27 libcrypto и libssl отсутствуют
  • Расширения сертификатов при создании и подписании сертификатов с помощью openssl
  • загрузить файл / резервное копирование с удаленного сервера на рабочий стол без SSH или SCP?
  • SSH-туннелирование - локальные и удаленные случаи использования
  • Linux и Unix - лучшая ОС в мире.