Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Наступна ревізія | Попередня ревізія | ||
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 -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> | ||
+ | |||
+ | Но можно запустить проверку и вручную. | ||
+ | |||
+ | |||
+ | |||
+ | ==== Без остановки веб-сервера ==== | ||
+ | |||
+ | $ 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-скрипты с командами, которые нужно выполнять в соответствующих ситуациях. | ||