Настройка служб на использование SNI

Разбираемся как настроить работу служб с несколькими доменами и их сертификатами.

Исходные данные

Имеется три домена:

  • mail.example.com
  • mail.example.org
  • mail.example.net

Для каждого домена необходим отдельный сертификат, который будет использоваться различными сервисами. Сервисы при помощи TLS/SSL-расширения SNI будут выбирать сертификат домена в зависимости от запроса клиента.

Angie

  • Установить и настроить Angie при помощи статьи Angie: Установка и настройка.
  • Создать файл /etc/angie/conf.d/90-http.ssl.map.conf со следующим содержанием:
angie.http.ssl.map.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
map $ssl_server_name $cert {
  default /etc/ssl/default.crt;
  mail.example.com /etc/ssl/mail.example.com.crt;
  mail.example.org /etc/ssl/mail.example.org.crt;
  mail.example.net /etc/ssl/mail.example.net.crt;
}

map $ssl_server_name $key {
  default /etc/ssl/default.key;
  mail.example.com /etc/ssl/mail.example.com.key;
  mail.example.org /etc/ssl/mail.example.org.key;
  mail.example.net /etc/ssl/mail.example.net.key;
}
  • В конфигурации сервера изменить параметры у директив ssl_certificate и ssl_certificate_key на $cert и $key соответственно:
1
2
3
4
5
6
server {
  # <...>
  ssl_certificate $cert;
  ssl_certificate_key $key;
  # <...>
}
  • Перезапустить службу:
1
systemctl restart angie.service

Postfix

  • Создать файл /etc/postfix/ssl.map со следующим содержанием:
postfix.ssl.map
1
2
3
mail.example.com /etc/ssl/mail.example.com.key /etc/ssl/mail.example.com.crt
mail.example.org /etc/ssl/mail.example.org.key /etc/ssl/mail.example.org.crt
mail.example.net /etc/ssl/mail.example.net.key /etc/ssl/mail.example.net.crt
  • Построить карту для файла ssl.map:
1
postmap -F 'hash:/etc/postfix/ssl.map'
  • В файле /etc/postfix/main.cf закомментировать параметры smtpd_tls_key_file и smtpd_tls_cert_file, добавить параметры smtpd_tls_chain_files и tls_server_sni_maps:
1
2
3
4
5
6
#smtpd_tls_key_file = /etc/ssl/default.key
#smtpd_tls_cert_file = /etc/ssl/default.crt
smtpd_tls_chain_files =
    /etc/ssl/default.key,
    /etc/ssl/default.crt
tls_server_sni_maps = hash:/etc/postfix/ssl.map
  • Перезапустить службу:
1
systemctl restart postfix.service

Dovecot

  • В файле /etc/dovecot/dovecot.conf указать сертификат и ключ по умолчанию в параметрах ssl_cert и ssl_key:
1
2
ssl_cert = </etc/ssl/default.crt
ssl_key = </etc/ssl/default.key
  • В файле /etc/dovecot/dovecot.conf в самый низ добавить:
1
!include *.map
  • Создать файл /etc/dovecot/ssl.map со следующим содержанием:
dovecot.ssl.map
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
local_name mail.example.com {
  ssl_cert = </etc/ssl/mail.example.com.crt
  ssl_key = </etc/ssl/mail.example.com.key
}

local_name mail.example.org {
  ssl_cert = </etc/ssl/mail.example.org.crt
  ssl_key = </etc/ssl/mail.example.org.key
}

local_name mail.example.net {
  ssl_cert = </etc/ssl/mail.example.net.crt
  ssl_key = </etc/ssl/mail.example.net.key
}
  • Перезапустить службу:
1
systemctl restart dovecot.service

Проверка

Для проверки корректного предоставления сертификата домена можно воспользоваться следующей командой (d - имя домена):

1
d='mail.example.com'; (sleep 1; echo . logout) | openssl s_client -connect "${d}:imap" -starttls imap -servername "${d}" 2>/dev/null | openssl x509 -noout -subject -dates

В выводе команде необходимо смотреть на параметр subject=CN, он должен содержать корректное имя домена.