Проверить корректность отработки SSL в postfix/dovecot/courier

Както давненько был куплен сертификат для mail сервера, я его закинул на сервак, прописал путь к нему и к CA что предоставил центр сертификации где покупали, и усе. При этом outlook при первом обращении на него всетаки ругнулся, но достаточно было один раз ткнуть чтото типа «Доверяю и не спрашивать больше» и все прекрасно заработало. Времени копать дальше не было, как обычно, проехали-забыли. Но осадок остался … вот выдалось время разобраться в этом деле поглубже, для начала пара полезных команд:

openssl s_client -CApath /etc/ssl/certs/ -connect mail.nixcraft.net:443
openssl s_client -CApath /etc/ssl/certs/ -connect mail.somadomain.com.ua:995
openssl s_client -CApath /etc/ssl/certs/ -connect mail.somedomain.com.ua:587 -starttls smtp

А теперь по существу «моей проблемы». Чтобы все работало верно сертификат со стороны сервера должен состоять из сертификатов CA (очень желательно всех до корня) и сертификата выданого на данный сервер. Как проверить что у нас есть в данный момент? Просто!
Например:
Запускаем тест соединения с SMTP сервером с поддержкой TLS

openssl s_client -CApath /etc/ssl/certs/ -connect mail.somedomain.com.ua:995


Видим довольно длинный выхлоп, но нас интересуют строчки в начале:

depth=2 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = PositiveSSL CA 2 verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = mail.somedomain.com.ua verify return:1
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=mail.somedomain.com.ua
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=PositiveSSL CA 2
 1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=PositiveSSL CA 2
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
---

Несмотря на то что проверка пройдена успешно, более правильно всетаки вставить и CA сертификат AddTrust-а в сертификат на сервере. Как я увидел что его там нет? Очень просто, цепочка сертификатов не соответствует глубине проверки, смотим опять в выхлом приведенный выше:
depth=2
Говорит о том что глубина проверки до корневого сертификата равна 3-м (счет идет с нуля), а
Certificate chain
состоит всего из двух записей, а это какраз то что выдает нам сам сервер 🙂
По логике работы, это не является ошибкой, софт адаптирован к таким ситуациям, и либо сам проверяет данный сертификат на валидность, либо предлагает пользователю подтвердить «неправильный» сертификат для работы с сервисом. Но не всегда это прописано в софте, да и если быть совсем уж честным, мы кривим душой говоря что «сервис настроен правильно». Если верить RFC то сертификат со стороны сервера всетаки нужно выдавать клиентам со всеми CA, в таком порядке:
1. Сертификат сервера
2. CA вашего центра сертификации
3. CA более высокого уровня
4. и так до корня!
В моем конкретно приведенном выше случае, нехватало одного CA — AddTrust, который я без проблем скачал с их официального сайта и скопировал в конец файла сертификатов скормленный postfix-у и courier-у. Передернул сервисы. После чего провел еще один тест, чтобы убедиться в правильности работы:

openssl s_client -CApath /etc/ssl/certs/ -connect mail.somedomain.com.ua:995
CONNECTED(00000003)
depth=2 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = PositiveSSL CA 2 verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = mail.somedomain.com.ua
verify return:1
---
Certificate chain
 0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=mail.somedomain.com.ua
   i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=PositiveSSL CA 2
 1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=PositiveSSL CA 2
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
 2 s:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
   i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFCjC...................

В этом листинге уже видим что все по честному, наш сервер предоставляет клиенту не только наш собственный сертификат, но и полную цепочку для проверки валидности. Это гуд!
Для проверки цепочки сертификата также можно на локальной машине/сервере использовать команду:

openssl x509 -issuer -subject -noout -in file.crt

Удачи!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?