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

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


ssl

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Both sides previous revision Попередня ревізія
ssl [2016/05/15 20:39]
wombat [Обновление сертификата] webroot
ssl [2016/12/03 20:51] (поточний)
wombat Переход на certbot
Рядок 1: Рядок 1:
 +====== 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, которое будет выполнять проверку необходимости обновления сертификата,​ и обновлять его, когда истечёт срок его действия. Задание это выглядит так:
 +
 +<file bash "/​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
 +</​file>​
 +
 +Но можно запустить проверку и вручную.
 +
 +
 +
 +==== Без остановки веб-сервера ====
 +
 +  $ 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'',​ то можно дописать эти параметры в команду в соответствующем файле:
 +
 +<file bash "/​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
 +</​file>​
 +
 +Где файлы ''/​var/​lib/​stop-services.sh'',​ ''/​var/​lib/​certbot-renew.sh''​ и ''/​var/​lib/​stop-services.sh''​ -- bash-скрипты с командами,​ которые нужно выполнять в соответствующих ситуациях.
  
ssl.txt · В останнє змінено: 2016/12/03 20:51 by wombat