На моєму блозі є пост про встановлення самопідписаного SSL-сертифіката на веб-сервер під керуванням nginx. Як там вже сказано, самопідписаний сертифікат забезпечує шифрування даних між сервером та клієнтом, але не дозволяє засвідчити справжність веб-сайту.
Для засвідчення справжності необхідні ключ та сертифікат, випущені всесвітньо відомими центрами сертифікації. І ви можете безкоштовно отримати справжній SSL-сертифікат від центру сертифікації Let’s Encrypt!
Вважаємо, що веб-сервер nginx вже встановлений і налаштований.
Крок 1. Встановлюємо клієнт від Let’s Enscrypt
$ cd /usr/local/sbin
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x /usr/local/sbin/certbot-auto
Крок 2. Отримання сертифікату
Let’s encrypt пропонує різні способи отримання сертифікатів, за допомогою різних плаґінів. Ми використаємо плаґін Webroot. Цей плаґін розміщує спеціальний файл в каталозі .well-known/ у веб-корені вашого сайту. Тому потрібно, щоб розташування сайту /.well-known/ було доступним з інтернету.
$ certbot-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d site-devel.info -d www.site-devel.info
Замініть /usr/share/nginx/html на каталог-корінь вашого сайту, а site-devel.info – ваш домен.
Під час виконання скрипта потрібно буде ввести Email для зв’язку та букву A для погодження з умовами.
Примітки
-
Скрипт certbot-auto виконує певні операції під sudo, тому потрібно буде ввести пароль під час його виконання.
-
Помилка виду Failed to connect to host for DVSNI challenge може свідчити про те, що файрвол сервера забороняє з’єднання на порт 80 або 443
-
Якщо ви використовуєте службу DNS-маршртизації на кшталт Cloud Flare, тимчасово відключіть її.
Файли сертифікату
Після успішного виконання скрипта ви отримаєте такі файли:
-
cert.pem сертифікат вашого домена
-
chain.pem сертифікат ланцюжка верифікації Let’s encrypt
-
fullchain.pem об’єднані сертифікати cert.pem та chain.pem
-
privkey.pem приватний ключ вашого сертифікату
Ці файли будуть розміщені в /etc/letsencrypt/archive. Крім того, certbot створює символічне посилання на найсвіжішу версію сертифікату в /etc/letsencrypt/live/site-devel.info (де site-devel.info – ваш домен).
$ sudo ls -l /etc/letsencrypt/live/site-devel.info
Саме це посилання ми будемо використвувати для конфігурації nginx.
Генерація сильної групи Діффі-Гелмана
Для кращої безпеки згенеруємо ще сильну групу Діффі-Гелмана:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Крок 3. Налаштування веб-сервера nginx
Вносимо зміни у файл конфігурації сервера (чи віртуального сервера) в блоці server {.
$ sudo vim /etc/nginx/sites-enabled/site-devel.info
Вилучаємо чи коментуємо директиви, що вказують слухати порт 80, типу
listen 80; # це вилучити
Замість них додаємо рядки
listen 443;
server_name site-devel.info www.site-devel.info;
ssl on;
ssl_certificate /etc/letsencrypt/live/site-devel.info/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-devel.info/privkey.pem;
Така конфігурація вмикає використання SSL і вказує серверу використовувати сертифікати від Let’s Encrypt.
Щоб використовувати лише найбезпечніші протоколи та шифри і сильну групу Діффі-Гелмана додаємо ще такі рядки
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers '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';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
Накінець додаємо ще один серверний блок, який буде перенаправляти з’єднання HTTP (порт 80) на HTTPS (порт 443).
server {
listen 80;
server_name site-devel.info www.site-devel.info;
return 301 https://$host$request_uri;
}
Зберігаємо файл, перевіряємо конфігурацію
$ sudo nginx -t
Перезапускаємо сервер
$ sudo service nginx restart
Тепер на нашому сайті працює SSL-сертифікат. Можемо перевірити за допомогою Qualys SSL Labs:
в браузері
https://www.ssllabs.com/ssltest/analyze.html?d=site-devel.info
З такими налаштуваннями, як показано вище, звіт має показати рейтинг A+.
Крок 4. Налаштування автооновлення сертифікату.
Сертифікати від Let’s Encrypt діють 90 днів. Рекомендується запускати їх оновлення через 60 днів. Для того, щоб виконати оновлення сертифікатів для всіх налаштованих доменів, треба віддати команду:
$ certbot-auto renew
Щоб не робити це вручну, можна використати cron
$ sudo crontab -e
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload
Таким чином, кожного понеділка о 02:30 буде запускатися оновлення сертифікатів, а через 5 хв буде перезавантажуватися конфігурація nginx.
Написано за матеріалами посібника на Digital Ocean