В повседневной практике использования почтового сервера iRedMail возникает необходимость замены SSL сертификатов (как при первичной установке, так и ежегодная смена). В топике описан процесс смены SSL сертификатов для iRedMail от StartSSL и предложен скрипт, позволяющий автоматизировать все необходимые действия.

Если вы заинтересовались, то добро пожаловать под кат.

Немного об iRedMail

На Хабре уже было несколько постов, описывающих данных почтовый сервер: тут и тут.

Если говорить кратко, то это бесплатный open-source почтовый сервер с веб-интерфейсом на базе связки Postfix+Dovecot+SpamAssassin+ClamAV+Roundcube. iRedMail прост в установке и работает «из коробки».

Немного о StartSSL

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

Но более важным для меня стало то, что ещё год назад StartSSL не позволял подтвреждать домен 3-го уровня без владения доменом 2-го уровня, однако теперь эта возможность появилась. Т.е. ранее система не давала возможность отправить письмо с кодом подтверждения на электронную почту вида postmaster@subdomain.domain.com, любой домен 3-го уровня требовал подтверждения от postmaster@domain.com.

А теперь перейдем к сути.

Установка SSL сертификата от StartSSL

Для примера в качестве имени домена будем использовать example.com. Исходные данные:

  1. example.com.key (Запароленный RSA-ключ)
  2. example.com.txt (Файл, содержащий пароль к RSA-ключу)
  3. example.com.zip (Архив с сертификатами, скачанный со StartSSL)

Кладём эти файлы в один каталог и выполняем распаковку сертификатов.

