Let's Encrypt

Обновлено 3 сентября 2019

Введение

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

Проект Let’s Encrypt создан для того, чтобы большая часть интернет-сайтов смогла перейти к шифрованным подключениям (HTTPS). В отличие от коммерческих центров сертификации, в данном проекте не требуется оплата, переконфигурация веб-серверов, использование электронной почты, обработка просроченных сертификатов, что делает процесс установки и настройки TLS-шифрования значительно более простым.

Настройка клиента Let's Encrypt

Установите клиент Let's Encrypt:

emerge -a app-crypt/certbot

Выполните регистрацию Let's Encrypt ACME (автоматизированная среда управления сертификатами) аккаунта, указав почтовый адрес, на который в будущем будут приходить важные сообщения:

certbot register --agree-tos -m myemail@example.org
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
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 EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: No

IMPORTANT NOTES:
 - 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.

После этого в каталоге /etc/letsencrypt/ будет создана инфраструктура для управления сертификатами (хранения, обновления, отзыва, удаления).

Обзор

tree /etc/letsencrypt

/etc/letsencrypt/
├── accounts
│   └── acme-v01.api.letsencrypt.org
│       └── directory
│           └── 091f17d3f1d16083e1f0e70b463452cc
│               ├── meta.json
│               ├── private_key.json
│               └── regr.json
└── renewal-hooks
    ├── deploy
    ├── post
    └── pre

8 directories, 3 files

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

Получение сертификата без использования веб-сервера

Данная схема подходит, если на указанной машине нет веб-сервера.

Важно

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

Выполните следующую команду для получения сертификата для домена example.org:

certbot certonly --preferred-challenges http --standalone -d example.org
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.org
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.org/privkey.pem
   Your cert will expire on 2018-07-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

Сертификат и закрытые ключи будут находиться в каталоге /etc/letsencrypt/live/example.org/.

Обзор

tree /etc/letsencrypt/live/example.org

/etc/letsencrypt/live/example.org
├── cert.pem -> ../../archive/example.org/cert1.pem
├── chain.pem -> ../../archive/example.org/chain1.pem
├── fullchain.pem -> ../../archive/example.org/fullchain1.pem
├── privkey.pem -> ../../archive/example.org/privkey1.pem
└── README

0 directories, 5 files

Получение сертификата с использованием Nginx

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

Важно

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

Создайте настройки для включения в конфигурации серверов:

mkdir /var/calculate/www/acme

/etc/nginx/acme.conf
location /.well-known {
    autoindex off;
    root /var/calculate/www/acme;
}

Включите ACME в настройку необходимого сервера example.org и перезапустите Nginx:

/etc/nginx/sites-enabled/example.org
server {
    listen 80;
    server_name www.example.org example.org;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme.conf;

    root /var/calculate/www/example.org/htdocs;
}

Выполните следующую команду для получения сертификата для доменов example.org и www.example.org:

certbot certonly --webroot --webroot-path /var/calculate/www/acme -d example.org -d www.example.org
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

Performing the following challenges:
http-01 challenge for example.org
http-01 challenge for www.example.org
Using the webroot path /var/calculate/www/acme for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.org/privkey.pem
   Your cert will expire on 2018-07-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

Получение сертификатов с использованием отдельного сервера хранения

Данная схема подходит, если на сервере хранения нет веб-сервиса.

Важно

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

На веб-сервере создайте файл для перенаправления ACME на certbot.local.example.org:

