10 October 2024
Цю статтю можна розглядати як повноцінний посібник із прикручування SSL-сертифіката до nginx. Сам процес перетворення звичайного сервера на сервер з підтримкою HTTPS займає пару рядків у файлі конфігурації, тому щоб замітка була більш корисною, ми розглянемо як прикрутити до nginx безкоштовний Let's Encrypt сертифікат і як налаштувати систему на його автоматичне оновлення.
Якщо коротенько, Let's Encrypt – це новий центр сертифікації (CA), що надає безкоштовні та автоматизовані SSL/TLS-сертифікати. На даний момент Let's Encrypt підтримується більшістю сучасних браузерів, у тому числі IE і навіть старими операційними системами, такими як Windows Vista. По суті все, що вам потрібно знати – він безкоштовний і підтримує автоматичне оновлення.
Встановимо клієнт за допомогою команди:
sudo git clone https://github.com/certbot/certbot /opt/letsencrypt
Якщо git не встановлений, то спочатку потрібно встановити його, а потім уже встановлює клієнт для Let's Encrypt. Файли будуть завантажені в каталог /opt/letsencrypt.
Даний каталог дозволяє серверу Let's Encrypt переконатися, що ваш сайт намагається отримати безкоштовний SSL-сертифікат. Каталог потрібно створювати в корені веб-сервера. Наприклад, якщо корінь у вас /var/www/shop, то в ньому потрібно створити потрібний каталог:
cd /var/www/shop mkdir .well-known mkdir .well-known/acme-challenge find. -type d -exec chown www-data: www-data {} \;
Тепер потрібно створити конфігураційний файл для вашого домену. Якщо ваш домен називається example.com, файл буде називатися /etc/letsencrypt/configs/example.com.conf. Вміст файлу:
ваш домен (хоча і можна створити один сертифікат для декількох доменів ми рекомендуємо створювати окремі сертифікати і, отже, окремі сертифікати файли конфігурації для різних доменів) domains = example.com # розмір ключа rsa-key-size = 2048 # або 4096 сервер сертифікації server = https://acme-v01.api.letsencrypt.org/directory # адреса, на яку приходитимуть нагадування про оновлення email = my-email # відключаємо ncurses UI text = True # задаємо шлях до каталогу .well-known (див. вище) authenticator = webroot webroot-path = /var/www/shop/
Настав час запросити сертифікат. У другій команді потрібно замінити точне ім'я файлу конфігурації:
cd /opt/letsencrypt $ ./certbot-auto --config /etc/letsencrypt/configs/example.com.conf certonly
Мал. 1. Сертифікат згенеровано
Виведення останньої команди зображено на малюнку вище. Як бачите, файли сертифіката розміщені в каталогі /etc/letsencrypt/live/<ім'я>/. Оскільки скріншот зроблено в процесі налаштування реального вузла, його адреса затерта (NDA є NDA). В результаті було згенеровано два файли – файл сертифіката fullchain.pem та файл ключа privkey.pem.
Отже, сертифікат вже є, залишилася справа за малим – налаштувати веб-сервер. Переходимо до потрібного файлу конфігурації віртуального вузла і наводимо його до вигляду:
server { listen 443 ssl default_server; listen 80; server_name <ім'я>; ssl_certificate /etc/letsencrypt/live/<ім'я>/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/<ім'я>/privkey.pem; root /var/www/<каталог>; index index.php index.html; location /.well-known/acme-challenge { root /var/www/<каталог>; } …. # Інші параметри }
Зверніть увагу на такі моменти:
Змусимо nginx перечитати конфіг:
sudo nginx -t && sudo nginx -s reload
Мало налаштувати SSL на веб-сервері, потрібно движку сайту вказати, що він працює за SSL, інакше він буде генерувати посилання https://, а не https://. Тут все залежить від движка і докладніші інструкції ви можете отримати в документації по ньому. Так, в Magento потрібно відкрити розділ Система, Конфігурація, Загальні, Інтернет і на вкладці Безпечне з'єднання вказати базову URL, яка починалася б з https:// і включити параметри Використовувати захищені URL в частині користувача і Використовувати захищені URL в панелі адміністрування.На рис. 2 показано, що другий параметр тимчасово вимкнено – поки адміністратор не переконається, що все працює правильно – щоб він мав можливість зайти по http.
Мал. 2. Налаштування двигуна
Залишилися останні штрихи, наприклад, налаштування обов'язкового редиректу з http на https (якщо ви вирішите залишити listen 80 у налаштуваннях nginx). Для цього до файлу .htaccess додайте рядки:
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Наш сертифікат буде дійсним протягом 90 днів, після чого має бути оновлено. Для оновлення можна використовувати наступний сценарій renew-letsencrypt.sh:
#!/bin/sh cd /opt/letsencrypt/ ./certbot-auto --config /etc/letsencrypt/configs/my-domain.conf certonly if [$? -ne 0] then ERRORLOG=`tail /var/log/letsencrypt/letsencrypt.log` echo -e "The Let's Encrypt ніби не буде renewed!\n\n " $ERRORLOG else nginx -s reload fi exit 0
У розклад cron потрібно додати рядок:
0 0 1 JAN, MAR, MAY, JUL, SEP, NOV * /path/to/renew-letsencrypt.sh
І не забудьте створити каталог /var/log/letsencrypt/ (якщо він ще не створений) та змінити відповідним чином права доступу (користувач, від імені якого виконується оновлення сертифіката, повинен мати право писати в цей каталог).
Ось тепер справді все. Ми розглянули всі аспекти, пов'язані з "використанням" SSL-сертифіката на сервер - від його запиту до налаштування движка сайту.