Потребовалось установить бесплатный SSL-сертификат от Let’s Encrypt на сервер с CentOS 7 и с Apache в качестве веб-сервера. Проще всего сделать это с помощью Certbot — написанного на python плагина, который позволяет получить и регулярно обновлять SSL сертификат для домена, поскольку выданные Let’s Encrypt сертификаты действительны только 90 дней с момента генерации.
В сети находится много инструкций для получения сертификатов, однако большая часть их требуют создания дополнительных проверочных директорий и разрешений, нам такое не годится. Мне кажется, что проще на несколько секунд глубокой ночью остановить web сервер, выполнить скрипт и получить SSL сертификат; и затем уж стартануть с новыми силами.
Впрочем, не будем растягивать инструкцию, мне за символы тут никто не платит… Приступаем!
Если у вас в CentOS уже установлен репозиторий от epel, то этот пункт можно пропустить. Проверить, установлен ли у вас epel можно так:
# установлен ли у вас epel ? yum repolist | grep epel * epel: mirror.freethought-internet.co.uk epel/x86_64 Extra Packages for Enterprise Linux 7 - x86 |
Иначе действуем так:
# Подключаем epel release: yum install -y epel-release |
Следующий ход — устанавливаем плагин certbot для apache:
# устанавливаем плагин certbot для apache: yum install -y certbot python2-certbot-apache |
Генерируем (выпускаем) сертификат:
# Сначала останавливаем на время генерации наш web-сервер: service httpd stop # Генерируем (выпускаем) сертификат. certbot certonly --standalone --agree-tos --email NAME@YOURMAIL.ru -d YOUR_DOMAIN.ru # Стартуем web-сервер: service httpd start |
В момент генерации мы получили следующий текст:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/YOUR_DOMAIN.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/YOUR_DOMAIN.ru/privkey.pem Your cert will expire on 2019-11-10. 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"
Видим наш сертификат, который нужно еще добавить в конфиг вашего домена YOUR_DOMAIN.ru. Создаем файл с конфигом в директории /etc/httpd/conf.d/. Пример конфига ниже:
<IfModule mod_ssl.c> SSLStaplingCache shmcb:/tmp/stapling_cache(128000) <VirtualHost *:443> #SSL SSLEngine On SSLCertificateFile /etc/letsencrypt/live/YOUR_DOMAIN.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/YOUR_DOMAIN.ru/privkey.pem # SSL stapling SSLUseStapling on # Intermediate configuration, tweak to your needs SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite 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 SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire ServerAdmin support@YOUR_DOMAIN.ru ServerName YOUR_DOMAIN.ru DocumentRoot /home/diman/YOUR_DOMAIN.ru/public RewriteEngine off <Directory /home/diman/YOUR_DOMAIN.ru> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L] Options -Indexes +FollowSymLinks +MultiViews AllowOverride All Require ip 9.9.9.9 Require all granted </Directory> ErrorLog /var/log/httpd/YOUR_DOMAIN.ru.error.log CustomLog /var/log/httpd/YOUR_DOMAIN.ru.access.log combined </VirtualHost> </IfModule> |
Конечно же, нужно не забыть и разрешить 443 порт в firewall.
Теперь перезапускаем apache и, если все нормально, то делаем редирект из http в https:
# Останавливаем web-сервер: service httpd stop # Стартуем web-сервер: service httpd start # Для редиректа из http -> https ддобавляем в конфиг http: <If "%{HTTP_HOST} == 'YOUR_DOMAIN.ru'"> Redirect permanent / https://YOUR_DOMAIN.ru/ </If> # И снова рестартим web-сервер.. |
Для продления SSL сертификата требуется регулярно, не менее 1 раза в 90 суток выполнять скрипт, который будет обновлять все сертификаты. Мы будем пытаться обновить его каждое воскресенье в 3:55. Для этого добавим в крон задание:
crontab -e 55 03 * 1,3,5,7,9,11 6 /usr/sbin/service httpd stop; /usr/bin/certbot renew; /usr/sbin/service httpd start |