Легкий и халявный SSL с Let's Encrypt

Published Aug 12, 2018 22:28 UTC on Yaroslav's weblog

Всем нам известно насколько важна безопасность в веб-разработке, и не только в вебе. И не надо забыть про тот самый SEO Google который повышает рейтинг сайтов которые работают с https вместо старого доброго http. (Хоть мне плевать на Google, но мои клиенты так не думают, также как основная часть аудитории этой статьи)

Возможно вы давно хотели добавить SSL сертификат для своего сайта или сервиса, но чувак, они же деньги стоят! А вот вы ошибаетесь (Если вы уже знали про Let's Encrypt, то прощу прошение за такое бесполезное введение).

В этом туториале я коротко объясню как сгенерировать сертификат SSL с Let's Encrypt с помощью Certbot используя nginx. В моем случае я его устанавливал на Debian Stretch, комманда для установки Certbot может отличатся для вас в зависимости от вашей ОСи.

Перед тем как начать, устанавливаем

# apt-get install certbot

До того как мы сможем установить сертификат, нам нужно настроить nginx для установки и последовательной продления сертификата. Для этого нам понадобится поменять дефолтный файл настройки сервера nginx. Нам это необходимо сделать для того чтобы, сервер Let's Encrypt смог прочитать файл "челленджа" сгенерирован Certbot'ом и убедится в том что домен(ы) действительно наш(и).

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        # This is so that Let's Encrypt can look for the challenge
        location /.well-known/acme-challenge/ {
                root /var/www/html/;
                default_type text/plain;
        }

        # The rest of your configuration...
}

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

# sudo systemctl restart nginx

Теперь у нас все готово чтобы сгенерировать сертификат. Мне нужен был сертификат для несколько поддоменов, так что я их всех добавил в список аргументов используя флаг -d, например

# certbot certonly --webroot -w /var/www/html -d www.example.com -d example.com

Certbot попросит ваш адрес электронной почти, в который будут отправляться уведомления об истекании срока действия вашего сертификата. Однако Certbot красавчик умеет их продлевать автоматический.

Вот и наш сертификат готов. А теперь вы можете настроить nginx чтобы он принимал https запросы и делал редирект http запросов на https. Не забудьте добавить правильный путь к вашему сертификату и ключу в ssl_certificate и ssl_certificate_key соответственно.

server {
        listen 80;
        listen [::]:80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;

        server_name www.example.com;
        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /path/to/key/www.example.com/privkey.pem;
        location /static/ {
                alias /home/webuser/mysite/static/;
        }
        location /media/ {
                alias /home/webuser/mysite/media/;
        }
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://127.0.0.1:8001;
        }
}

Один минус автоматического редиректа, заключается в том что старые браузеры, (ох уж эти старые неубиваемые версси Internet Explorer) которые не поддерживают https, не смогут открыть ваш сайт. Но лично мне по барабану на браузера десятилетней давности.

Вы можете найти больше информации по Certbot на этой странице (сайт на английском): https://certbot.eff.org/docs/using.html

Редактировано (2018/11/02): Недавно в 2018 Let's Encrypt добавили возможность сгенерировать универсальный сертификат для всех поддоменов (например, *.example.com).

Чтобы сгенерировать такой вид сертификата, нам понадобится скачать последнюю версию certbot из официального репозитория гита

$ git clone https://github.com/certbot/certbot.git

После этого можем перейти в каталог certbot, и выполнить следующую комманду

$ ./certbot-auto certonly --manual \
> --preferred-challenges=dns \
> --email email@example.com \
> --server https://acme-v02.api.letsencrypt.org/directory \
> --agree-tos \
> -d *.example.com

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

Имейте ввиду что такие виды сертификатов нельзя обновлять в автоматическом режиме.