Установка certbot. Получаем SSL -сертификат от Lets Encrypt. Настройка HTTPS на nginx

Категория: Nginx

Переключаем сайт на защищенный HTTPS протокол. Получение и управление SSL сертификатами от Lets Encrypt на Ubuntu 18.04.

Установка Certbot

Certbot нужен для управления сертификатами Lets Encrypt.

sudo apt install certbot python3-certbot-nginx -y  ## certbot v0.31.0

Создаем Nginx конфиг сайта для которого будем получать SSL сертификат. Проверяем конфиг Nginx:

sudo nginx -t

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

Установка сертификата для нового сайта:

sudo certbot --nginx -d onedev.net
sudo certbot --nginx -d onedev.net -d www.onedev.net -d api.onedev.net
Пошаговая генерация SSL-сертификата в интерактивном режиме
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel)
: ВАШ_EMAIL_ДЛЯ_УВЕДОМЛЕНИЙ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
(A)gree/(C)ancel: A 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
(Y)es/(N)o: N
Obtaining a new certificate Performing the following challenges: http-01 challenge for api.ocr.onedev.net Waiting for verification... Cleaning up challenges Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/api.ocr.onedev.net.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/api.ocr.onedev.net.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://api.ocr.onedev.net You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=api.ocr.onedev.net - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/api.ocr.onedev.net/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/api.ocr.onedev.net/privkey.pem Your cert will expire on 2020-12-30. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Примечание

Если вы планируете редиректить www.site.com на site.com - не обязательно генерировать сертификат для домена www.site.com.

При генерации сертификата нужно в одной команде указывать опциями все используемые под-домены!

Чтобы перенаправить www на non-www проверьте конфиг /etc/nginx/sites-available/ikino.club.conf, и на всякий проверьте конфиг /etc/nginx/sites-enabled/default.conf (да, именно sites-enabled/default).

Пример nginx конфига с перенаправлением http://www. и https://www. на https://site.com:
server {
    listen 80;
    server_name site.com www.site.com;
    
    if ($host = site.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = www.site.com) {
        return 301 https://site.com$request_uri;
    }
    
    return 404; # managed by Certbot
}

server {
    server_name site.com www.site.com;
    root        /var/www/site.com/public/;
    index       index.html index.php;

    if ($host = www.site.com) {
        return 301 https://site.com$request_uri;
    }
    
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/site.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/site.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    // ... ваша дополнительная конфигурация
}
Еще можно перенаправлять по условию (не редиректить curl, например):
server {
    listen 80;
    listen 443 ssl;
    
    # ...

    ## @note Редирект на HTTPS, только если клиент похож на браузер (поддерживает ли изображения).
    ##       Чтобы для curl не отдавал 301 редирект. Браузеры редиректят автоматически, а curl нет.
    if ($server_port = 80) { set $UD "O"; }
    if ($http_accept ~* "image/") { set $UD "${UD}N"; }
    if ($UD = ON) {
        return 301 https://$host$request_uri;
    }

    # ...
}


Примечание

Если что-то пошло не так, попробуйте сгенерировать сертификаты без автоустановки (без активации nginx-плагина, не указываем --nginx):

sudo certbot certonly --webroot -w /var/www/ikino.club -d ikino.club -d www.ikino.club

*Сертификаты и ключи будут скопированы в /etc/letsencrypt/live/site.com/.

Подробнее о certbot

certbot          # Получить и установить сертификат
certbot certonly # Получить сертификат, но не устанавливать
certbot-auto     # Устаревший метод установки

certbot-auto -c config.ini  # Можно передавать список доменов в конфиге
certbot certonly --manual   # Если кастомный web-сервер

Обслуживание

Удалить сертификат:

sudo certbot delete --cert-name site.com

Проверить статус сервиса обновления сертификатов:

sudo systemctl status certbot.timer

Протестировать процесс обновления сертификатов:

sudo certbot renew --dry-run

Wildcard SSL сертификаты

Let's Encrypt предоставляет бесплатные Wildcard SSL сертификаты (для нескольких доменов и поддоменов).

При генерации Wildcard SSL сертификата в manual режиме (без DNS плагина) он не сможет автоматически обновляться!
Нужно будет обновлять сертификаты и прописывать DNS токен вручную каждые 3 месяца.
Вместо этого используйте режим DNS API.

Certbot

https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins

sudo certbot certonly --manual --preferred-challenges dns -d *.domain.com -d domain.com
sudo certbot certonly --manual --preferred-challenges dns -d *.domain.com -d domain.dom --agree-tos --dry-run
sudo certbot certonly --manual --preferred-challenges dns -d *.domain.com --server https://acme-v02.api.letsencrypt.org/directory

Процесс генерации сертификата:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?

ПРИМЕЧАНИЕ. IP-адрес этой машины будет публично зарегистрирован как запросивший этот сертификат.
Если вы запускаете certbot в ручном режиме на машине, которая не является вашим сервером, убедитесь, что вас это устраивает.
> Вы согласны с тем, что ваш IP логируется?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.domain.com with the following value:

123456789012_XXXXXXXXXXXXXXXXXX_123456789012

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

Добавьте в DNS TXT-запись _acme-challenge.domain.com с токеном (у регистратора):

_acme-challenge.domain.com TXT Chs768564536576SDGdG6SQDYTZAEq

Проверить TXT запись в DNS:

nslookup -type=TXT _acme-challenge.domain.com
dig -t txt _acme-challenge.domain.com
dig @8.8.8.8 -t txt _acme-challenge.domain.com

Параметр "certonly --manual" задаются, если вы генерите сертификат не на сервере, а на другом компе.

Режим/плагин manual может использовать http или dns вызовы (challenge).

Параметр "--preferred-challenges dns | http" указывает тип challenge.

При "http challenge" нужно добавить файлы в корневой каталог сайта ./.well-known/acme-challenge/. Такой подход похож на плагин webroot, но не автоматизированный.

При "dns challenge" нужно добавить TXT-запись в DNS вида _acme-challenge.domain.com с токеном.


Перед выдачей сертификатов Let’s Encrypt проверяет, контролируете ли вы хосты, для которых запрашиваете сертификаты. В случае wildcard-сертификата нам нужно доказать, что мы контролируем весь домен. Мы делаем это, отвечая на запрос на основе DNS, где Certbot отвечает на вызов, создавая специальную запись DNS в целевом домене. Затем серверы Let’s Encrypt проверяют эту запись перед выдачей сертификата. Чтобы Certbot подключился к вашему провайдеру DNS, нужен плагин. Чтобы узнать имя нужного подключаемого модуля для вашего провайдера DNS, см. список подключаемых модулей DNS Certbot: https://certbot.eff.org/docs/using.html#dns-plugins Плагин провайдера DigitalOcean называется certbot-dns-digitalocean.

#https #ssl #lets encrypt #certificates

категория: Nginx