
Разберем как выписывать сертификаты letsecnrypt для nginx, apache и reverse proxy с остановкой и без остановки веб-сервера, а так же их автообновление.
P.S. к моменту написания статьи клиент переименовали в certbot, но синтаксис не изменился.
Первым делом клонируем репозиторий: git clone https://github.com/certbot/certbot.git
Чтобы каждый раз не писать полный путь к клиенту можно создать симлинк в /usr/bin (или sbin кому как удобнее): ln -s /path/to/certbot/certbot-auto /usr/bin/certbot
Запускаем certbot, чтобы он установил нужные ему пакеты: certbot --help
Разбор основных моментов!
Чтобы выписать сертификат нужно, чтобы ваш веб-сервер был доступен в интернете поскольку клиент создает определенные файлы, которые потом проверяются acme-сервером. На сколько я понял это проверка на существование ресурса для которого и выписывается сертификат.
Можно выписать 5 сертификатов в неделю, но этот лимит не действует на отзыв сертификатов и их продление.
Есть возможность за один раз выписать несколько сертификатов, чтобы сразу не исчерпать лимит.
Есть два основных способа как выписать сертификат.
Способ первый: standalone
certbot certonly --standalone -d site.mydomain.com -d site2.mydomain.com
Если решили использовать standalone, то сначала нужно остановить веб-сервер поскольку при указании этого ключа клиент создаст в /tmp все необходимые директории и файлы, а так же поднимет свой веб-сервер к которому и будет обращаться acme-сервер иначе просто получите ошибку "address already in use" поскольку 80 порт уже будет занят вашим веб-сервером.
Способ второй: webroot
certbot certonly --webroot -w /var/www/site/ -d site.mydomain.com -w /var/www/site2/ -d site2.mydomain.com
Этот способ не требует отключения веб-сервера поскольку таким образом указываем клиенту, где создавать директории и файлы необходимые для acme-сервера. Подойдет если нельзя отключать веб-сервер (например на production сервере).
Все выписанные сертификаты хранятся в директории /etc/letsencrypt/live, а в archive соответственно лежат просроченные и отозванные сертификаты.
Далее быстренько рассмотрим примеры конфигураций.
Начнем с APACHE!
<VirtualHost *:443>
ServerAdmin admin@mydomain.com
DocumentRoot /var/www/site
ServerName site.mydomain.com
CustomLog /var/log/httpd/site-ssl-access.log combined
ErrorLog /var/log/httpd/site-ssl-error.log
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/site.mydomain.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site.mydomain.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/site.mydomain.com/fullchain.pem
</VirtualHost>
Пример для NGINX!
server {
listen 443 ssl http2;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA256:ECDHE-ECDSA-AES256-SHA256:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA256:DHE-RSA-AES256-SHA256:AES256-GCM-SHA384:AES256-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /etc/letsencrypt/live/site.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.mydomain.com/privkey.pem;
server_name site.mydomain.com;
server_tokens off;
add_header Strict-Transport-Security max-age=2592000;
access_log /usr/local/nginx/logs/site_access.log main;
error_log /usr/local/nginx/logs/site_error.log;
root /var/www/site;
index index.php;
location / {
...
}
}
Reverse Proxy!
Представим ситуацию когда у вас есть веб-сервер, который проксирует несколько внутренних веб-серверов. При этом нельзя прерывать его работу и у него нет document_root поскольку он занимается чисто проксированием входящих запросов.
Очевидный выход из ситуации это создать alias при обращении к которому frontend будет отдавать файлы из определенной директории.
Создаем директорию для клиента: mkdir /var/www/site
Добавляем дополнительный location в конфигурацию nginx:
location ^~ /.well-known {
alias /var/www/site/.well-known;
charset off;
add_header Content-Type text/plain;
}
Из конфигурации следует, что если кто-то обратится по адресу http://site.mydomain.com/.well-known, то будут отданы файлы из директории /var/www/site/.well-known (директорию .well-known клиент создаст сам, потому не нужно его создавать).
Обратите внимание на http заголовок. Кодировку нужно отключить и заменить заголовок text/html на text/plain или добавить как дополнительный заголовок иначе получите ошибку.
Далее выполняем уже знакомую команду:
certbot certonly --webroot -w /var/www/site/ -d site.mydomain.com
Автообновление!
В принципе та самая фишка из-за которой и стоит использовать этот проект.
#!/bin/bash
/usr/bin/certbot certonly --force-renewal --webroot -w /var/www/site/ -d site.mydomain.com -w /var/www/site2 -d site2.mydomain.com --server https://acme-v01.api.letsencrypt.org/directory > /var/log/letsencrypt/renew.log 2>&1
/usr/local/nginx/sbin/nginx -s reload
Задание anacron:
0 0 * */3 * /root/bin/certbot-renew.sh
Теперь сертификаты будут без вопросов обновляться каждые 3 месяца.
Почему 3 месяца? Читайте здесь.