0,0
рейтинг
17 октября 2010 в 20:40

Администрирование → Установка 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 за ценное исправление.
Юрий Андамасов @syncer
карма
40,2
рейтинг 0,0
Engineer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (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.

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