Настройка SSL в Exim и Dovecot

В дополнение к статье по настройке почтового сервера решил написать как настроить на этой же связке SSL соединение.

Создаем директорию для хранения наших сертификатов

deathstar# mdkir -p /usr/local/etc/ssl/certs

Генерируем сертификат утилитой OpenSSL ( ставим из портов если не установлена )

deathstar# cd /usr/local/etc/ssl/certs && openssl req -new -x509 -days 3650 -nodes -out mail.pem -keyout mail.key

И заполняем данные о сертификате ( пишем что угодно, но Common Name должно иметь значение вашего домена, в моем случае это адреса smtp и imap — mail.deathstar.name )

Далее пересобираем exim с поддержкой SSL если это не было сделано раньше и редактируем конфиг Exim

deathstar# ee /usr/local/etc/exim/configure

Описываем порты, на которыхбудет висеть Exim после строки MY_IP ( 25 и 465 для SSL )

daemon_smtp_ports = 25:465

Ниже описываем порт, на котором будет SSL

# TLS
tls_on_connect_ports = 465
tls_advertise_hosts = *
tls_certificate = /usr/local/etc/ssl/certss/mail.pem
tls_privatekey = /usr/local/etc/ssl/certs/mail.key
#auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

Здесь прописываются пути к сертификату, к ключу, и порт на котором будет SSL.
Для того чтобы запретить не SSL соединения расскоментируйте строку
auth_advertise_hosts
Сохраняем и перезапускаем Exim и пробуем почту на порту 465 с включенным SSL =)

Добавляем SSL в Dovecot

Перечисляем протоколы, которые будет обслуживать Dovecot:

protocols = imap pop3 imaps pop3s
….
Описываем сами протоколы, порты, на которых они будут висеть и пути к SSL сертификату и ключу
protocol imap {
listen=*:143
ssl_listen=*:993
ssl_cert_file=/usr/local/etc/ssl/certs/mail.pem
ssl_key_file=/usr/local/etc/ssl/certs/mail.key
}

protocol pop3 {
listen=*:110
ssl_listen=*:995
ssl_cert_file=/usr/local/etc/ssl/certs/mail.pem
ssl_key_file=/usr/local/etc/ssl/certs/mail.key
}

Включаем SSL, сменив

# SSL/TLS support: yes, no, required.
ssl = no

На

# SSL/TLS support: yes, no, required.
ssl = yes

и также ниже прописываем пути к сертификату и ключу:

ssl_cert_file=/usr/local/etc/ssl/certs/mail.pem
ssl_key_file=/usr/local/etc/ssl/certs/mail.key

Сохраняем, перезапускаем Dovecot и наслаждаемся =)))

Настраиваем SSL в Roundcube ( иначе письма не будут не отправляться, не смотреться, потому что вряд ли попадете туда)

Редактируем конфиг Roundcube:

deathstar# ee /usr/local/www/roundcube/config/main.inc.php

Меняем адреса и порты у SMTP и IMAP подключений:

Вместо

$rcmail_config['default_host'] = 'localhost';
// TCP port used for IMAP connections
$rcmail_config['default_port'] = 143;

рисуем

$rcmail_config['default_host'] = 'ssl://localhost';
// TCP port used for IMAP connections
$rcmail_config['default_port'] = 993;

и вместо

$rcmail_config['smtp_server'] = 'localhost';
// SMTP port (default is 25; 465 for SSL)
$rcmail_config['smtp_port'] = 25;

рисуем

$rcmail_config['smtp_server'] = 'ssl://localhost';
// SMTP port (default is 25; 465 for SSL)
$rcmail_config['smtp_port'] = 465;

Также можно сделать,чтоб Roundcube работал не по HTTP, а по HTTPS.
Для этого ищем строку

$rcmail_config['force_https'] = false;
и меняем ее на

$rcmail_config['force_https'] = true;

В описание виртуального хоста в nginx для Roundcube делаем следующие изменения ( Nginx должен быть собран с поддержкой SSL )

Прописываем порты 80 и 443 в описании виртхоста,и прописываем методы шифрования и пути к сертификату и ключу

# HTTP and HTTPS
listen 443;
listen 80;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_certificate /usr/local/etc/ssl/certs/mail.pem;
ssl_certificate_key /usr/local/etc/ssl/certs/mail.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

И добавляем rewrite правило для принудительного редиректа с HTTP на HTTPS

if ( $scheme = "http" )
{
rewrite ^/(.*)$ https://$host/$1 permanent;
}

Описание виртуального хоста теперь выглядит вот так

server
{

# HTTP and HTTPS
listen 443;
listen 80;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_certificate /usr/local/etc/ssl/certs/mail.pem;
ssl_certificate_key /usr/local/etc/ssl/certs/mail.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server_name mail.deathstar.name;
access_log /var/log/nginx/mail-access.log;
error_log /var/log/nginx/mail-error.log;
root /usr/local/www/roundcube;
index index.php;
charset utf-8;

if ( $scheme = "http" )
{
rewrite ^/(.*)$ https://$host/$1 permanent;
}

location ~ \.php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /\.ht
{
deny all;
}
}

а виртуальный хост для Vexim выглядит вот так:

server
{
# HTTP and HTTPS
listen 443;
listen 80;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /usr/local/etc/ssl/certs/exim.deathstar.name.pem;
ssl_certificate_key /usr/local/etc/ssl/certs/exim.deathstar.name.key;
server_name exim.deathstar.name;
access_log /var/log/nginx/exim-access.log;
error_log /var/log/nginx/exim-error.log;
root /usr/local/www/vexim;
index index.php;
charset utf-8;

if ( $scheme = "http" )
{
rewrite ^/(.*)$ https://$host/$1 permanent;
}

location ~ \.php$
{
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}

location ~ /\.ht
{
deny all;
}
}

Перезапускаем nginx и радуемся.
На этом все.

4 комментария

  1. ssl v3 уязвим. надо бы исправить конфиг nginx, а то копипастеры могут пострадать
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  2. ну раз эта страница в топе поисковой выдачи, надо поддерживать её актуальность 🙂
    тем более, что даты публикации нет и сложно определить какой свежести эта осетрина.
    спасибо за блог.

    1. В топ выводил когда немного SEO увлекался, сейчас уже и Dovecot 2 у меня стоит. Перепишу возможно в скором времени большинство статьей, как найду тестовую площадку. На своем сервере уже эксперименты проводить не буду.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.