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

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


ssl

Розбіжності

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

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

Наступна ревізія
Попередня ревізія
ssl [2016/02/18 14:37]
wombat створено
ssl [2016/12/03 22:51]
wombat Переход на certbot
Рядок 1: Рядок 1:
 ====== Let's Encrypt! ====== ====== Let's Encrypt! ======
 +
 +https://​letsencrypt.readthedocs.org/​en/​latest/​index.html
 +
 +https://​certbot.eff.org/​
  
 ===== Установка ===== ===== Установка =====
  
-  sudo apt-get install ​python-pip python3-pip+  sudo apt-get install ​certbot
  
  
 ===== Запрос сертификата ===== ===== Запрос сертификата =====
  
-Перед любым запросом сертификата ​этой ​программой, нужно остановить все службы,​ использующие порты 80 и 443, так как эти порты будут использованы для запроса сертификата.+Сертификат выдаётся только управляющему доменом. Поэтому для того, чтобы его получить,​ нужно как-то ​подтвердить, что вы управляете указанным доменом. 
 + 
 +Существуют ​разные способы подтверждения управления доменом. Например,​ при выборе способа "''​standalone''"​ будет запущен встроенный веб-сервер. В этом случае перед запросом сертификата ​нужно остановить все службы,​ использующие порты 80 и 443, так как эти порты будут использованы для запроса сертификата:
  
   sudo /​etc/​init.d/​lighttpd stop   sudo /​etc/​init.d/​lighttpd stop
   sudo /​etc/​init.d/​sslh stop   sudo /​etc/​init.d/​sslh stop
  
-  ​./letsencrypt-auto+Если используется способ "''​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/<​имя_домена>''​. После получения сертификата по умолчанию он будет сохранён в ''/​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/<​имя_домена>/​cert.pem /​etc/​letsencrypt/​live/<​имя_домена>/​privkey.pem > /​etc/​ssl/<​имя_домена>​.pem+  # cat /​etc/​letsencrypt/​live/<​имя_домена>/​fullchain.pem /​etc/​letsencrypt/​live/<​имя_домена>/​privkey.pem > /etc/ssl/private/<​имя_домена>​.pem
  
 Необходимо обеспечить доступ программам из группы ''​ssl-cert''​ к этим файлам. В эту группу будут входить все программы,​ которые должны иметь возможность считывать сертификат. Если такой группы ещё нет, то её нужно создать:​ Необходимо обеспечить доступ программам из группы ''​ssl-cert''​ к этим файлам. В эту группу будут входить все программы,​ которые должны иметь возможность считывать сертификат. Если такой группы ещё нет, то её нужно создать:​
Рядок 27: Рядок 53:
   sudo usermod -a -G ssl-cert prosody   sudo usermod -a -G ssl-cert prosody
  
-  sudo chown root:​ssl-cert /​etc/​ssl/​certs/​ +  sudo chown -R root:​ssl-cert /​etc/​ssl/​certs/​ 
-  sudo chown root:​ssl-cert /etc/ssl/certs/<​имя_домена>​.pem +  sudo chown -R root:​ssl-cert /etc/ssl/private
-  sudo chmod 750 /​etc/​ssl/​certs +  sudo chmod -R 644 /​etc/​ssl/​certs/ 
-  sudo chmod 750 /​etc/​ssl/​certs/​<​имя_домена>​.pem +  sudo chmod -R 755 /​etc/​ssl/​certs/​ 
-  sudo chown root:ssl-cert /etc/letsencrypt/live+  sudo chmod 640 -/etc/ssl/private
-  sudo chmod 750 /etc/letsencrypt/live/+  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/​lighttpd stop
   sudo /​etc/​init.d/​sslh stop   sudo /​etc/​init.d/​sslh stop
  
 +  $ sudo certbot renew --standalone
  
-  ./​letsencrypt-auto renew -nvv --standalone +После обновления можно записать новый сертификат и ключ в системные файлы, как это описано выше, после чего снова зпустить наши службы:​
- +
-  # cat /​etc/​letsencrypt/​live/<​имя_домена>/​cert.pem /​etc/​letsencrypt/​live/<​имя_домена>/​privkey.pem > /​etc/​ssl/<​имя_домена>.pem+
  
   sudo /​etc/​init.d/​sslh start   sudo /​etc/​init.d/​sslh start
   sudo /​etc/​init.d/​lighttpd start   sudo /​etc/​init.d/​lighttpd start
-  sudo /​etc/​init.d/​prosody ​reload+  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 22:51 by wombat