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). Поэтому
/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
Для автоматизации выполнения подготовки к обновлению сертификата и каких-либо действий после его обновления, служат параметры2):
–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-скрипты с командами, которые нужно выполнять в соответствующих ситуациях.