Certbot (Русский)

From ArchWiki
Revision as of 18:19, 24 August 2017 by Khvalera (talk | contribs) (Automatic renewal)
Jump to navigation Jump to search

Let’s Encrypt бесплатный, автоматизированный, открытый центр сертификации использующий ACME протокол.

Официальный клиент называется 'Certbot', который позволяет запрашивать действительные сертификаты X.509 прямо из командной строки. Минимальный клиент с ручным созданием CSR доступен в acme-tinyAUR, клиенты, подходящие для скриптов, - это simp_le-gitAUR и letsencrypt-cliAUR.

Установка

Установить пакет certbot.

Плагины доступны для автоматической настройки и установки выданных сертификатов на веб-серверах:

  • Экспериментальный плагин для Nginx предоставляется пакетом certbot-nginx.
  • Автоматическая установка с использованием Apache HTTP Server включена через пакет certbot-apache.

Конфигурация

Для получения дополнительной информации об создании и использовании сертификатов обращайтесь в документацию Certbot documentation

Webroot

Note:
  • Метод Webroot требует HTTP на порт 80 для проверки Certbot.
    • Чтобы Certbot проверял использование HTTPS на порту 443, вместо Webroot следует использовать плагин Nginx (--nginx) или Apache ( --apache) (--webroot).
  • Имя сервера должно соответствовать имени соответствующего DNS.
  • На хосте могут потребоваться разрешения, чтобы разрешить доступ для чтения к http://domain.tld/.well-known.

При использовании метода webroot клиент Certbot отправляет запрос вызова внутри /path/to/domain.tld/html/.well-known/acme-challenge/ который используется для проверки.

Использование этого метода рекомендуется для ручной установки; Он предлагает автоматическое обновление и упрощение управления сертификатами.


Tip: The following initial nginx server configuration may be helpful to obtain a first-time certificate:
/etc/nginx/servers-available/domain.tld

server {
  listen 80;
  listen [::]:80;
  server_name domain.tld;
  root /usr/share/nginx/html;
  location / {
    index index.htm index.html;
  }
}

# ACME challenge
location ^~ /.well-known {
  allow all;
  auth_basic off;
  alias /var/lib/letsencrypt/.well-known/;
  default_type "text/plain";
  try_files $uri =404;
}

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

Запросить сертификат для domain.tld с помощью /var/lib/letsencrypt/

# certbot certonly --email email@example.com --webroot -w /var/lib/letsencrypt/ -d domain.tld

Чтобы добавить (дополнительный) домен, включите все зарегистрированные домены, используемые в текущей настройке:

# certbot certonly --email email@example.com --webroot -w /var/lib/letsencrypt/ -d domain.tld,sub.domain.tld

Чтобы обновить (все) текущий сертификат (ы):

# certbot renew

Смотрите #Automatic renewal[broken link: invalid section] как альтернативный вариант

Вручную

Note:
  • Запускаемый веб-сервер должен быть временно остановлен.
  • Автоматическое обновление недоступно при выполнении ручной установки, см. #Webroot.

Если для вашего веб-сервера нет плагина, используйте следующую команду:

# certbot certonly --manual

Если вы предпочитаете использовать DNS-вызов (запись TXT), используйте:

# certbot certonly --manual --preferred-challenges dns

Это автоматически проверяет ваш домен и создает закрытый ключ и пару сертификатов. Они будут размещены в /etc/letsencrypt/live/your.domain/.

Затем вы можете вручную настроить веб-сервер для использования ключа и сертификата в этом каталоге.

Note: Запуск этой команды несколько раз приведет к созданию нескольких наборов файлов с конечным числом в /etc/letsencrypt/live/your.domain/ поэтому позаботьтесь о том, чтобы переименовать их в этом каталоге или в файле конфигурации веб-сервера.

Расширенная настройка

Конфигурация веб-сервера

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

Tip:
  • Mozilla имеет полезную статью SSL/TLS article, которая включает в себя automated tool чтобы создать более безопасную конфигурацию.
  • Cipherli.st обеспечивает надежные примеры внедрения SSL и руководство для большинства современных веб-серверов.

nginx

Пример сервера domain.tld с использованием подписанного SSL-сертификата Let's Encrypt:

/etc/nginx/servers-available/domain.tld

# redirect to https
server {
  listen 80;
  listen [::]:80;
  server_name domain.tld;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_prefer_server_ciphers on;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name domain.tld;
  ..
}

# A subdomain uses the same SSL-certifcate:
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;
  ..
  server_name sub.domain.tld;
  ..
}

# ACME challenge
location ^~ /.well-known {
  allow all;
  alias /var/lib/letsencrypt/.well-known/;
  default_type "text/plain";
  try_files $uri =404;
}

Несколько доменов

Управление может быть упрощено путем сопоставления всех HTTP-запросов для /.well-known/acme-challenge/ в одну папку, например. /var/lib/letsencrypt.

Затем путь должен быть доступен для записи клиенту Let's Encrypt и веб-серверу (например, nginx или Apache, запущенному под пользователем http):

# mkdir -p /var/lib/letsencrypt/.well-known
# chgrp http /var/lib/letsencrypt
# chmod g+s /var/lib/letsencrypt

nginx

Создайте файл, содержащий блок местоположения, и включите его внутри блока сервера:

/etc/nginx/conf.d/letsencrypt.conf

location ^~ /.well-known {
  allow all;
  alias /var/lib/letsencrypt/.well-known/;
  default_type "text/plain";
  try_files $uri =404;
}

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

/etc/nginx/servers-available/domain.conf
server {
  server_name domain.tld
   ..
  include conf.d/letsencrypt.conf;
}

Apache

Создайте файл /etc/httpd/conf/extra/httpd-acme.conf:

/etc/httpd/conf/extra/httpd-acme.conf
Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

Включив в /etc/httpd/conf/httpd.conf:

/etc/httpd/conf/httpd.conf
Include conf/extra/httpd-acme.conf

Автоматическое обновление

systemd

Создайте systemd certbot.service:

/etc/systemd/system/certbot.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos

Вероятно, вы захотите, чтобы ваш веб-сервер перезагружал сертификаты после каждого обновления. You can realize that by adding one of these lines to the certbot.service file:

  • Apache: ExecStartPost=/bin/systemctl reload httpd.service
  • nginx: ExecStartPost=/bin/systemctl reload nginx.service
Note: Before adding a timer, check that the service is working correctly and is not trying to prompt anything.

Add a timer to check for certificate renewal twice a day and include a randomized delay so that everyone's requests for renewal will be evenly spread over the day to lighten the Let's Encrypt server load [1]:

/etc/systemd/system/certbot.timer
[Unit]
Description=Twice daily renewal of Let's Encrypt's certificates

[Timer]
OnCalendar=0/12:00:00
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Enable and start certbot.timer.

Alternative services

When using the standalone method you should stop your webserver before executing the renew request, and start your webserver when Certbot is finished. Certbot provides hooks to automatically stop and restart a web server.

nginx
/etc/systemd/system/certbot.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --post-hook "/usr/bin/systemctl restart nginx.service" --agree-tos
Apache
/etc/systemd/system/certbot.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --pre-hook "/usr/bin/systemctl stop httpd.service" --post-hook "/usr/bin/systemctl start httpd.service" --quiet --agree-tos