Lets Encrypt: разбор

http://it.icmp.ru/postimages/1181/7648/full/Setup-HTTPS-with-Lets-Encrypt-on-Nginx.png


Разберем как выписывать сертификаты 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 месяца? Читайте здесь.
  • просмотров: ~733
  • рейтинг: ?

Комментарии (0)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)