Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

38. Шифрование соединений с использованием TLS/SSL

Поддержка для TLS (Transport Layer Security), прежде известной как SSL (Secure Sockets Layer), осуществлена с использованием библиотек OpenSSL или GnuTLS (exim требует GnuTLS релиза 1.0 или более позднего). В дистрибутиве exim нет никакого кода для непосредственного осуществления TLS. Для его использования Вы должны инсталлировать OpenSSL или GnuTLS, а затем собрать версию exim в который включена поддержка TLS (смотрите раздел 4.6). Также Вы должны понимать базовые концепции шифрования на организационном уровне и, в частности, способы использования публичных ключей, частных ключей и сертификатов.

RFC 3207 задаёт, как SMTP-соединения могут использовать шифрование. Как только установлено подключение, клиент даёт команду STARTTLS. Если сервер её принимает, клиент и сервер договариваются о механизме шифрования. Если договорённость успешна, данные, впоследствии передаваемые между ними, зашифрованы.

ACL exim позволяют детектировать, зашифрован текущий сеанс или нет, и, таким образом, какой метод шифрования используется, предоставил ли клиент сертификат, и был ли сертификат проверен. Это позволяет серверу exim принимать или отклонять определённые команды, основанные на состоянии шифрования. Внимание: Определённые типы файрволлов и антивирусных систем могут прерывать TLS-соединения. Вам необходимо выключить SMTP-сканирование для этих продуктов, чтобы TLS заработал.

38.1. Поддержка для наследственного ssmtp (или smtps) протокола

Ранние воплощения шифрованного SMTP использовали иной порт TCP вместо обычного и ожидали, что переговоры о шифровании начнутся немедленно вместо ожидания команды клиента STARTTLS, использующего стандартный SMTP-порт. Протокол назывался ssmtp или smtps, и для этой цели был выделен 465-й порт.

Этот подход был оставлен, когда было стандартизовано шифрованное SMTP, но всё ещё есть клиенты, использующие его по наследству. Exim поддерживает этих клиентов путём глобальной опции tls_on_connect_ports. Её значение должно быть списком номеров портов, обычное использование таково:
tls_on_connect_ports = 465

Номер порта, определяемый этой опцией, применяется ко всем SMTP-соединениям через демона и через inetd. Вам всё ещё необходимо задавать все порты, используемые демоном (путём установки daemon_smtp_ports или local_interfaces или опцией командной строки -oX), поскольку tls_on_connect_ports не добавляет дополнительного порта, скорее, она определяет иное поведение на порту, определённом в другом месте.

Также, есть опция командной строки -tls-on-connect. Она переопределяет tls_on_connect_ports: она вызывает наследование поведения для всех портов.

38.2. OpenSSL против GnuTLS

Первая поддержка TLS в exim была осуществлена с использованием OpenSSL. Поддержка GnuTLS последовала позднее, когда была выпущена первая версия GnuTLS. Для сборки exim с использованием GnuTLS необходимо установить:
USE_GNUTLS=yes
в Local/Makefile в дополнение к
SUPPORT_TLS=yes

Также Вы должны установить TLS_LIBS и TLS_INCLUDE соответственно так, чтобы были найдены включаемые файлы и библиотеки GnuTLS. Есть некоторые отличия при использовании GnuTLS вместо OpenSSL:

38.3. Вычисление параметра GnuTLS

GnuTLS использует параметры RSA и D-H, которые требуют для вычисления существенного времени. Неблагоразумно вычислять их заново для каждой сессии TLS. Поэтому exim сохраняет эти данные в файле в своем каталоге спула, называемом gnutls-params. Файл принадлежит пользователю exim и читаем лишь его владельцем. Каждый процесс exim, который запускает GnuTLS, читает параметры RSA и D-H из этого файла. Если файл не существует, первый процесс exim, которому он нужен, вычисляет данные и записывает их во временный файл, переименовываемый по завершении. Не имеет значения, если несколько процессов exim делают это одновременно (кроме траты некоторых ресурсов). Как только файл помещён на место, новые процессы exim немедленно начинают его использовать. Для максимальной безопасности, параметры, которые сохраняются в этом файле, периодически, должны быть повторно вычислены, частота зависит от уровня Вашей параноидальности. Упорядочивание этого принципиально просто: просто удалите файл, когда хотите вычислить новое значение. Однако, могут быть проблемы. Для вычисления новых параметров необходимы случайные числа, а они берутся из /dev/random. Если система не очень активна, /dev/random может задержать возврат данных, пока не будет доступно достаточно хаоса. Это может вызывать зависание exim на довольно существенное время, вызывая таймауты для входящих соединений. Решение: генерировать параметры вне exim. Они сохраняются в gnutls-params в формате PEM, что означает, что они могут быть сгенерированы внешне, используя команду certtool, которая является частью GnuTLS. Для замены параметров новыми, вместо удаления файла и разрешения exim пересоздать его, Вы можете генерировать новые параметры, используя certtool, а после завершения заменить файл кэша exim путём переименования. Уместные команды что-то типа этого:
# rm -f new-params
# touch new-params
# chown exim:exim new-params
# chmod 0400 new-params
# certtool --generate-privkey --bits 512 >new-params
# echo "" >>new-params
# certtool --generate-dh-params --bits 1024 >> new-params
# mv new-params gnutls-params
Если exim никогда не генерирует параметры самостоятельно, возможность остановки удалена.

38.4. Требование специфических шифров в OpenSSL

В библиотеке OpenSSL есть функция, которая может передавать список наборов шифров до того, как имеет место переговор о шифре. Этим определяется, какие шифры доступны. Список разделён двоеточиями и может содержать имена типа DES-CBC3-SHA. Exim передаёт раскрытое значение tls_require_ciphers напрямую этому вызову функции. Следующее цитирование документации OpenSSL определяет, какие формы элементов допустимы в строке шифра: