Let’s Encrypt – бесплатный, автоматизированный и открытый центр сертификации, разработанный Исследовательской группой Internet Security Research Group (ISRG). Сертификаты, выданные Let’s Encrypt, действительны в течение 90 дней с даты выпуска, и сегодня им доверяют почти все браузеры.
В этой статье мы рассмотрим шаги, необходимые для установки бесплатного SSL-сертификата для шифрования SSL на сервере CentOS 7 с Apache в качестве веб-сервера. Мы будем использовать утилиту certbot для получения и обновления сертификатов Let’s Encrypt.
Предпосылки
Перед продолжением этой статьи, убедитесь, что вы выполнили следующие предварительные условия:
- Укажите имя домена, указывающий на ваш IP-адрес общего сервера. В этой статье мы будем использовать домен
andreyex.ru
. - Установленный Apache и запущен на сервере.
- Виртуальный хост Apache для своего домена.
- Открытые порты 80 и 443 в своем брандмауэре.
Установите следующие пакеты, которые необходимы для SSL-зашифрованного веб-сервера:
yum install mod_ssl openssl
Установка Certbot
Certbot – это инструмент, упрощающий процесс получения SSL-сертификатов от Let’s Encrypt и автоматического включения HTTPS на вашем сервере.
Пакет certbot предоставляется EPEL. Если репозиторий EPEL не установлен в вашей системе, вы можете установить его, используя следующую команду:
sudo yum install epel-release
После того, как репозиторий EPEL включен, установите пакет certbot, введя:
sudo yum install certbot
Создание Dh (Диффи-Хеллман)
Обмен ключами Diffie-Hellman (DH) – это метод безопасного обмена криптографическими ключами по необеспеченному каналу связи. Создайте новый набор параметров 2048 бит DH для усиления безопасности:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Вы можете изменить размер до 4096 бит, но в этом случае генерация может занять более 30 минут в зависимости от энтропии системы.
Получение сертификата SSL для шифрования
Чтобы получить сертификат SSL для нашего домена, мы собираемся использовать плагин Apache, который работает, создавая временный файл для запрашиваемого домена в каталоге,${webroot-path}/.well-known/acme-challenge
, а сервер проверки подлинности Let’s Encrypt делает HTTP-запросы для проверки DNS для запрашиваемого домена разрешение на сервер, на котором выполняется certbot.
Чтобы сделать его более простым, мы собираем все HTTP-запросы для .well-known/acme-challenge
в одном каталоге /var/lib/letsencrypt
. Следующие команды создадут каталог и сделают его доступным для записи на сервере Apache.
Следующие команды создадут каталог и сделают его доступным для записи на сервере Apache.
mkdir -p /var/lib/letsencrypt/.well-known chgrp apache /var/lib/letsencrypt chmod g+s /var/lib/letsencrypt
Чтобы избежать дублирования кода, создайте следующие два фрагмента конфигурации:
Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/" <Directory "/var/lib/letsencrypt/"> AllowOverride None Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory>
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Требует Apache >= 2.4 SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" # Требует Apache >= 2.4.11 SSLSessionTickets Off
В приведенном выше фрагменте используются чипперы, рекомендованные Cipherli.st, позволяющие сшивание OCSP, строгая транспортная безопасность HTTP (HSTS) и использование нескольких HTTP-заголовков, ориентированных на безопасность.
Перезагрузите конфигурацию Apache, чтобы изменения вступили в силу:
sudo systemctl reload httpd
Теперь мы можем запустить средство Certbot с помощью плагина webroot и получить файлы SSL сертификатов, набрав:
sudo certbot certonly --agree-tos --email admin@andreyex.ru --webroot -w /var/lib/letsencrypt/ -d andreyex.ru -d www.andreyex.ru
Если сертификат SSL будет успешно получен, certbot напечатает следующее сообщение:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/andreyex.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/andreyex.ru/privkey.pem Your cert will expire on 2018-12-07. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
CentOS 7 поставляется с Apache версии 2.4.6, которая не включает директиву SSLOpenSSLConfCmd
. Эта директива доступна только на Apache позже 2.4.8 и используется для настройки параметров OpenSSL, таких как обмен ключами Diffie-Hellman (DH).
Нам нужно будет создать новый комбинированный файл, используя SSL-сертификат Let’s Encrypt и созданный файл DH. Для этого введите:
cat /etc/letsencrypt/live/andreyex.ru/cert.pem /etc/ssl/certs/dhparam.pem >/etc/letsencrypt/live/andreyex.ru/cert.dh.pem
Теперь, когда все настроено, отредактируйте конфигурацию виртуального хоста домена следующим образом:
<VirtualHost *:80> ServerName andreyex.ru ServerAlias www.andreyex.ru Redirect permanent / https://andreyex.ru/ </VirtualHost> <VirtualHost *:443> ServerName andreyex.ru ServerAlias www.andreyex.ru <If "%{HTTP_HOST} == 'www.andreyex.ru'"> Redirect permanent / https://andreyex.ru/ </If> DocumentRoot /var/www/andreyex.ru/public_html ErrorLog /var/log/httpd/andreyex.ru-error.log CustomLog /var/log/httpd/andreyex.ru-access.log combined SSLEngine On SSLCertificateFile /etc/letsencrypt/live/andreyex.ru/cert.dh.pem SSLCertificateKeyFile /etc/letsencrypt/live/andreyex.ru/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/andreyex.ru/chain.pem # Остальные конфигурации Apache </VirtualHost>
С приведенной выше конфигурацией мы устанавливаем HTTPS и перенаправляем с www на не-www-версию. Не стесняйтесь настраивать конфигурацию в соответствии с вашими потребностями.
Перезапустите службу Apache, чтобы изменения вступили в силу:
sudo systemctl restart httpd
Теперь вы можете открыть свой веб-сайт, https://
и вы заметите значок зеленого замка.
Если вы протестируете свой домен с помощью теста SSL Labs Server, вы получите оценку A +, как показано ниже:
Автоматическое обновление Шифрование SSL-сертификата
Сертификаты Encrypt действительны в течение 90 дней. Чтобы автоматически продлить срок действия сертификатов до истечения срока их действия, мы создадим cronjob, который будет работать два раза в день и автоматически обновит сертификат за 30 дней до истечения срока его действия.
Запустите команду crontab
для создания нового cronjob, который обновит сертификат, создаст новый комбинированный файл, включая ключ DH, и перезапустит apache:
sudo crontab -e
0 */12 * * * certbot renew --cert-name andreyex.ru --renew-hook "cat /etc/letsencrypt/live/andreyex.ru/cert.pem /etc/ssl/certs/dhparam.pem >/etc/letsencrypt/live/andreyex.ru/cert.dh.pem && systemctl restart httpd"
Чтобы протестировать процесс обновления, вы можете использовать переключатель --dry-run
в certbot:
sudo certbot renew --cert-name andreyex.ru --dry-run
Если ошибок нет, это означает, что процесс обновления был успешным.
Вывод
В этой статье вы использовали клиент Let’s Encrypt, certbot для загрузки сертификатов SSL для вашего домена. Вы также создали фрагменты Apache, чтобы избежать дублирования кода и настроите Apache для использования сертификатов. В конце статьи вы создали cronjob для автоматического обновления сертификата.