Установка StartSSL сертификатов — Postfix/Dovecot/Nginx

    В предыдущем топике я рассказал о сервисе где можно бесплатно получить ssl-сертификаты. И как бы в продолжение решил описать как установить их на то или иное ПО.
    Я рассмотрю следующее ПО:
    • Postfix
    • Dovecot
    • Nginx



    Все выше перечисленное установлено на CentOS 5.5.

    Postfix

    С постфиксом я намучился больше всего. Казалось бы, есть документация, куча примеров и тд, должно быть все просто, но нет, перепробовав кучу вариантов попутно перечитывая документацию я убил не мало времени пока все стало работать.
    Подготовка
    Подразумевается что у вас уже есть приватный ключ и сертификат для домена.
    mail.example.com.key
    mail.example.com.crt

    Также вам необходимо скачать файл с сертификатом промежуточного CA необходимого класса.
    Их можно найти здесь
    Для бесплатных сертификатов это sub.class1.server.ca.pem
    В этом примере я использую приватный ключ без пассфразы.
    И так у нас есть 3 файла.
    mail.example.com.key
    mail.example.com.crt
    sub.class1.server.ca.pem

    Создадим файл который скушает постфикс
    cat mail.example.com.key mail.example.com.crt sub.class1.server.ca.pem > mail.example.com.pem
    копируем полученный файл куда надо, я свой положил в /etc/pki/postfix/
    Конечно же не забиваем выставить владельца и права, так как в файле наш ключ.

    в /etc/postfix/main.cf добавляем:
    smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
    smtpd_tls_cert_file = /etc/pki/postfix/mail.example.com.pem # путь к нашему файлу
    smtpd_tls_key_file = /etc/pki/postfix/mail.example.com.pem # путь к нашему файлу
    smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
    smtpd_use_tls = yes

    smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
    smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
    smtpd_tls_security_level = may

    smtpd_tls_received_header = yes
    smtpd_tls_loglevel = 1
    smtpd_tls_auth_only = no
    tls_random_source = dev:/dev/urandom

    Что значит каждый параметр и за что он отвечает можно узнать в документации для Postifx
    для проверки того что все окей можно использовать следующую комманду:
    openssl s_client -starttls smtp -showcerts -connect localhost:25
    В результате должно вернуться что то вроде:
    SSL handshake has read 4760 bytes and written 354 bytes
    ---
    New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
    Server public key is 4096 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    SSL-Session:
    Protocol : TLSv1
    Cipher : DHE-RSA-AES256-SHA
    Session-ID: 418AA0ED7BA85B2B9301FA127D05DCAFABCEDC192101A6E75DD872FA3E528366
    Session-ID-ctx:
    Master-Key: 498FB41D5810A9768710936351DC92169B6D7DEFAHTEDBDUO60DE9349DA7EB5536F975A8BC4AF190466B637CC129A93E
    Key-Arg : None
    Krb5 Principal: None
    Start Time: 1287331961
    Timeout : 300 (sec)
    Verify return code: 0 (ok)
    ---
    250 DSN

    в /etc/postfix/master.cf раскомментируем следующие строки:
    smtps inet n - n - - smtpd
    -o smtpd_tls_wrappermode=yes
    -o smtpd_sasl_auth_enable=yes


    На этом с постфиксом все.

    Dovecot

    С довекотом все оказалось намного проще и у меня все заработало с первого раза
    Подготовка
    У вас уже есть 3 файла
    mail.example.com.key
    mail.example.com.crt
    sub.class1.server.ca.pem

    Копируем ключ, создаем сертификат который скушает dovecot
    cp mail.example.com.key /etc/pki/dovecot/private/
    cat mail.example.com.crt sub.class1.server.ca.pem > /etc/pki/dovecot/certs/mail.example.com.pem

    В dovecot.conf надо прописать:
    ssl_cert_file = /etc/pki/dovecot/certs/mail.example.com.pem
    ssl_key_file = /etc/pki/dovecot/private/mail.example.com.key

    и конечно же включить SSL
    ssl_listen = *
    ssl = yes

    И добавить в список протоколов необходимые лично вам.
    protocols = pop3 pop3s imap imaps
    UPD: если надо обеспечить IMAP и POP на разных субдоменах например imap.example.com и pop.example.com, то нужно для каждого субдомена подготовить сертификаты как указано выше
    и внести следующие изменения в dovecot.conf
    protocol imap {
    listen = 192.0.2.1:143
    ssl_listen = 192.0.2.1:993
    ssl_cert_file = /etc/pki/dovecot/certs/imap.example.com.pem
    ssl_key_file = /etc/pki/dovecot/private/imap.example.com.key
    }
    protocol pop3 {
    listen = 192.0.2.1:110
    ssl_listen = 192.0.2.1:995
    ssl_cert_file = /etc/pki/dovecot/certs/pop.example.com.pem
    ssl_key_file = /etc/pki/dovecot/private/pop.example.com.key
    }


    Спасибо Andrey_Zentavr за данное дополнение к статье.

    Nginx

    С ним тоже все очень просто и в целом процедура не отличается от dovecot'овской
    Погдотовка
    У вас уже есть 3 файла
    mail.example.com.key
    mail.example.com.crt
    sub.class1.server.ca.pem

    Копируем ключ, создаем сертификат который скушает nginx
    cp mail.example.com.key /etc/pki/nginx/private/
    cat mail.example.com.crt sub.class1.server.ca.pem > /etc/pki/nginx/certs/mail.example.com.pem

    в конфигурации для хоста nginx должно быть что типа такого:
    server {
    listen 443;
    server_name mail.example.com;
    ssl on;
    ssl_certificate /etc/pki/nginx/certs/mail.example.com.pem;
    ssl_certificate_key /etc/pki/nginx/private/mail.example.com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;

    location / {
    root /srv/www/htdocs/;
    index index.html index.htm;
    }
    }



    На этом все, надеюсь кому-то этот топик окажется полезным.

    UPD2: Спасибо rojer за ценное исправление.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 45
    • +3
      Большое спасибо. Хорошо все описано!
      • 0
        Спасибо.
        • –1
          простите за снобизм, но прямо как на opennet.ru.
          • +1
            А чего не хватает? Просто пытался быть кратким, и писал только по существу.
            • 0
              Интересно то, что не лежит на поверхности, уникальное.
              • 0
                Ну оно вообще-то и не лежит на поверхности, это относительно постфикс.
                А остальное до кучи, что б сэкономить время людям.
            • 0
              Спасибо!
              • 0
                Мне кажется что SSLv2 отсюда:
                ssl_protocols SSLv2 SSLv3 TLSv1;

                Можно бы убрать. не совсем безопасный протокол…
                • 0
                  конфиг по сути копипаста с дефолтного конфига nginx. Носит только характер наглядного примера, не более.
                  Но спасибо за комментарий, думаю многим он пригодиться!
                  • +1
                    У меня для IMAP как правило создан домен imap.*****.com, а для POP — pop.***.com.
                    Не знаю, умеет ли сервис подписывать *.****.com — вроде бы как не умеет, потому для Dovecot я цепляю отдельный сертификат для POP и отдельный для IMAP:

                    protocol imap {
                    listen = 76.74.251.xx:143
                    ssl_listen = 76.74.251.xx:993
                    ssl_cert_file = /etc/dovecot/keys/imap.***.net.crt
                    ssl_key_file = /etc/dovecot/keys/imap.***.net.key
                    }
                    protocol pop3 {
                    listen = 76.74.251.xx:110
                    ssl_listen = 76.74.251.xx:995
                    ssl_cert_file = /etc/dovecot/keys/pop.***.net.crt
                    ssl_key_file = /etc/dovecot/keys/pop.***.net.key
                    }
                    protocol managesieve {
                    listen = 127.0.0.1:2000
                    }

                    Ну и конечно же:
                    • 0
                      с вашего позволения добавлю в основную статью.
                      • 0
                        не возражаю.
                        P.S.: две строчки ниже не вставились в основной пост.
                    • 0
                      # SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
                      ssl = yes
                  • 0
                    До кучи хорошо бы и для Qmail описать, наверняка многим будет полезно
                    • +2
                      Использовал то что было под рукой, и чем пользуюсь постоянно.
                      Если найдется время то напишу и о Qmail и Cyrus.
                      Спасибо!
                      • 0
                        qmail давно закопать пора
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +1
                          глупо было бы с вами не согласиться, пожалуй уберу из статьи.
                          Спасибо!
                          Я потратил на постфикс много времени, и это конф который у меня получился поздно ночью.
                          Еще раз спасибо!
                        • 0
                          Кстати, а зачем ключи для Постфикса и Dovecot объединять с сертификатом CA? Прошу прощения, что туплю (спецом по сертификации не являюсь), но у меня и раньше, и сейчас все и без этого работало/работает. Может я чего-то теряю из-за того не объединяю файлы?
                          • 0
                            для Dovecot ключ с сертификатом CA не объединяется, сертификат и сертификат CA объединяются так как нет отдельного параметра для указания цепочки сертификата(certificate chain), по этому сертификат не будет восприниматься как валидный. Тоже самое верно и для Postfix, файл ключа соединен с сертификатом и сертификатом CA для удобства и такой файл поддерживается Postfix.
                            smtpd_tls_key_file (default: $smtpd_tls_cert_file)
                            File with the Postfix SMTP server RSA private key in PEM format. This file may be combined with the Postfix SMTP server RSA certificate file specified with $smtpd_tls_cert_file.
                            • 0
                              1) Кем не будет восприниматься как валидный? У меня все нормально — клиенты подключаются (Оперный почтовик, встроенный Симбиановский) и никто ни на что не ругается…
                              2) Ага, и тоже самое в инструкции относительно smtpd_tls_cert_file написано («This file may also contain the Postfix SMTP server private RSA key.»). ;-) ИМХО, стоит тогда либо оставлять в конфиге один из этих двух параметров и объединять файлы, либо (что корректнее и прозрачнее, на мой взгляд) уж писать оба, но и скармливать каждому только нужные файлы и не заморачиваться с объединением…
                              • 0
                                1) Сертификат у вас от кого? Тут описывается процедура установки сертификатов от StartSSL, и поверьте мне я не от балды написал, а все проверенно на практике.
                                2)По моему Вы не поняли сути объединения, попробуйте объединить эти два файла и убрать из конфига
                                либо smtpd_tls_cert_file либо smtpd_tls_key_file, и посмотрите на результат
                                • +1
                                  Смотрите. Если ваш сертификат подписан одним из root CA, тогда все в порядке, клиент ругаться не будет, так как в сертификате указан издатель и клиент может проверить валидность сертификата. Но если сертификат был выпущен intermediate CA, сертификат которого в свою очередь был подписан root CA, то клиент не может проверить валидность сертификата, так как intermediate CA сертификат не доступен клиенту, клиент не может построить certificate chain(certificate path) и в таком случае клиент объявит сертификат не валидным. Если же вместе с сертификатом сервера поставлять сертификат intermediate CA(объединение сертификата и сертификата intermediate CA), то клиент сможет воссоздать цепочку и таким образом проверить сертификат(сертификат сервера выпущен intermediate CA => сертификат intermediate CA выпущен => root CA ) и распознать его как валидный
                                  • 0
                                    По поводу «стоит тогда либо оставлять в конфиге один из этих двух параметров и объединять файлы, либо (что корректнее и прозрачнее, на мой взгляд) уж писать оба, но и скармливать каждому только нужные файлы и не заморачиваться с объединением…» тут как посмотреть, не то что б я с Вами не согласен, но думаю это зависит от некоторых факторов.
                                    Безусловно лучше держать ключ и сертификат по отдельности, если ключ используется не одним сертификатом а несколькими, с другой стороны, если ключ используется только для одного сертификата, то почему б их не объединить?(x.509 сертификат(PKCS#12) к примеру).
                                    К тому же если б это было глупо не думаю что Postfix поддерживал бы такое.
                                    • 0
                                      1) От них у меня сертификаты, от них… Идею насчет intermediate CA понял — буду проверять. Сейчас вижу, что у меня в Опере этот intermediate уже был, поэтому она и не ругалась. А вот в ФФ — нет, так что так действительно надо добавлять, раз уж в разном софте по разному…
                                      2) Попробую, спасибо за совет. :-) Апеллировать к тому, что раз Постфикс это поддерживает — значит так и надо — не всегда корректно. Он, например, все проверки входящей почты позволяет в smtpd_recipient_restrictions засунуть, но это же не значит, что так и надо делать (хотя даже тут на Хабре я видел статьи, где люди именно так и делают)…

                                      В целом — спасибо за информацию! Респект!
                                      • 0
                                        Я не апеллирую, просто говорю что оба варианта допустимы, и ни один из них не является ни лучшим ни худшим, другими словами это дело вкуса и внутренних правил компании или вашых правил.
                              • 0
                                Попытался проделать это с nginx. Сделал всё, как написано. Говорят вот что:

                                Performing sanity check on nginx configuration:
                                [emerg]: SSL_CTX_use_certificate_chain_file("/usr/local/etc/nginx/crt/ssl.pem") failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib)
                                


                                Что я делаю не так, подкажите плиз.
                                • 0
                                  не хватает вроде пустой строки в коцне файла с сертификатами
                                  • 0
                                    Я тоже сначала так подумал. Нет, не оно.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • 0
                                        Точно! Вы правы. Всунул в него перевод строки и всё заработало. Спасибо!
                                • 0
                                  Установил сертификат для Dovecot, но The Bat! упорно не хочет получать почту по TLS. В логе пишет:
                                  Owner: xxxxxx-xxxxxxxxxxxxxxxx, RU, Persona Not Validated, StartCom Free Certificate Member, www.site.ru, postmaster@site.ru.
                                  FETCH — Issuer: IL, StartCom Ltd., Secure Digital Certificate Signing, StartCom Class 1 Primary Intermediate Server CA.
                                  FETCH — Issuer: IL, StartCom Ltd., Secure Digital Certificate Signing, StartCom Certification Authority.
                                  FETCH — TLS handshake failure. Invalid server certificate (The issuer of this certificate chain was not found).

                                  При этом даже не предлагает посмотреть сертификат и, например, добавить его в доверенные


                                  В логах Dovecot:
                                  TLS handshaking: SSL_accept() failed: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca

                                  Подскажите, пожалуйста, что нужно исправить?
                                  • +1
                                    а у зебата вроде бы по дефолту используеться своя база ЦА, тоже намудохался с ним. там где-то в настройках есть переключиться с внутреннего механизма на виндовый. точно не скажу где, но это у меня сработало
                                  • 0
                                    ребята извините на глупый вопрос. как создать *.key файл?
                                    И я вроде создал на сайте *.crt но на сайте меня не спрашивали имя сайта.!? Это так и должно быть? Мне что просто переименовать файл в имя своего сайта?
                                    Сапасибо!
                                    • 0
                                      И я вроде создал на сайте *.crt но на сайте меня не спрашивали имя сайта.!? Это так и должно быть?
                                      Нет, кончено.
                                      Смотрите внимательно на первую строчку (Postfix->Подготовка) в этом топике: «Подразумевается что у вас уже есть приватный ключ и сертификат для домена.»
                                      Поэтому отправляйтесь к изучению вопроса получения ключа и сертификата (лучше всего описал xaker1 в этом топике), а потом возвращайтесь сюда к установке :)

                                      Если возникнут вопросы — пишите.
                                      • 0
                                        Спасибо за статью, все прочитал. Я подтвердил домен.com, выбрал Certificates Wizard, но теперь не знаю какой тип мне надо выбирать для почтового сервера? cl.ly/CJFq
                                        И еще, я так понимаю что сертификат дается на домен.com и на mail.домен.com он не действует. Или не так?
                                        • 0
                                          с поддоменом разобрался. Извините не внимательный, один поддомен бесплатно. Очень спишу.
                                          Еще один вопрос. Вот тот текст который они выдают

                                          -----BEGIN RSA PRIVATE KEY-----
                                          много букв
                                          -----END RSA PRIVATE KEY-----

                                          вставить в файл mail.example.com.key

                                          -----BEGIN CERTIFICATE-----
                                          много букв
                                          -----END CERTIFICATE-----

                                          вставить в файл mail.example.com.crt
                                          • 0
                                            Именно.
                                            Извините не внимательный, один поддомен бесплатно. Очень спишу.
                                            Спешка совсем здесь ни к чему. Уж, поверьте :)

                                            • 0
                                              согласен.
                                              Вроде все сделал. на запрос openssl s_client -starttls smtp -showcerts -connect localhost:25
                                              получаю ответ:
                                              8062:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:601:
                                              Что это значит?
                                              PS
                                              нет поддержки SSL2? Если да то как ее включить?
                                              • 0
                                                В /etc/postfix/main.cf все пути верно прописаны? Проверьте еще раз внимательно.
                                                • 0
                                                  да путь проверил. Все файлы поместил в /etc/ssl/certs, они там и находятся.
                                                  и путь прописан:

                                                  smtpd_tls_CAfile = /etc/ssl/certs/ca-bundle.crt
                                                  smtpd_tls_cert_file = /etc/ssl/certs/mail.zet.com.ua.pem
                                                  smtpd_tls_key_file = /etc/ssl/certs/mail.zet.com.ua.pem

                                                  Одно смущает, что для других файлов в папке /etc/ssl/certs/ есть жешкие ссылки. Даже для тех старых сертификатов, что я создавал сам когда ставил сервер… ?!
                                                  • 0
                                                    1. Проверить права и владельца
                                                    2. Включить smtpd_tls_loglevel=3
                                                    3. Погуглить в конце концов;)

                                                    И, кстати, не знаю зачем автор топика объединял сертификат и ключ.
                                                    Лично у меня в Postfix настроено по принципу «мухи отдельно, котлеты отдельно»:
                                                    smtpd_tls_cert_file = /etc/postfix/ssl/domain.tld.crt
                                                    smtpd_tls_key_file = /etc/postfix/ssl/domain.tld.key
                                                    smtpd_tls_CAfile = /etc/postfix/ssl/sub.class1.server.ca.pem
                                                    • 0
                                                      попробовал разнести «мухи с котлетами» толку нет. Ошибка 21072:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:601:
                                                      PS
                                                      Ребята а что делать если забыл пароль к key файлу? его можно создать заново и не пересоздавать сам сертификат? Или все?
                                      • 0
                                        Доброго дня.

                                        Огромное вам спасибо за данный материал!
                                        У меня возникло пару вопросов?
                                        1) как правильно создать *key файл. Я попробовал так: openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
                                        chmod 600 smtpd.key
                                        2) Как Вы и писали, я создал на сайте www.startssl.com free сертификат, но при его создании меня не спрашивали о сайте. Это так и должно быть? И имя файла сертификата получилось такеим ocF70EtSTqhZ1oom.crt.
                                        3) Вы пишете: «Также вам необходимо скачать файл с сертификатом промежуточного CA необходимого класса.
                                        Их можно найти здесь
                                        Для бесплатных сертификатов это sub.class1.server.ca.pem»
                                        Я так понимаю в моем случаи адо закачать «sub.class1.server.ca.pem»?
                                        4) В конфиге для postfix повторяются параметры, это так должно быть?

                                        #
                                        smtpd_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
                                        #
                                        smtpd_tls_cert_file = /etc/pki/postfix/mail.example.com.pem # путь к нашему файлу
                                        smtpd_tls_key_file = /etc/pki/postfix/mail.example.com.pem # путь к нашему файлу
                                        #
                                        smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
                                        #
                                        smtpd_use_tls = yes
                                        #
                                        smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
                                        #
                                        #
                                        smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
                                        #
                                        smtpd_tls_security_level = may
                                        smtpd_tls_received_header = yes
                                        smtpd_tls_loglevel = 1
                                        smtpd_tls_auth_only = no
                                        tls_random_source = dev:/dev/urandom

                                        Заранее спасибо за помощь.
                                        • 0
                                          Где повторяются? В одних случаях smtpD, в других — просто smtp.

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