ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Суббота, 14 декабря, 2024

Как установить сертификат SSL и SPDY на Ubuntu с помощью «Let’s Encrypt»

Можно спросить, «Почему мы должны делать это вообще?» Хороший вопрос!

  1. Все пароли и данные кредитных карт, введенные пользователями на ваших сайтах могут быть подвержены третьей стороной, поэтому было бы целесообразно зашифровать соединение с использованием SSL-сертификата.
  2. В настоящее время это хорошая практика, использовать (быстрый) протокол 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

Его авторами являются известные компании, так что вы можете доверять ему:

Спонсоры сертификата Let’s Encrypt

Другими словами, вы получаете бесплатно SSL-сертификат, который стоил сотни долларов ранее. Даже лучше, вы можете настроить все, чтобы автоматически обновлять сертификат!

Предпосылки

В этом руководстве у вас уже есть:

Данная статья рассказывает, как получить сертификат без остановки 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 к корню сайта.

При условии, что:

… Волшебное заклинание, чтобы получить сертификат 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

 

Обратите внимание, что это сообщение содержит путь, где ваши сертификаты хранятся и дата окончания срока действия сертификата.

Если операция не была успешной, читайте сообщения об ошибках тщательно и устраните проблемы. Вот те, с которыми я столкнулся:

Файлы сертификатов

После получения сертификата, вы будете иметь следующие 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!

Как установить сертификат SSL и SPDY на Ubuntu Nginx с помощью «Let’s Encrypt»

Exit mobile version