Зміст

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”, то останавливать программы не нужно, но нужно указать корневой каталог, используемый вашим веб-сервером для указанного домена.

Тогда запрос сертификата может выглядеть, например, так1):

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). Поэтому

Для этого можно, например, создать группу “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, которое будет выполнять проверку необходимости обновления сертификата, и обновлять его, когда истечёт срок его действия. Задание это выглядит так:

"/etc/cron.d/certbot"
# 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

Перед и после обновления

Для автоматизации выполнения подготовки к обновлению сертификата и каких-либо действий после его обновления, служат параметры2):

Если для запроса обновления используется задание cron, то можно дописать эти параметры в команду в соответствующем файле:

"/etc/cron.d/certbot"
# 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-скрипты с командами, которые нужно выполнять в соответствующих ситуациях.