Можно спросить, «Почему мы должны делать это вообще?» Хороший вопрос!
- Все пароли и данные кредитных карт, введенные пользователями на ваших сайтах могут быть подвержены третьей стороной, поэтому было бы целесообразно зашифровать соединение с использованием SSL-сертификата.
- В настоящее время это хорошая практика, использовать (быстрый) протокол SPDY, который является расширением протокола HTTPS и удаляет предел 6 одновременных подключений с одного браузера, который сохраняется в HTTP и HTTPS. При этом удаляются ограничения на все статические данные, такие как изображения, скрипты и стили загружаются одновременно (намного быстрее).
Теперь давайте перейдем непосредственно к «Let’s Encrypt».
Let’s Encrypt является свободным, автоматизированным, и открытым органом сертификации от Security Research Group Internet (ISRG).
Internet Security Research Group (ISRG) является общественной корпорацией. Миссия ISRG заключается в снижении финансовых, технологических и образовательных барьеров для обеспечения связи через Интернет. Подробнее на вики: Let’s Encrypt
Его авторами являются известные компании, так что вы можете доверять ему:
Другими словами, вы получаете бесплатно SSL-сертификат, который стоил сотни долларов ранее. Даже лучше, вы можете настроить все, чтобы автоматически обновлять сертификат!
Предпосылки
В этом руководстве у вас уже есть:
- у вас установлен сервер Nginx и настроен для обслуживания ваших сайтов.
- вы создали несколько виртуальных хостов example.ru, которые имеют псевдоним www.example.ru.
- все данные в конфигах Nginx перенаправляют трафик на www.example.ru с example.ru
Данная статья рассказывает, как получить сертификат без остановки Nginx и обновление скрипта и захватывает все необходимые данные из Nginx конфигов так что легче автоматизировать!
Теперь начнем установку и настройку сертификата let’s encrypt!
Шаг 1 — Установите клиент Let’s Encrypt
Первый шаг к использованию Let’s Encrypt. это получить сертификат SSL, чтобы установить программное обеспечение Let’s Encrypt на сервере. В настоящее время, лучший способ установить Let’s Encrypt, это просто клонировать его из официального репозитория GitHub. В будущем, скорее всего он будет доступен через менеджер пакетов. Смотрите нашу статью Как добавить бесплатный SSL сертификат Let’s Encrypt в WordPress
Установка Git и bc
Начнем сейчас установку Encrypt Git и bc, так что мы можем клонировать репозиторий Let’s Encrypt.
Обновление менеджера пакетов вашего сервера, а затем установить пакеты Git и bc с apt-get:
sudo apt-get update sudo apt-get -y install git bc
Клонирование Let’s Encrypt
Теперь мы можем клонировать репозиторий Let’s Encrypt в каталог /opt с помощью следующей команды:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Шаг 2 — Получение сертификата
Let’s Encrypt предоставляет множество способов получения SSL-сертификатов, с помощью различных плагинов. В отличие от плагина Apache, большинство плагинов только поможет вам получить сертификат, потом необходимо вручную настроить веб-сервер для использования. Плагины, которые только получают сертификаты, а не устанавливают, упоминаются как «authenticators», так как они используются для проверки подлинности, должен ли сервер быть выдан сертификат.
Предлагаю использовать плагин standalone. Это довольно просто:
service nginx stop /opt/letsencrypt/letsencrypt-auto certonly --standalone service nginx start
Просто следуйте инструкциям!
Вместо этого вы можете использовать плагин WebRoot для получения сертификата SSL. И мы покажем вам, как это сделать.
Как использовать плагин Webroot
Плагин Webroot работает, помещая специальный файл в каталог /.well-known в корневом каталоге документов, который может быть открыт (через веб — сервер) службой Let’s Encrypt для проверки. В зависимости от конфигурации, вам может потребоваться явным образом разрешить доступ к каталогу /.well-known. Для того, чтобы убедиться, что каталог доступен для Let’s Encrypt для проверки, давайте сделаем изменения в нашей конфигурации Nginx. Откройте его для редактирования:
sudo nano /etc/nginx/sites-enabled/example.ru
Добавьте это местоположение блока вашего активного блока сервера:
location ~ /.well-known { allow all; }
Сохраните и выйдите (Ctrl + O, Ctrl + X)
Перезагрузка Nginx:
service nginx restart
Теперь все готово, чтобы получить наш совершенно новый сертификат бесплатно SSL!
Для того, чтобы получить его, вам нужно указать свой адрес электронной почты для регистрации, а затем получить уведомления от Let’s Encrypt. Также вам потребуется директория webroot – root к корню сайта.
При условии, что:
- user@example.ru — ваш адрес электронной почты
- /var/www/example.ru/html/ — корневой путь example.ru
… Волшебное заклинание, чтобы получить сертификат SSL:
/opt/letsencrypt/letsencrypt-auto certonly \ --non-interactive --text \ --agree-tos --email user@example.ru\ --webroot --webroot-path /var/www/example.ru/html \ -d example.ru -d www.example.ru
Если все прошло успешно, вы должны увидеть сообщение вывода, который выглядит примерно так:
IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to sammy@digitalocean.com - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.ru/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
Обратите внимание, что это сообщение содержит путь, где ваши сертификаты хранятся и дата окончания срока действия сертификата.
Если операция не была успешной, читайте сообщения об ошибках тщательно и устраните проблемы. Вот те, с которыми я столкнулся:
- InsecurePlatformWarning — решение здесь https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning
- Ошибка процедуры авторизации. example.ru (HTTP-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://example.ru/.well-known/acme-challenge/ksYH5LF9O28de_1–WIRYPQnRFOs67_YQQ1da__Yoys. Решение: проверьте «местоположение» конфигурационного блока упомянутый выше, убедитесь что он работает нормально, проверка разрешений на каталог .well-known, я полагаю, ваш текущий пользователь должны иметь записываемый доступ к SSH и Nginx.
Файлы сертификатов
После получения сертификата, вы будете иметь следующие 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. Поскольку ссылки всегда будут указывать на самые последние файлы сертификатов, это тот путь, который вы должны использовать, чтобы обратиться к файлам сертификатов.
Шаг 3 — Настройка TLS / SSL на веб-сервере (Nginx)
Теперь, когда у вас есть сертификат SSL, необходимо настроить веб-сервер, чтобы использовать его.
Мы покажем, как настроить веб-сервер Nginx для использования сертификата.
Теперь вы должны изменить конфигурацию Nginx, который содержит ваш блок сервера. Так как вы настраиваете режим Nginx вы достаточно осведомлены, где найти конфигурацию вашего виртуального хоста Nginx. Итак, давайте предположим, что он находится в /etc/nginx/sites-available/example.ru. Мы будем использовать nano, чтобы изменить его:
sudo nano /etc/nginx/sites-available/example.ru
Найти блок сервера и закомментируйте или удалите строки, предназначенные для настройки этого блока сервера, где прослушивается порт 80. Что-то вроде этого:
listen 80; listen [::]:80 ipv6only=on;
Мы собираемся настроить этот блок сервера прослушивать порт 443 с SSL и SPDY.
В вашем блоке сервера добавьте следующие строки:
listen 443 ssl spdy; server_name example.ru www.example.ru; ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
Это позволяет использовать ваш сервер для использования SSL и SPDY, и говорит ему использовать SSL сертификат Let’s Encrypt, что были получены нами ранее.
Да, да, это правильно, все, что вам нужно, чтобы получить поддержку SPDY, чтобы добавить это ключевое слово в конфигурации … и установить SSL сертификат 🙂
Чтобы разрешить только самые безопасные SSL протоколы и шифры, добавьте следующие строки в том же блоке сервера:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
И, наконец, за пределами исходного блока сервера (который прослушивает HTTPS, порт 443), добавьте этот блок сервера для перенаправления HTTP (порт 80) к HTTPS. Обязательно замените выделенную часть вашим собственным доменным именем:
server { listen 80; server_name example.ru www.example.ru; return 301 https://example.ru$request_uri; }
Сохраните и выйдите (Ctrl + O, Ctrl + X).
Теперь, чтобы изменения вступили в силу, перезапустите Nginx:
sudo service nginx restart
Сертификат Let’s Encrypt TLS/SSL в настоящее время на месте.
Конфигурация Nginx выглядит следующим образом:
server { listen 80; server_name example.ru www.example.ru; return 301 https://example.ru$request_uri; } server { listen 443 ssl spdy; listen [::]:443 ipv6only=on; ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; if ($host = "www.example.ru") { return 301 https://example.ru$request_uri; } server_name example.ru www.example.ru; root /var/www/example.ru/html; location ~ /.well-known { allow all; } index index.php; # Additional rules go here. include global/wordpress.conf; }
На данный момент, вы должны проверить, что сертификат TLS / SSL работает, посетив ваш домен через HTTPS в веб-браузере.
Шаг 4 — Настройка автопродления
Сертификат Let’s Encrypt действительны в течение 90 дней, но рекомендуется продлить срок действия сертификатов каждые 60 дней. На момент написания этой статьи, автоматическое обновление до сих пор не доступно как особенность самого клиента, но вы можете вручную обновить свои сертификаты, запустив клиент Let’s Encrypt.
Практический способ убедиться, что ваши сертификаты не будут устаревать, это создать cronjob, которая будет автоматически обрабатывать процесс обновления для вас.
Для того, чтобы продлить срок действия сертификатов необходимо добавить следующее:
/opt/letsencrypt/letsencrypt-auto certonly \ --agree-tos --renew-by-default \ -a webroot —-webroot-path=/var/www/example.ru/html \ -d example.ru -d www.example.ru
Как только это получится, вам нужно будет перезагрузить службу Nginx чтобы использовать обновленный сертификат:
sudo service nginx reload
Теперь, когда мы знаем команды, которые нам необходимы для обновления нашего сертификата, мы можем автоматизировать этот процесс с помощью сценариев и задания cron.
Cценарий обновления
Напишем следующий сценарий:
#!/bin/bash le_path='/opt/letsencrypt' exp_limit=30; nginx_site_config="/etc/nginx/sites-available/$1" if [ ! -f $nginx_site_config ]; then echo "[ERROR] файл конфигурации не найден: $nginx_site_config" exit 1; fi domain=`grep -m 1 "^s*server_name" $nginx_site_config | sed 's/s+server_names+//' | sed 's/(s+.*;|;)s*$//'` site_root=`grep -m 1 "^s*root" $nginx_site_config | sed "s/^s+roots+//" | sed 's/(s+.*;|;)s*$//'` cert_file="/etc/letsencrypt/live/$domain/fullchain.pem" echo "domain: [$domain]" echo "site_root: $site_root" echo "cert_file: $cert_file" if [ ! -f $cert_file ]; then echo "[ERROR] файл сертификате не найден для домена $domain." fi exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s) datenow=$(date -d "now" +%s) days_exp=$(echo ( $exp - $datenow ) / 86400 |bc) echo "Проверка даты истечения срока для $domain..." if [ "$days_exp" -gt "$exp_limit" ] ; then echo "Сертификат в актуальном состоянии, нет необходимости обновления ($days_exp дней осталось)" exit 0; else echo "Сертификат на $домен скоро истекает. Начинается выполнение скрипта обновления..." /opt/letsencrypt/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=$site_root -d $domain echo "Reloading nginx" service nginx reload echo "Процесс обновления закончен для домена $domain" exit 0; fi
Теперь сохраните его в /usr/local/bin/letsencrypt-renew и установите атрибут выполнения:
sudo chmod +x /usr/local/bin/letsencrypt-renew
Предполагая, что конфигурация сайта хранится в /etc/nginx/sites-enabled/example.ru.conf вы можете выполнить:
sudo letsencrypt-renew example.ru.conf
Вывод:
Проверка срока годности для example.ru ... Сертификат в актуальном состоянии, нет необходимости обновления (89 дней осталось).
Далее, мы будем редактировать crontab, чтобы создать новую задачу, которая будет выполнить эту команду каждую неделю. Для редактирования crontab под корневым пользователем, выполните следующую команду:
sudo crontab -e
Включите следующее содержание, все в одной строке:
30 2 * * 1 letsencrypt-renew example.ru.conf >> /var/log/le-renewal.log
Сохраните и выйдите. Это позволит создать новый crontab, которая будет выполнять команду продления letsencrypt в каждый понедельник в 2:30 утра. Выходной сигнал, генерируемый командой будет поступать в лог-файл, расположенный в каталоге /var/log/le-renewal.log.
Вывод
Вот и все! Ваш веб-сервер теперь использует бесплатное шифрование сертификатом Let’s Encrypt TLS/SSL и надежно защищает контент HTTPS. Более того, теперь ваш сервер использует SPDY!