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

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


ssl

Розбіжності

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

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

Both sides previous revision Попередня ревізія
Наступна ревізія
Попередня ревізія
ssl [2016/02/18 14:37]
wombat letsencrypt link
ssl [2016/12/03 22:51]
wombat Переход на certbot
Рядок 2: Рядок 2:
  
 https://​letsencrypt.readthedocs.org/​en/​latest/​index.html 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''​ к этим файлам. В эту группу будут входить все программы,​ которые должны иметь возможность считывать сертификат. Если такой группы ещё нет, то её нужно создать:​
Рядок 29: Рядок 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