Certbot (Русский)

From ArchWiki
Revision as of 19:57, 24 August 2017 by Khvalera (talk | contribs) (Получить сертификат(ы))
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

Примечание:
  • Метод 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/ который используется для проверки.

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


Совет: Следующая первоначальная конфигурация сервера nginx server может оказаться полезной для получения первого сертификата:
/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

Смотрите #Автоматическое обновление как альтернативный вариант

Вручную

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

Вероятно, вы захотите, чтобы ваш веб-сервер перезагружал сертификаты после каждого обновления. Добавте одну из этих строк в файл certbot.service:

  • Apache: ExecStartPost=/bin/systemctl reload httpd.service
  • nginx: ExecStartPost=/bin/systemctl reload nginx.service
Note: Перед добавлением timer убедитесь, что служба работает правильно и ничего не пытается запросить.

Добавьте таймер для проверки продления сертификата дважды в день и включите рандомизированную задержку, чтобы все запросы на продление были равномерно распределены в течение дня, чтобы облегчить загрузку сервера Let's Encrypt [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 и start certbot.timer.

Альтернативные услуги

При использовании автономного метода, перед выполнением запроса на обновление, вы должны остановить свой веб-сервер и запустить веб-сервер, когда работа Certbot будет завершена. Certbot предоставляет hooks для автоматического остановки и перезапуска веб-сервера.

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

Смотрите также