Назад | Перейти на главную страницу

exim4 проверка сертификатов клиентов всегда недействительна

Мой exim-сервер настроен на запрос клиентских сертификатов при установлении соединения. Я установил ACL (на этапе rcpt) для регистрации или добавления заголовка, соответственно. результата проверки сертификата:

warn
   encrypted = *
   ! verify = certificate
   #condition = ${if def:tls_in_peerdn {yes}{no}}   # -> newer versions of exim use $tls_in_peerdn!
   condition = ${if def:tls_peerdn {yes}{no}} 
   add_header = X-TLS-Client-Certificate: invalid (${tls_peerdn})
   log_message = Invalid TLS client certificate presented (${tls_peerdn}).

warn
   encrypted = *
   ! verify = certificate
   condition = ${if def:tls_peerdn {no}{yes}} 
  log_message = No TLS client certificate presented.

warn
   verify = certificate  
   add_header = X-TLS-Client-Certificate: valid
   condition = false

К сожалению, ни одно сообщение, которое я вижу, не проверяется как действительное. Однако проверка на отсутствие сертификата работает.

Я настроил

tls_try_verify_hosts = *

Итак, проверка выполняется и (при использовании Debian она включена в стандартную конфигурацию) настраиваются и доступны якоря доверия:

tls_verify_certificates = /etc/ssl/certs/ca-certificates.crt

Тестирование с ...

openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -verify 4 -connect mailserver.dom.tld:25 -starttls smtp -cert /etc/ssl/letsencrypt/fullchain.pem -key /etc/ssl/letsencrypt/privkey.pem

... от сервера к самому себе с использованием того же ключа, что и сервер, включая промежуточные сертификаты в правильном порядке, не дает действительного результата проверки.

Что мне не хватает?

Если ваш сервер использует конфигурацию по умолчанию, он должен использовать snakeoil самоподписанный сертификат. Этого достаточно и приемлемо для установления соединений TLS для исходящих и входящих соединений. Однако он не пройдет проверку. Вам нужно будет использовать сертификат от доверенного центра для прохождения проверки.

Предоставляете ли вы клиентам сертификаты, которые они могут использовать вместо входа в систему? Я бы ожидал, что сертификаты клиентов будут часто выходить из строя, кроме ваших пользователей, которым предоставлены сертификаты пользователей. Многие серверы используют самозаверяющий сертификат или имеют другие проблемы, которые могут вызвать сбои проверки.

Exim не будет запрашивать сертификат клиента, если вы не установите tls_verify_hosts или tls_try_verify_hosts. Сертификат хорошо освещен в Зашифрованные SMTP-соединения раздел документации Exim.

У многих организаций возникают проблемы с правильной настройкой DNS для использования STMP. DKIM вызывает особые хлопоты, и большинство подписывающих сторон, с которыми я сталкиваюсь, не проходят проверку. Я мало надеюсь, что многие сайты настроили свои серверы с правильными действующими сертификатами.

После недавнего ограничения подключений к TLS v1.0 и выше мне пришлось прекратить объявлять STARTTLS к ряду серверов. Я еще не прибегал к проверке сертификатов TLS для каких-либо клиентов. Если я когда-нибудь это сделаю, это будет в лучшем случае засчитываться в их рейтинг спама. Я могу включить tls_peerdn селектор журнала, чтобы выяснить, могут ли какие-либо сайты пройти проверку.

SMTP через TLS растет, но далеко от стандарта. Те сайты, которые его используют, - это сайты, которым доверяют иными способами.

ОБНОВЛЕНИЕ: я проверил свои журналы, и пока только два отправителя прошли проверку. Большинство клиентов не подтвердили.

Я пробовал проверить свой сертификат:

  • OpenSSL подключается как openssl.client.net который не должен проходить проверку rDNS.
  • Fullchain.cert не ведет обратную связь с сертификатом в хранилище доверенных сертификатов по умолчанию. Это нормально, поскольку сертификат цепочки подписан сертификатом в хранилище доверенных сертификатов.
  • Похоже, openssl даже не пытается отправить сертификат клиента. Возможно, из-за цепочки доверия. Это может сработать, если вы добавите третий сертификат в файл fullchain.pem.
  • Я вижу DN сервера в списке, но нет никаких указаний на то, что open_ssl даже пытался отправить сертификат.

Я использовал тестовую команду:

echo quit | openssl s_client -cert fullchain.pem -key privkey.pem \
   -starttls smtp -connect mail.systemajik.com:587 -debug 2>&1 | less

Значение параметра -CAfile должно быть вашим Let's encrypt chain.pem и значением -cert cert.pem:

openssl s_client -CAfile /etc/ssl/letsencrypt/chain.pem -verify 4 \
        -connect mailserver.dom.tld:25 -starttls smtp \
        -cert /etc/ssl/letsencrypt/cert.pem \
        -key /etc/ssl/letsencrypt/privkey.pem

Таким образом, ваш сертификат будет проверен вашим сервером.