Let’s Encrypt возможно лучшая вещь, произошедшая в Интернет за последние лет десять. Это сервис, предоставляющий абсолютно бесплатно криптографические сертификаты X.509 для TLS шифрования (HTTPS). Главный минус, что сертификат выдается на 90 дней, но мы попробуем автоматизировать процедуру замены сертификата.

Отключаем http
Остановите в Kerio Connect если он запущен и установите режим запуска вручную, чтобы он не активировал себя снова при перезапуске. Измените служебный порт HTTPS на 8843 в панели администратора. Установка не будет работать иначе, потому что Certbot нуждается в портах 80 и 443 для проверки домена и получения сертификата.

Установим Nginx
Так как мы не хотим что-либо делать вручную, а также иметь возможность использовать стандартные веб-порты, нам необходимо установить реверс-прокси перед Kerio Connect

mkdir -p /var/www/mail
chown www-data:www-data /var/www/mail
apt-get install nginx ssl-cert

Создадим файл /etc/nginx/sites-available/kerio-connect.conf со следующим содержанием

server {
listen 80;
server_name nash_site; # заменить на адрес своего сайта
server_name_in_redirect off;
rewrite ^ https://$server_name$request_uri? permanent;
}

server {
listen 443 ssl;
server_name nash_site; # заменить на адрес своего сайта

ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; 
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

location /.well-known {
alias /var/www/mail/.well-known;
}

location / {
proxy_pass https://localhost:8443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Remote-Port $remote_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
chunked_transfer_encoding on;
proxy_connect_timeout 6000;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
send_timeout 6000;
}
}

Слинкуем сайт с nginx:

ln -s /etc/nginx/sites-available/kerio-connect.conf /etc/nginx/sites-enabled/kerio-connect.conf

Проверим конфигурацию:

nginx -t

Если ошибок нет, перегружаем nginx:

systemctl restart nginx.service

Установка Certbot

Теперь установим программу, которая будет за нас обновлять сертификаты

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Запустим

./certbot-auto

Создадим сертификат.

./certbot-auto certonly --webroot -w /var/www/mail -d nash_site

Если вы запускаете в первый раз, вам нужно будет ввести свой адрес электронной почты для экстренной ситуации, например, для отзыва сертификата. Это нужно сделать только один раз и после этого SSL-сертификат будет создан.

Начинаем использовать

Изменим в файле /etc/nginx/sites-available/kerio-connect.conf строки

ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

на:

ssl_certificate /etc/letsencrypt/live/nash_site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nash_site/privkey.pem;

Перезагрузим Nginx

systemctl restart nginx.service

Чтобы упростить обновление Kerio Connect, просто свяжите созданный сертификат и ключ с соответствующей папкой внутри иерархии Kerio Connect

ln -s /etc/letsencrypt/live/nash_site/fullchain.pem /opt/kerio/mailserver/sslcert/mail.crt
ln -s /etc/letsencrypt/live/nash_site/privkey.pem /opt/kerio/mailserver/sslcert/mail.key

Теперь заходим в панель управления Kerio Connect, выбираем Configuration > SSL Certificates и смотрите что там за сертификаты. Выбирайте установленный от Let’s Encrypt и делайте его активным.
Все, теперь при заходе на Ваш сайт nginx будет автоматически перебрасывать соединение на https, а браузер не будет ругаться на неправильный сертификат.

Обновление.

Осталось автоматизировать процесс перевыпуска сертификатов.
Просто запустим:

./certbot-auto renew

Если сертификат близок к истечению срока действия, он будет автоматически обновлен, в противном случае он будет храниться до следующего запуска.

Сперва скопируем Certbot в удобное место. Например, в /usr/local/bin

cp certbot-auto /usr/local/bin/

Чтобы получить новый сертификат, необходимо перезапустить службы после успешного продления. Создайте скрипт /root/certbot-post-hook.sh со следующим содержимым:

#!/bin/sh
systemctl restart nginx.service
systemctl restart kerio-connect.service

Сделаем его исполняемым и проставим права:

chmod 500 /root/certbot-post-hook.sh
chown root:root /root/certbot-post-hook.sh

Мы будем проверять необходимость перевыпуска сертификата каждую ночь, в 3 часа утра.
Создадим файл /etc/cron.d/certbot:

shell=/bin/sh
path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 3 * * * root perl -e 'sleep int(rand(3600))' && certbot-auto -q renew --post-hook "/root/certbot-post-hook.sh"
Использование Let’s Encrypt с Kerio Connect
Метки:            