chmod 755 ./example.com.zip
unzip -o ./example.com -d ./example.com
chmod -R 777 ./example.com
unzip -o ./example.com/ApacheServer -d ./example.com/ApacheServer
chmod -R 755 ./example.com/ApacheServer/*

Сконвертируем сертификаты издателя и домена из архива в PEM формат и склеим их вместе.

openssl x509 -in ./example.com/ApacheServer/1_root_bundle.crt -outform PEM -out ./example.com/ApacheServer/1_root_bundle.pem -text
openssl x509 -in ./example.com/ApacheServer/2_example.com.crt -outform PEM -out ./example.com/ApacheServer/2_example.com.pem -text
cat ./example.com/ApacheServer/2_example.com.pem ./example.com/ApacheServer/1_root_bundle.pem > ./iRedMail_CA.pem
chmod 755 ./iRedMail_CA.pem

Копируем полученные сертификаты в каталог etc/ssl/certs/ под стандартными именами для iRedMail. После копирования сменим владельца ключа для Postgresql.

\cp ./iRedMail_CA.pem /etc/ssl/certs/iRedMail_CA.pem
chmod 644 /etc/ssl/certs/iRedMail_CA.pem
\cp ./iRedMail_CA.pem /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem
chmod 600 /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem
chown postgres:postgres /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem

Избавляемся от пароля в RSA-ключе.

openssl rsa -in ./example.com.key -outform PEM -out ./example.com.key.unprotected -passin pass:$(cat ./example.com.txt)

Копируем полученный RSA ключ в каталог /etc/ssl/private под стандартными именами для iRedMail. После копирования сменим владельца для ключа Postgresql.

\cp ./example.com.key.unprotected /etc/ssl/private/iRedMail.key
chmod 644 /etc/ssl/private/iRedMail.key
\cp ./example.com.key.unprotected /etc/ssl/private/iRedMail_PostgreSQL.key
chmod 600 /etc/ssl/private/iRedMail_PostgreSQL.key
chown postgres:postgres /etc/ssl/private/iRedMail_PostgreSQL.key

Перезапускаем сервисы:

service postgresql restart
service postfix restart
service dovecot restart
service apache2 restart

Проверяем работоспособность сервера.

Для автоматизации всего вышеописанного объединим всё в единый скрипт. В качестве переменной используем $domain.

#!/bin/bash
domain=example.com

chmod 755 ./$domain.zip
unzip -o ./${domain} -d ./${domain}
chmod -R 777 ./${domain}
unzip -o ./${domain}/ApacheServer -d ./${domain}/ApacheServer
chmod -R 755 ./${domain}/ApacheServer/*
openssl x509 -in ./${domain}/ApacheServer/1_root_bundle.crt -outform PEM -out ./${domain}/ApacheServer/1_root_bundle.pem -text
openssl x509 -in ./${domain}/ApacheServer/2_${domain}.crt -outform PEM -out ./${domain}/ApacheServer/2_${domain}.pem -text
cat ./${domain}/ApacheServer/2_${domain}.pem ./${domain}/ApacheServer/1_root_bundle.pem > /tmp/ssl/iRedMail_CA.pem
chmod 755 /tmp/ssl/iRedMail_CA.pem
\cp /tmp/ssl/iRedMail_CA.pem /etc/ssl/certs/iRedMail_CA.pem
chmod 644 /etc/ssl/certs/iRedMail_CA.pem
\cp /tmp/ssl/iRedMail_CA.pem /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem
chmod 600 /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem
chown postgres:postgres /etc/ssl/certs/iRedMail_CA_PostgreSQL.pem

openssl rsa -in ./${domain}.key -outform PEM -out ./${domain}.key.unprotected -passin pass:$(cat ./${domain}.txt)
\cp ./${domain}.key.unprotected /etc/ssl/private/iRedMail.key
chmod 644 /etc/ssl/private/iRedMail.key
\cp ./${domain}.key.unprotected /etc/ssl/private/iRedMail_PostgreSQL.key
chmod 600 /etc/ssl/private/iRedMail_PostgreSQL.key
chown postgres:postgres /etc/ssl/private/iRedMail_PostgreSQL.key

service postgresql restart
service postfix restart
service dovecot restart
service apache2 restart

Буду рад, если данный скрипт окажется кому-нибудь полезным. Спасибо за прочтение.

Комментарии (9)


  1. nikolayvaganov
    01.02.2016 13:35

    Долгое время сидел на startssl, есть один недостаток, когда профукал время продления сертификата, то очень долго ( может у меня так ) идет новый сертификат ( мне кажется, там полуавтоматический выпуск ). Сейчас c сертификатами от let's encrypt проблем нет. Большой плюс let's encrypt — моментальный выпуск, сразу вместе с сертификатом идет цепочка и не нужно лишних телодвижений, особенно для nginx.


    1. DuH_Khv
      01.02.2016 14:21
      +1

      Касательно полуавтоматической обработки при перевыпуске сертификата StartSSL ничего не могу сказать, однако один из новых сертификатов у меня тоже выпустился с небольшой задержкой. По поводу лишних телодвижений с nginx — StartSSL сейчас предоставляет сертификаты ZIP-архиве, содержащим набор сертификатов в разных форматах для разных сервисов. В том числе и для nginx. Проверил сейчас и действительно в сертификате сразу вся цепочка содержится. Был бы внимательнее — использовал данный факт при написании скрипта и не склеивал бы сертификаты сам. А по поводу let's crypt — читал много статей. Сервис только недавно вышел на публику. Статьи были в основном хвалебные, но некоторые люди отмечали, как недостаток, недолгий срок действия сертификатов. Даже учитывая тот факт, что можно настроить автоматическое продление, лично меня это немного пугает.


      1. nikolayvaganov
        01.02.2016 14:37

        let's encrypt — действительно сейчас в активной бете, но именно поддержка IT сообщества ( и чем больше, тем лучше ) покажет заинтересованность в сервисе. Ни в коем случае не говорю, что startssl лучше/хуже, но на данный момент let's encrypt — приятная альтернатива. Из пунктов могу отметить:
        1. Моментальный выпуск сертификата
        2. Даже при текущем выпуске на три месяца уже есть готовые решения для автоматического перевыпуска ( ответили ниже )
        3. При сворачивании проекта всегда можно будет вернуться на аналоги, в том числе на startssl.

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


        1. DuH_Khv
          01.02.2016 15:09

          Искренне хотелось бы узнать, чем обоснованы ваши опасения, ибо использую эти сертификаты в нескольких не очень крупных организациях.


          1. istui
            01.02.2016 15:51

            у меня не захотели выпускать серт на интернет-магазин. Пришлось идти к WoSign. Let's Encrypt для данного случая не подходит, т.к. требует работы агента на сервере (а сайт магазина находится на хостинге).

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

            StartSSL порадовал обновленным интерфейсом, быстрой выдачей и поддержкой поддоменов. Теперь не надо тратиться на IV для серта с N поддоменами (можно выпустить вместо этого N-1 сертификат). IV сейчас необходима разве что для code signing…


            1. IncorrecTSW
              01.02.2016 21:17

              Я может ошибаюсь, но ничего не требует. Делаем в ручном режиме, указываем домен (список доменов), кидаем туда файлик проверочный и получаем свой сертификат. Уже использую на нескольких проектах, подводных камней не обнаружено.


  1. voidMan
    01.02.2016 13:41
    +2

    Также для let's encrypt есть руководства и собранные скрипты для автообновления сертификата и прочие плюшки. Например тут https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04

    P.S. В ответ на nikolayvaganov


  1. kvaps
    02.02.2016 01:12
    +1

    Тоже постепенно перевожу все свои проекты на Let's Encrypt. Для себя создал удобный docker-образ на основе официального.
    Если кому пригодится, буду только рад.
    hub.docker.com/r/kvaps/letsencrypt-webroot

    Например в моем образе Kolab (тоже почтовый сервер) полностью автоматизированно. Благодаря Let's Encrypt теперь об этом не надо даже думать ^^


    1. DuH_Khv
      02.02.2016 05:12

      На вид выглядит очень круто! Обязательно опробую!