/etc/nginx/acme-proxy.conf
location /.well-known {
    proxy_pass http://certbot.local.example.org:80/.well-known;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Включите ACME-proxy в настройку необходимого сервера example.org и перезапустите nginx:

/etc/nginx/sites-enabled/example.org
server {
    listen 80;
    server_name www.example.org example.org;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme-proxy.conf;

    root /var/calculate/www/example.org/htdocs;
}

На сервере хранения установите Let's Encrypt и выполните регистрацию аккаунта, как описано выше.

Для получения сертификата на домены www.example.org и example.org на сервере хранения выполните:

certbot certonly --preferred-challenges http --standalone -d example.org -d www.example.org
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.org
http-01 challenge for www.example.org
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.org/privkey.pem
   Your cert will expire on 2018-07-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

Полученные сертификаты необходимо передать веб-серверу.

Создайте каталог для хранения сертификата для Nginx и настройте права:

mkdir -p /etc/nginx/ssl/example.org

chmod 550 -R /etc/nginx/ssl

chown -R nginx: /etc/nginx/ssl

Сгенерируйте ключ SSL для доступа к веб-серверу на хранилище:

ssh-keygen -f /etc/letsencrypt/keys/certbot

Добавьте открытый ключ /etc/letsencrypt/keys/certbot.pub для беспарольного подключения к веб-серверу:

ssh-copyid -i /etc/letsencrypt/keys/certbot.pub root@weberver

Создайте скрипт для передачи сертификатов на сервер для Nginx:

/var/calculate/bin/deploy-nginx
#!/bin/sh
CERTPATH=$1
HOST=$2
SITE=$(basename $CERTPATH)

scp -i /etc/letsencrypt/keys/certbot $CERTPATH/fullchain.pem root@$HOST:/etc/nginx/ssl/$SITE/
scp -i /etc/letsencrypt/keys/certbot $CERTPATH/privkey.pem root@$HOST:/etc/nginx/ssl/$SITE/
ssh -i /etc/letsencrypt/keys/certbot root@$HOST "/etc/init.d/nginx restart"

У скрипта два входящих параметра: путь до сертификатов (/etc/letsencrypt/live/example.org/), которые нужно передать, и адрес веб-сервера (в примере webserver), на который нужно будет подключаться по SSH.

Выполните передачу сертификатов на веб-сервер:

/var/calculate/bin/deploy-nginx /etc/letsencrypt/live/example.org webserver
fullchain.pem                                                                        100% 3875     5.1MB/s   3.8KB/s   00:00    
privkey.pem                                                                          100% 1704     2.6MB/s   1.7KB/s   00:00    
 * Checking nginx' configuration ... [ ok ]
 * Stopping nginx ... [ ok ]
 * Starting nginx ... [ ok ]

Сертификат и ключ будут скопированы в директорию /etc/nginx/ssl/example.org/ веб-сервера.

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

Подтверждение сертификатов Wildcard-доменов происходит через DNS. Для проверки наличия записей будет использоваться утилита dig. Поставьте пакет net-dns/bind-tools.

emerge -a net-dns/bind-tools

Выполните регистрацию Let's Encrypt ACME аккаунта второй версии, указав почтовый адрес, на который в будущем будут приходить важныe сообщения:

certbot register --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -m myemail@example.org
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
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 EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N

IMPORTANT NOTES:
 - 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.

Выполните команду для получения сертификата для доменов example.org и www.example.org. В ходе выполнения программа запросит создать в DNS TXT-записи. Их нужно добавить вручную через DNS-хостинг.

certbot certonly --manual-public-ip-logging-ok --preferred-challenges dns -d "example.org,*.example.org" --manual --server https://acme-v02.api.letsencrypt.org/directory
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.org
dns-01 challenge for example.org

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.org with the following value:

Exqq5xdhLdCfjdbEGfZ81AY1g7eJmaiiyA5HQDyjr1g

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

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.org with the following value:

gl8yUUx71GX3Hv-cTZcM1K29ayFy5IMthV2IIii6dKs

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.org/privkey.pem
   Your cert will expire on 2018-07-19. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - 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

Для проверки наличия TXT-записи используйте следующую команду:

dig -t TXT _acme-challenge.example.org
; <<>> DiG 9.11.2-P1 <<>> -t txt _acme-challenge.home.icerider.xyz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4898
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.home.icerider.xyz. IN  TXT

;; ANSWER SECTION:
_acme-challenge.example.org. 3599   IN TXT  "Exqq5xdhLdCfjdbEGfZ81AY1g7eJmaiiyA5HQDyjr1g"
_acme-challenge.example.org. 3599   IN TXT  "gl8yUUx71GX3Hv-cTZcM1K29ayFy5IMthV2IIii6dKs"

;; Query time: 36 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Пт апр 20 14:29:32 MSK 2018
;; MSG SIZE  rcvd: 174

Автоматическое обновление сертификатов, полученных вручную, не поддерживается, поэтому их необходимо обновлять отдельно.

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

Для получения списка сертификатов выполните:

certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: home.example.org
    Domains: home.example.org *.home.example
    Expiry Date: 2018-07-19 10:47:22+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/home.example.org/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/home.example.ru/privkey.pem
  Certificate Name: example.org
    Domains: example.org www.example.org
    Expiry Date: 2018-07-18 11:02:43+00:00 (VALID: 88 days)
    Certificate Path: /etc/letsencrypt/live/example.org/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.org/privkey.pem
-------------------------------------------------------------------------------

Сертификаты Let's Encrypt выдаются на 3 месяца, поэтому не ранее, чем за месяц, их необходимо обновить.

Для обновления сертификатов используйте команду:

certbot renew
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.org.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

-------------------------------------------------------------------------------

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.org/fullchain.pem expires on 2018-07-19 (skipped)
  /etc/letsencrypt/live/example.com/fullchain.pem expires on 2018-07-18 (skipped)
No renewals were attempted.

Эта команда обрабатывает конфигурационные файлы в /etc/letsencrypt/renewal и при необходимости выполняет обновление сертификатов.

Для автоматического обновления сертификатов создайте файл для cron:

/etc/cron.d/certbot
30 4 * * 1 root /usr/bin/certbot renew >> /var/log/cron-renew.log

Согласно указанным настройкам, каждый понедельник в 4:30 будет производиться получение новых SSL-сертификатов взамен старых, если их пора обновлять, с записью лога в файл.

При обновлении сертификатов необходимо выполнять различные действия: перезапускать службы, которые их используют, переносить сертификаты на другие машины и т.п.. Для этих целей используется каталог /etc/letsencrypt/renewal-hooks/deploy/. Скрипты в этой папке будут выполнены при обновлении хотя бы одного сертификата.

Важно

Скрипты в директории /etc/letsencrypt/renewal-hooks/deploy/ должны быть с правами на выполнение.

Пример перезапуска Nginx при обновлении сертификатов

Этот пример подойдёт, если получение сертификата осуществляется через Nginx, находящийся на этой же машине.

/etc/letsencrypt/renewal-hooks/deploy/restart-nginx
#!/bin/bash
/etc/init.d/nginx restart

Установите права на выполнение скрипта:

chmod 700 /etc/letsencrypt/renewal-hooks/deploy/restart-nginx

Пример обновления сертификатов веб-сервера из хранилища сертификатов

В данном примере скрипт push-to-nginx при обновлении сертификата для example.org будет вызывать скрипт, который обновит сертификаты на webserver, а также перезапустит на нём Nginx.

/etc/letsencrypt/renewal-hooks/deploy/push-to-nginx
#!/bin/bash
set -e

for domain in $RENEWED_DOMAINS; do
    case $domain in
    example.org)
        /var/calculate/bin/deploy-nginx $RENEWED_LINEAGE webserver
        ;;
    esac
done

Установите права на выполнение скрипта:

chmod 700 /etc/letsencrypt/renewal-hooks/deploy/push-to-nginx