Введение
Let’s Encrypt - это новый центр сертификации, который легко позволяет получить и установить бесплатный TLS/SSL сертификат, обеспечивая тем самым, шифрование HTTPS на веб-серверах. Безусловно, этот процесс упрощается с помощью такого программного обеспечения как Let’s Encrypt client, который пытается автоматизировать большинство (а то и все) необходимые действия. В связи с тем, что на данный момент Let’s Encrypt всё ещё находится в стадии разработки, весь процесс получения и установки сертификата полностью автоматизирован только на веб-серверах Apache. Не смотря на это, Let’s Encrypt можно использовать для того, чтобы легко получить бесплатный SSL сертификат, который, независимо от выбора программного обеспечения веб-сервера, можно установить вручную.
В этом уроке мы покажем вам, как использовать Let’s Encrypt для того, чтобы получить бесплатный SSL сертификат и использовать его с Nginx на Ubuntu 14.04. Также мы покажем вам, как автоматически продлевать SSL сертификат. Если вы используете другой веб-сервер, просто следуйте документации вашего веб-сервера, чтобы узнать, как использовать сертификат с вашей установкой.
Требования
Перед выполнением этого урока, вам понадобится несколько вещей.
Вам потребуется сервер на Ubuntu 14.04. с обычной учётной записью и привилегиями (sudo). Как настроить такую учётную запись, вы можете узнать выполнив шаги 1-3 в нашем уроке по настройке сервера для Ubuntu 14.04.
Вы должны владеть или иметь доступ к управлению зарегистрированным доменным именем, для которого хотите использовать сертификат. Если же у вас всё ещё нет зарегистрированного домена, вы можете зарегистрировать его с одним из многих регистраторов доменных имен (например, Namecheap, GoDaddy и т.д.).
Если вы все еще это не сделали, не забудьте создать А запись, которая направляет ваш домен к IP-адресу вашего сервера. Это необходимо, так как Let's Encrypt проверяет, что вы являетесь владельцем домена для которого выдает сертификат. Например, если вы хотите получить сертификат для example.com, этот домен должен работать с вашего сервера для проверки процесса работы. Наша установка будет использовать example.com и www.example.com в качестве доменных имен, так как требуются обе DNS-записи.
Если вы отвечаете всем требованиям давайте перейдем к установке Let's Encrypt client.
Шаг 1. Установка Let's Encrypt Client
Первый шаг к использованию Let's Encrypt это получить SSL сертификат для того чтобы установить программное обеспечение letsencrypt на вашем сервере. На данный момент, лучшим способом установить Let's Encrypt является просто копирование его из официального хранилища GitHub. В будущем, скорее всего он будет доступен через менеджер пакетов.
Установка Git и bc
Давайте сейчас установим Git и bc, чтобы мы могли скопировать хранилище Let's Encrypt.
Обновите ваш серверный менеджер пакетов с помощью следующей команды:
$ sudo apt-get update
Затем установите пакеты git и bc с помощью apt-get:
$ sudo apt-get -y install git bc
Установив git и bc, мы сможем легко загрузить letsencrypt копируя хранилище из GitHub.
Копирование Let's Encrypt
Теперь мы можем скопировать хранилище Let's Encrypt в /opt этой командой:
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Теперь вы должны иметь копию хранилища letsencrypt в директории /opt/letsencrypt.
Шаг 2. Приобретение сертификата
Let's Encrypt предоставляет множество способов получить SSL сертификаты, с помощью различных плагинов. В отличие от плагина Apache, который описан в другом руководстве, большинство плагинов только помогут вам получить сертификат, который необходимо вручную настроить для использования на вашем веб-сервере. Плагины, которые только приобретают сертификаты, но не устанавливают их, упоминаются как "аутентификаторы", так как они используются для проверки подлинности будет ли сертификат выдан на сервер.
Мы покажем вам, как использовать плагин Webroot, чтобы получить SSL сертификат.
Как использовать плагин Webroot
Плагин Webroot работает при помещении специального файла в каталог /.well-known в пределах корневой директории, который может быть открыт (через веб-сервер) службой проверки Let's Encrypt. В зависимости от конфигурации, вам может понадобиться разрешить доступ к каталогу /.well-known.
Если вы еще не установили Nginx, сделайте это с помощью следующей команды:
$ sudo apt-get install nginx
Для того, чтобы убедиться, что каталог доступен для проверки Let's Encrypt, давайте быстро сделаем изменения в нашей Nginx конфигурации. По умолчанию он находится в /etc/nginx/sites-available/default. Для его редактирования мы используем nano:
$ sudo nano /etc/nginx/sites-available/default
Внутри серверного блока добавьте этот блок локации:
location ~ /.well-known {
allow all;
}
Вы также захотите посмотреть с помощью чего установлен ваш корневой документ используя поиск директории root, поскольку путь требуется для использования плагина Webroot. Если вы используете дефолтный конфигурационный файл, корень будет /usr/share/nginx/html.
Сохраните и выйдите.
Перезагрузите Nginx с помощью этой команды:
$ sudo service nginx reload
Теперь, когда мы знаем наш webroot-path, мы можем использовать плагин Webroot, чтобы запросить SSL сертификат с этими командами. Здесь мы также указываем свои доменные имена с опцией -d. Если вы хотите один сертификат для работы с несколькими доменными именами (например, example.com и www.example.com), не забудьте все их добавить. Кроме того, убедитесь, что вы заменяете выделенные части соответствующим путем webroot и доменными именами:
$ cd /opt/letsencrypt
$ ./letsencrypt-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com
Примечание: Программное обеспечения Let's Encrypt требует привилегий суперпользователя, так что вам будет необходимо ввести свой пароль, если в последнее время вы не использовали sudo.
После того, как letsencrypt установится, Вам будет предложено ввести кое-какую информацию. Точные запросы могут варьироваться в зависимости от того, использовали ли вы Let's Encrypt раньше, но мы покажем вам пример для первого раза.
В командной строке введите адрес электронной почты, который будет использоваться для уведомлений и восстановление потерянных ключей:
Далее вы должны согласится с Договором Подписчика. Нажмите Agree:
Если все прошло успешно, вы должны увидеть вывод сообщения, которое выглядит примерно так:
Output:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to [email protected]
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Вы захотите отметить путь и дату истечения срока действия вашего сертификата, которые были выделены в примере вывода.
Примечание Firewall: Если вы получаете сообщение об ошибке типа Не удалось подключиться к хосту для DVSNI задачи, firewall вашего сервера может потребоваться настроить так, чтобы разрешить TCP трафик через порты 80 и 443.
Примечание: Если ваш домен направлен через службу DNS, такую как CloudFlare, вам нужно будет временно отключить её, пока вы не получили сертификат.
Файлы сертификата
После получения сертификата, вы будете иметь следующие файлы в PEM-кодировке:
-
cert.pem: Сертификат вашего домена
-
chain.pem: Цепочка Let's Encrypt сертификатов
-
fullchain.pem: Скомбинированные cert.pem и chain.pem
-
privkey.pem: Закрытый ключ вашего сертификате
Важно чтоб вы знали о местонахождении файлов сертификата, которые только что были созданы, так как вы можете использовать их в конфигурации веб-сервера. Сами файлы помещаются в подкаталог /etc/letsencrypt/archive. Тем не менее, Let's Encrypt создает символические ссылки на самые последние файлы сертификатов в каталоге /etc/letsencrypt/live/your_domain_name. Поскольку ссылки всегда будут указывать на самые последние файлы сертификатов, то это тот путь, который вы должны использовать, чтобы обратиться к файлам сертификатов.
Вы можете проверить, существуют ли файлы , выполнив эту команду (замена в доменном имени):
$ sudo ls -l /etc/letsencrypt/live/your_domain_name
Выводом должны быть четыре упомянутые выше файлы сертификатов. В данный момент, вы будете настраивать веб-сервер, чтобы использовать fullchain.pem как файл сертификата и privkey.pem как файл ключа сертификата.
Генерируем сильные группы Диффи-Хеллмана
В целях дальнейшего повышения уровня безопасности, вы должны также сформировать сильную группу Диффи-Хеллмана. Чтобы сгенерировать 2048-битный группу, используйте следующую команду:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Это может занять несколько минут, но когда будет сделано вы будете иметь сильную группу DH в /etc/ssl/certs/dhparam.pem.
Шаг 3. Настройка TLS/SSL на веб-сервере (Nginx)
Теперь, когда у вас есть SSL сертификат, необходимо настроить веб-сервер Nginx, чтобы использовать его.
Измените настройки Nginx, которые содержит ваш блок сервера. Опять же, это находится в /etc/nginx/sites-available/default по умолчанию:
$ sudo nano /etc/nginx/sites-available/default
Найдите блок сервера. Закомментируйте или удалите строки, предназначенные для настройки этого блока сервера прослушивать порт 80. В конфигурации по умолчанию, эти две линии должны быть удалены:
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
Вместо этого мы собираемся настроить этот блок сервера прослушивать порт 443 с включенным SSL. В блоке server {, добавьте следующие строки, но замените все экземпляры example.com вашим собственным доменом:
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Это позволяет вашему серверу использовать SSL, и говорит ему использовать Let's Encrypt SSL сертификат, полученный нами ранее.
Чтобы разрешить только самые безопасные SSL протоколы и шифры, а также использовать сильную группу Диффи-Хелмана, что мы сгенерировали, добавьте следующие строки в том же блоке сервера:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
И, наконец, за пределами исходного блока сервера (который прослушивает HTTPS, порт 443), добавьте этот блок сервера для перенаправления HTTP (порт 80) на HTTPS. Обязательно замените выделенную часть вашим собственным доменным именем:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Сохраните и выйдите.
Чтоб изменения вошли в силу, перегрузите Nginx:
$ sudo service nginx reload
Сертификат Let's Encrypt TLS/SSL теперь на месте. На данном этапе, вы должны проверить, что TLS/SSL-сертификат работает, посетив ваш домен через HTTPS в веб-браузере.
Вы можете использовать отчет Qualys SSL Labs, чтобы увидеть оценки конфигурации вашего сервера:
В веб-браузере:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
эта установка SSL должна выдавать рейтинг A+.
Шаг 4. Настройка автопродления
Сертификат Let’s Encrypt действителен 90 дней, но рекомендуется продлевать срок действия сертификатов каждые 60 дней, чтобы обеспечить предел погрешности. На момент написания этой статьи, автоматическое обновление до сих пор не доступно как особенность самого клиента, но вы можете вручную обновить свои сертификаты, запустив клиент Let’s Encrypt с опцией renew.
Чтобы запустить процесс обновления для всех установленных доменов, выполните следующую команду:
$ /opt/letsencrypt/letsencrypt-auto renew
Так как мы недавно установили сертификат, то команда будет проверять только дату истечения срока действия и выдаст сообщение, уведомляющее о том, что сертификат еще продлевать не надо. Результат должен выглядеть примерно следующим образом:
Output:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Обратите внимание, что если вы создали сертификат в комплекте с несколькими доменами, только базовое имя домена будет показано на выходе, но обновление должно быть действительным для всех доменов, включенных в этот сертификат.
Практический способ убедиться, что ваши сертификаты не будут устаревать, - это создать cron задачу, которая будет периодически выполнять автоматическую команду продления для вас. Поскольку обновление сначала проверяет на дату истечения срока действия и только выполняет обновление сертификата менее чем за 30 дней от истечения срока действия, безопасно создать cron задачу, которая работает каждую неделю или даже каждый день, например.
Давайте отредактируем crontab, чтобы создать новую задачу, которая будет выполнять команду обновление каждую неделю. Для редактирования crontab для корневого пользователя, выполните следующую команду:
$ sudo crontab -e
Добавьте следующие строки:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload
Сохраните и выйдите. Это создаст новую cron задачу, которая будет выполнять letsencrypt-auto renew команду каждый понедельник в 2:30 утра, и перезагружать Nginx в 2:35 утра (поэтому обновленный сертификат будет использоваться). Вывод, генерируемый командой будет поступать в лог-файл, расположенный в /var/log/le-renewal.log.
Шаг 5. Обновление Let’s Encrypt клиента (не обязательно)
Каждый раз, когда будут доступны новые обновления для клиента, вы можете обновить локальную копию, запустив git pull изнутри каталога Let’s Encrypt:
$ cd /opt/letsencrypt
$ sudo git pull
Это позволит загрузить все последние изменения в хранилище, обновив ваш клиент.
Заключение
На этом все! Ваш веб-сервер теперь использует бесплатный Let's Encrypt TLS/SSL сертификат для безопасного обслуживания контента по протоколу HTTPS.