LetsEncrypt SSL

Материал из Webko Wiki
Перейти к навигации Перейти к поиску

Letsencrypt-logo-horizontal.svg

Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit.

We give people the digital certificates they need in order to enable HTTPS (SSL/TLS) for websites, for free, in the most user-friendly way we can. We do this because we want to create a more secure and privacy-respecting Web.

The key principles behind Let’s Encrypt are:

  • Free: Anyone who owns a domain name can use Let’s Encrypt to obtain a trusted certificate at zero cost.
  • Automatic: Software running on a web server can interact with Let’s Encrypt to painlessly obtain a certificate, securely configure it for use, and automatically take care of renewal.
  • Secure: Let’s Encrypt will serve as a platform for advancing TLS security best practices, both on the CA side and by helping site operators properly secure their servers.
  • Transparent: All certificates issued or revoked will be publicly recorded and available for anyone to inspect.
  • Open: The automatic issuance and renewal protocol will be published as an open standard that others can adopt.
  • Cooperative: Much like the underlying Internet protocols themselves, Let’s Encrypt is a joint effort to benefit the community, beyond the control of any one organization.

Установка приложения

Centos

yum install epel-release -y
yum install certbot

Arch Linux

pacman -Syu certbot

Debian/Ubuntu

sudo apt-get update
sudo apt-get install letsencrypt

Получение сертификата

В силу того что в своей работе я отдаю предпочтение веб серверу Nginx все примеры будат заточены под него.

Для примера возьмем домен wiki.webko.net.ua, у него есть конфиг вида

server {
        listen      212.26.146.24:80;
        server_name wiki.webko.net.ua;
        root        /srv/http/wiki;
        index       index.php;
        access_log  /var/log/nginx/domains/wiki.webko.net.ua.log combined;
        error_log   /var/log/nginx/domains/wiki.webko.net.ua.error.log error;

        client_max_body_size 5m;
        client_body_timeout 60;

        location / {
                ...
        }
}

Для того чтобы полчуть сертификат для домена первым делом нужно удостовить LE в том что вы имеете право на запрос сертификата для домена. Я использую acme-challenge. Для упрощения админисрирования, возможно, большего хазяйства я использую шаблон для проведения удостоверения, его основная функция - переадресация всех запросов к урлу .well-known/acme-challenge/ приложению проводящему удостоверение (тоесть letsencrypt или certbot), его мы сможем подключать к любому виртуальному хосту, выглядит он так.

mkdir /etc/nginx/template
vim /etc/nginx/template/letsencrypt.conf
location ~ ^/(.well-known/acme-challenge/.*)$ {
    proxy_pass http://127.0.0.1:9999/$1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Дальше подключаем его к виртуальному хосту нашего домена.

server {
        listen      212.26.146.24:80;
        server_name wiki.webko.net.ua;
        root        /srv/http/wiki;
        index       index.php;
        access_log  /var/log/nginx/domains/wiki.webko.net.ua.log combined;
        error_log   /var/log/nginx/domains/wiki.webko.net.ua.error.log error;

        client_max_body_size 5m;
        client_body_timeout 60;

        include template/letsencrypt.conf;  # <---

        location / {
                ...
        }
}

Перезагружаем конфиг Nginx для применения изменений.

nginx -t
nginx -s reload
letsencrypt --agree-tos --renew-by-default --standalone --http-01-port 9999 --server https://acme-v02.api.letsencrypt.org/directory certonly -d wiki.webko.net.ua --register-unsafely-without-email

Подготовка завершена, переходим непосредственно к запросу сертификата. В зависимости от вашего дистрибютива приложение может иметь разные названия (letsencrypt или certbot).

letsencrypt --agree-tos --renew-by-default --standalone --standalone-supported-challenges \
http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory \  #запуск внутреннего http сервера для проведения аутентификации
certonly \                                    #получаем сертификаты без автоматической правки конфигов вебсервера(возможно при помощи отдельных плагинов для LE)
-d wiki.webko.net.ua -d www.wiki.webko.net.ua \      #перечислены домены для которых запрашивается сертификат
--rsa-key-size 4096

Дальше начнется удостоверенеие, в ходе так же у вас будет запршен "контактный" емейл, для отправки вам уведомлений об окончании срока действия сертификата.

Если все прошло успешно вы увидите уведомление об успешном создании сертификатов и пути их расположения.

/etc/letsencrypt/renewal/wiki.webko.net.ua.conf - конфиг
/etc/letsencrypt/archive/wiki.webko.net.ua/     - архив сертификатов
/etc/letsencrypt/live/wiki.webko.net.ua/        - актуальные сертификаты

Следубщим шагом создадим виртуальный конфиг для нашего домена с поддержкой SSL.

# постоянный редирект на https
server {
        listen 212.26.146.24:80;
        server_name wiki.webko.net.ua;
        return 301 https://$server_name$request_uri;
}
# конфиг виртуального хоста
server {
        listen      212.26.146.24:443 ssl;
        server_name wiki.webko.net.ua;
        root        /srv/http/wiki;
        index       index.php;
        access_log  /var/log/nginx/domains/wiki.webko.net.ua.log combined;
        error_log   /var/log/nginx/domains/wiki.webko.net.ua.error.log error;

# включение ssl и подключение сертификатов
        ssl         on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate /etc/letsencrypt/live/wiki.webko.net.ua/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/wiki.webko.net.ua/privkey.pem;

        client_max_body_size 5m;
        client_body_timeout 60;

        include template/letsencrypt.conf;

        location / {
                ...
        }
}

Перезагружаем конфиг Nginx для применения изменений.

nginx -t
nginx -s reload

Теперь наш сайт доступен по https соединению, при переходе по http будет срабатывать редирект на https.

Получение сертификата не для WEB

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

yum install nginx | pacman -Syu nginx | apt install nginx
vim /etc/nginx/conf.d/default.conf
server {
        listen       80 default_server;
        server_name _;
        include template/letsencrypt.conf   # наш шаблон
}
nginx -t
systemctl start nginx
systemctl enable nginx

Дальше генерируем наш сертификат как описано выше, главное условие, у вас должна быть коректно настроена А запись для интересующего домена (субдомена).

По завершению сертификат можно использовать например для exim, postfix, dovecot.

Обновление сертифкатов

Для обновления сертификатов срок годности которых подходит или подошел к концу можно воспользоватся командой

letsencrypt renew

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

Для автоматического обновления можно использовать крон.

echo "0 0 * * 7 /usr/bin/letsencrypt > /dev/null && systemctl restart nginx" >> /var/spool/cron/root

Такое задание будет пытатся обновить сертификаты каждое воскресенье в 0 часов 0 минут.

Ограничения

У Let’s Encrypt действуют такие ограничения:

  • 20 сертификатов на 1н домен в неделю;
  • 100 сабдоменов на 1н сертификат;
  • 5 повторяющихся запросов для домена/сабдомена в неделю;
  • 5 неудачных попыток верификации на аккаунт, доменное имя в час;
  • 500 аккаунтов на IP за 3 часа;
  • 300 ожидающих авторизации запросов на аккаунт.

Здесь crt.sh можно просмотреть количество сертификатов выпущеных для домена.