Користувальницькькі налаштування

Налаштування сайту


ssl

Let's Encrypt!

Установка

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

"/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):

  • –pre-hook – выполняет команду (или bash-скрипт со списком команд) перед попыткой обновить сертификат. Независимо от того, устарел сертификат или нет. Как раз подходит для режима подтверждения управления доменом при помощи встроенного веб-сервера (“standalone”), ведь перед запросом обновления сертификата нужно остановить все службы, связанные с портами 80 и 443.
  • –renew-hook – выполняет команду (или bash-скрипт) только в случае, когда истёк срок действия сертификата, и certbot получил новый сертификат. При этом перед выполнением указанной нами команды или скрипта certbot устанавливает переменные среды $RENEWED_LINEAGE (содержит путь к каталогу, куда помещены обновлённые файлы сертификата и ключа) и $RENEWED_DOMAINS (содержит список доменов, для которых получен новый сертификат, разделённых пробелами). Эта команда будет выполнена для каждого обновлённого сертификата в отдельности. Это удобный способ автоматически скопировать все новые сертификаты в системные папки, если нужно.
  • –post-hook – выполняет команду (или bash-скрипт) после попытки обновления сертификата. То есть вне зависимости от того, был ли получен новый сертификат, или срок действия старого ещё не истёк. Это самое подходящее для запуска остановленных ранее программ.

Если для запроса обновления используется задание 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-скрипты с командами, которые нужно выполнять в соответствующих ситуациях.

ssl.txt · В останнє змінено: 2016/12/03 22:51 by wombat