Использование Let’s Encrypt с Kerio Connect: 5 комментариев

  • 28.07.2017 в 09:49
    Постоянная ссылка

    Привет, Виктор, делал по тому же мануалу, что и ты.
    У меня всё вышло, но открывается только админка керио.
    При попытке открыть просто корень сайта, при попытке зайти в клиентскую часть веб морды керио получаю 502.
    конфиги:
    nginx.conf:

    # For more information on configuration, see:
    # * Official English Documentation: http://nginx.org/en/docs/
    # * Official Russian Documentation: http://nginx.org/ru/docs/

    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;

    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;

    events {
    worker_connections 1024;
    }

    http {
    log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” “$http_x_forwarded_for”‘;

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    server_names_hash_bucket_size 64;

    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
    }

    server {
    # перенаправляем с 80 порта на 443
    server_name mydomain.com http://www.mydomain.com
    listen 80;
    return 301 https://www.mydomain.com$request_uri;
    }

    server {
    listen 443 ssl;

    server_name blahblah.com http://www.blahblah.com;

    # Указываем пути к сертификатам
    ssl_certificate /etc/letsencrypt/live/blahblah.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blahblah.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_ciphers ‘ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA’;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    # позволяем серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей
    # ssl_stapling on;
    # ssl_stapling_verify on;
    # add_header Strict-Transport-Security max-age=15768000;
    location / {
    # …..
    }
    }

    # Settings for a TLS enabled server.
    #
    # server {
    # listen 443 ssl http2 default_server;
    # listen [::]:443 ssl http2 default_server;
    # server_name _;
    # root /usr/share/nginx/html;
    #
    # ssl_certificate “/etc/pki/nginx/server.crt”;
    # ssl_certificate_key “/etc/pki/nginx/private/server.key”;
    # ssl_session_cache shared:SSL:1m;
    # ssl_session_timeout 10m;
    # ssl_ciphers HIGH:!aNULL:!MD5;
    # ssl_prefer_server_ciphers on;
    #
    # # Load configuration files for the default server block.
    # include /etc/nginx/default.d/*.conf;
    #
    # location / {
    # }
    #
    # error_page 404 /404.html;
    # location = /40x.html {
    # }
    #
    # error_page 500 502 503 504 /50x.html;
    # location = /50x.html {
    # }
    # }

    }

    и kerio-connect.conf

    server {
    listen 80;
    server_name blahblah.com; # заменить на адрес своего сайта
    server_name_in_redirect off;
    rewrite ^ https://$server_name$request_uri? permanent;
    }

    server {
    listen 443 ssl;
    server_name blahblah.com; # заменить на адрес своего сайта

    ssl_certificate /etc/letsencrypt/live/blahblah.com/fullchain.pem; # заменить на адрес своего сайта
    ssl_certificate_key /etc/letsencrypt/live/blahblah.com/privkey.pem; # заменить на адрес своего сайта

    location /.well-known {
    alias /var/www/mail/.well-known;
    }

    location / {
    proxy_pass https://localhost:8843;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Remote-Port $remote_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
    chunked_transfer_encoding on;
    proxy_connect_timeout 6000;
    proxy_send_timeout 6000;
    proxy_read_timeout 6000;
    send_timeout 6000;
    }
    }

    Ответить
    • 28.07.2017 в 11:52
      Постоянная ссылка

      Разобрался сам. Дело в том, что https протокол в керио мы переназначили на 4483, а в конфиге /etc/nginx/sites-available/kerio-connect.conf идет перенаправление на стандартный порт 8843
      proxy_pass https://localhost:8843;
      когда меняется эта деталь, то всё становится ок

      Ответить
        • 01.08.2017 в 09:12
          Постоянная ссылка

          Заметил ещё одну неприятность, у меня юзеры подключены керез аутлук коннектор, он в свою очередь работает по 80 порту ( ЩИТО?? ), что бы не гонять эникеев я замапил 80 порт с локальных портов на 4483 при обращении на адрес ( IP/DNS ) керио

          Ответить
  • 11.08.2017 в 13:20
    Постоянная ссылка

    Ещё одна неприятность.
    Юзеры завопили т.к. размер вложений был ограничен одним мегабайтом. Это ограничение исходит из стандартного конфига nginx, даже если она не описана, то размер загружаемых файлов=1мб.
    Для исправления вносим в блок http соотв. настройку, я вырежу кусок блока
    [code]http {
    log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” “$http_x_forwarded_for”‘;
    client_max_body_size 128m;[/code]

    client_max_body_size 128m;

    После внесений изменений проверьте конфиг nginx -t
    и ребутайте его, если всё ок.

    Ответить

Добавить комментарий

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