====== Let's Encrypt! ====== https://letsencrypt.readthedocs.org/en/latest/index.html https://certbot.eff.org/ ===== Установка ===== sudo apt-get install certbot ===== Запрос сертификата ===== Сертификат выдаётся только управляющему доменом. Поэтому для того, чтобы его получить, нужно как-то подтвердить, что вы управляете указанным доменом. Существуют разные способы подтверждения управления доменом. Например, при выборе способа "''standalone''" будет запущен встроенный веб-сервер. В этом случае перед запросом сертификата нужно остановить все службы, использующие порты 80 и 443, так как эти порты будут использованы для запроса сертификата: sudo /etc/init.d/lighttpd stop sudo /etc/init.d/sslh stop Если используется способ "''webroot''", то останавливать программы не нужно, но нужно указать корневой каталог, используемый вашим веб-сервером для указанного домена. Тогда запрос сертификата может выглядеть, например, так((https://certbot.eff.org/#debianjessie-other)): certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is Эта команда запросит единый сертификат для доменов "example.com" и "www.example.com", для которых ваш вебсервер использует корневой каталог "/var/www/example", а также доменов "thing.is" и "m.thing.is", для которых корневой каталог "/var/www/thing". После получения сертификата по умолчанию он будет сохранён в ''/etc/letsencrypt/archive/<имя_домена>'' с символической ссылкой на последний сертификат в ''/etc/letsencrypt/live/<имя_домена>''. Затем можно скопировать эти сертификаты в какое-нибудь стандартное системное расположение. Например, cat /etc/letsencrypt/live/example.com/fullchain.pem > /etc/ssl/certs/example.com.cert cat /etc/letsencrypt/live/example.com/privkey.pem > /etc/ssl/private/example.com.key Обратите внимание, что сертификат "''example.com.cert''" - вещь публичная. Веб-сервер передаёт её браузеру клиента, который подключается к вашему сайту для того, чтобы тот смог проверить, действительно ли ваш сервер тот, за кого себя выдаёт. Поэтому этот файл доступен для чтения всем программам и пользователям без ограничений. Что же касается ключа "''example.com.key''", то он **секретен**! Он не должен быть доступен никому, кроме вашего веб-сервера (или других программ, использующих SSL). Поэтому * во-первых, его нельзя располагать в том же каталоге, где и публичные файлы, * а во-вторых, его каталог "''/etc/ssl/private''/" должен быть доступен для чтения только узкой группе пользователей или программ. Для этого можно, например, создать группу "''ssl-cert''", сделать её владельцем каталога "''/etc/ssl/private/''" и добавлять в эту группу только те программы, которые должны в своей работе использовать SSL (например, веб-сервер, FTP-сервер, XMPP-сервер). Некоторые программы требуют, чтобы сертификат и секретный ключ к нему хранились в одном файле. Для этого на основе полученного сертифиата и ключа нужно создать единый файл, содержащий их вместе: # cat /etc/letsencrypt/live/<имя_домена>/fullchain.pem /etc/letsencrypt/live/<имя_домена>/privkey.pem > /etc/ssl/private/<имя_домена>.pem Необходимо обеспечить доступ программам из группы ''ssl-cert'' к этим файлам. В эту группу будут входить все программы, которые должны иметь возможность считывать сертификат. Если такой группы ещё нет, то её нужно создать: sudo groupadd ssl-cert sudo usermod -a -G ssl-cert www-data sudo usermod -a -G ssl-cert prosody sudo chown -R root:ssl-cert /etc/ssl/certs/ sudo chown -R root:ssl-cert /etc/ssl/private/ sudo chmod -R 644 /etc/ssl/certs/ sudo chmod -R 755 /etc/ssl/certs/ sudo chmod 640 -R /etc/ssl/private/ sudo chmod 750 /etc/ssl/private/ ===== Обновление сертификата ===== В современных версиях Debian GNU/Linux (например, в версии 8 "Jessie") при установке пакета certbot автоматически создаётся периодическое задание для CRON, которое будет выполнять проверку необходимости обновления сертификата, и обновлять его, когда истечёт срок его действия. Задание это выглядит так: # m h dom mon dow user command 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew Но можно запустить проверку и вручную. ==== Без остановки веб-сервера ==== $ sudo certbot renew Если обновление сертификата произошло, можно записать новый сертификат и ключ в системные файлы, как это описано выше. ==== Через встроенный веб-сервер ==== sudo /etc/init.d/lighttpd stop sudo /etc/init.d/sslh stop $ sudo certbot renew --standalone После обновления можно записать новый сертификат и ключ в системные файлы, как это описано выше, после чего снова зпустить наши службы: sudo /etc/init.d/sslh start sudo /etc/init.d/lighttpd start sudo /etc/init.d/prosody restart ==== Перед и после обновления ==== Для автоматизации выполнения подготовки к обновлению сертификата и каких-либо действий после его обновления, служат параметры((https://certbot.eff.org/docs/using.html#certbot-command-line-options)): * ''--pre-hook'' -- выполняет команду (или bash-скрипт со списком команд) **перед попыткой** обновить сертификат. Независимо от того, устарел сертификат или нет. Как раз подходит для режима подтверждения управления доменом при помощи встроенного веб-сервера ("''standalone''"), ведь перед запросом обновления сертификата нужно остановить все службы, связанные с портами 80 и 443. * ''--renew-hook'' -- выполняет команду (или bash-скрипт) только в случае, когда истёк срок действия сертификата, и //certbot// получил новый сертификат. При этом перед выполнением указанной нами команды или скрипта certbot устанавливает переменные среды ''$RENEWED_LINEAGE'' (содержит путь к каталогу, куда помещены обновлённые файлы сертификата и ключа) и ''$RENEWED_DOMAINS'' (содержит список доменов, для которых получен новый сертификат, разделённых пробелами). Эта команда будет выполнена для **каждого** обновлённого сертификата в отдельности. Это удобный способ автоматически скопировать все новые сертификаты в системные папки, если нужно. * ''--post-hook'' -- выполняет команду (или bash-скрипт) **после попытки** обновления сертификата. То есть вне зависимости от того, был ли получен новый сертификат, или срок действия старого ещё не истёк. Это самое подходящее для запуска остановленных ранее программ. Если для запроса обновления используется задание ''cron'', то можно дописать эти параметры в команду в соответствующем файле: # m h dom mon dow user command 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook /var/lib/stop-services.sh --renew-hook /var/lib/certbot-renew.sh --post-hook /var/lib/stop-services.sh Где файлы ''/var/lib/stop-services.sh'', ''/var/lib/certbot-renew.sh'' и ''/var/lib/stop-services.sh'' -- bash-скрипты с командами, которые нужно выполнять в соответствующих ситуациях.