Як прикрутити SSL до сервера nginx


Цю статтю можна розглядати як повноцінний посібник із прикручування SSL-сертифіката до nginx. Сам процес перетворення звичайного сервера на сервер з підтримкою HTTPS займає пару рядків у файлі конфігурації, тому щоб замітка була більш корисною, ми розглянемо як прикрутити до nginx безкоштовний Let's Encrypt сертифікат і як налаштувати систему на його автоматичне оновлення.

Що таке Let's Encrypt

Якщо коротенько, Let's Encrypt – це новий центр сертифікації (CA), що надає безкоштовні та автоматизовані SSL/TLS-сертифікати. На даний момент Let's Encrypt підтримується більшістю сучасних браузерів, у тому числі IE і навіть старими операційними системами, такими як Windows Vista. По суті все, що вам потрібно знати – він безкоштовний і підтримує автоматичне оновлення.

Установка клієнта Let's Encrypt

Встановимо клієнт за допомогою команди:

sudo git clone https://github.com/certbot/certbot /opt/letsencrypt

Якщо git не встановлений, то спочатку потрібно встановити його, а потім уже встановлює клієнт для Let's Encrypt. Файли будуть завантажені в каталог /opt/letsencrypt.

Створюємо каталог webroot-path/.well-known/acme-challenge/

Даний каталог дозволяє серверу 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.

Налаштування nginx

Отже, сертифікат вже є, залишилася справа за малим – налаштувати веб-сервер. Переходимо до потрібного файлу конфігурації віртуального вузла і наводимо його до вигляду:

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/<каталог>;
     }
  ….
# Інші параметри
}

Зверніть увагу на такі моменти:

  1. Цей віртуальний вузол є стандартним сервером (default_server). Якщо в іншому конфізі вже є default_server, то буде конфлікт і доведеться вибрати сервер за промовчанням.
  2. Ми слухаємо порти 443 і 80. Порт 80 поки не прибирайте - він знадобиться, якщо двигун сайту поки що не готовий до SSL.
  3. Директиви ssl-* задають шлях до сертифіката та ключа сертифіката. Перевірте правильність шляху.
  4. Каталоги в директивах root повинні бути однаковими.

Змусимо nginx перечитати конфіг:

sudo nginx -t && sudo nginx -s reload

Готуємо двигун до SSL

Мало налаштувати 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-сертифіката на сервер - від його запиту до налаштування движка сайту.