| Порівняння попередніх версійПопередня ревізія | |
| ssl [2016/05/15 20:39] – [Обновление сертификата] webroot wombat | ssl [2016/12/03 20:51] (поточний) – Переход на certbot wombat |
|---|
| |
| 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'' к этим файлам. В эту группу будут входить все программы, которые должны иметь возможность считывать сертификат. Если такой группы ещё нет, то её нужно создать: |
| 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 -R /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> |
| | |
| | Но можно запустить проверку и вручную. |
| | |
| | |
| |
| ==== Без остановки веб-сервера ==== | ==== Без остановки веб-сервера ==== |
| |
| # ./certbot-auto renew -nv --webroot | $ sudo certbot renew |
| # mv /etc/ssl/certs/<имя_домена>.pem /etc/ssl/certs/<имя_домена>.pem.bak | |
| # cat /etc/letsencrypt/live/<имя_домена>/cert.pem /etc/letsencrypt/live/<имя_домена>/privkey.pem > /etc/ssl/<имя_домена>.pem | Если обновление сертификата произошло, можно записать новый сертификат и ключ в системные файлы, как это описано выше. |
| # /etc/init.d/lighttpd reload | |
| # /etc/init.d/prosody restart | |
| | |
| |
| ==== Через встроенный веб-сервер ==== | ==== Через встроенный веб-сервер ==== |
| 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-скрипты с командами, которые нужно выполнять в соответствующих ситуациях. |
| |