Як установити безкоштовний SSL-сертифікат для свого сайту?


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Let’s Encrypt-це центр сертифікації (англ. certification authority, CA) що надає легкий спосіб отримання і установки TLS/SSL- сертифікатів, що забезпечують можливість використання протоколу HTTPS на веб-сервері. Робота з Let’s Encrypt спрощена наявністю клієнта Certbot, який автоматизує велику частину роботи. Проте, безкоштовний SSL-сертифікат можна встановити на веб-сервер вручну, незалежно від його конфігурації.

Повний перелік програмного забезпечення, в якому робота з сертифікатами вже автоматизована, ви можете знайти на офіційному сайті Certbot. Варто відмітити, що повна або часткова автоматизація можлива з допомогою не лише Certbot, але і іншого програмного забезпечення. Списки підтримуваних операційних систем і браузерів, а також клієнтів і бібліотек постійно оновлюються.

У цьому керівництві ми розповімо, як за допомогою Certbot отримати безкоштовний SSL-сертифікат і використати його в Nginx на Ubuntu 16.04. Ми також покажемо, як настроїти автоматичне оновлення SSL- сертифікату щоб уникнути закінчення його терміну дії. Якщо у вас запущений інший веб-сервер, наслідуйте його документацію, щоб дізнатися, як використати сертифікат для вашої конфігурації.

Крок 0. Підготовка

Перед тим, як приступити до роботи, вам треба переконатися в декількох речах.

У вас має бути встановлений сервер на Ubuntu 16.04, і створений користувач (не root), для якого налагоджені sudo привілеї. Дізнатися, як це зробити, ви можете, слідуючи керівництву по первинному налаштуванню сервера на Ubuntu 16.04.

Ви маєте бути власником доменного імені, для якого планується використати сертифікат, або мати доступ до його налаштування. Якщо у вас немає зареєстрованого доменного імені, ви можете зробити це, використовуючи один з реєстраторів (наприклад, Namecheap або GoDaddy).

Після реєстрації домена переконаєтеся, що створена запис A, яка зв’язує ваш домен і публічну IP- адресу вашого сервера. Це необхідно, тому що Let’s Encrypt перевіряє, що ви є власником домена, на який видається сертифікат. Наприклад, якщо ви хочете отримати сертифікат example.com, таке доменне ім’я повинне вказувати на ваш сервер, щоб перевірка пройшла. Ми використовуватимемо доменні імена example.com і www.example.com, тому потрібні DNS- запису для обох доменів.

Якщо усі вимоги виконані, приступаємо до установки Certbot-клієнта Let’s Encrypt.

Крок 1. Встановлюємо Certbot

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

Спершу додайте репозиторій:

sudo add-apt-repository ppa:certbot/certbot

Натисніть ENTER для підтвердження. Після цього необхідно оновити пакети:

sudo apt-get update

Після закінчення встановіть Certbot, використовуючи команду apt-get:

sudo apt-get install certbot

Тепер Certbot готовий до використання.

Крок 2. Отримуємо SSL-сертифікат

Certbot надає декілька способів отримання сертифікатів за допомогою різних плагінів. На відміну від плагіну для Apache, який описаний в іншому керівництві, більшість плагінів допоможуть вам тільки отримати сертифікат, який доведеться настроїти на вашому сервері вручну. Плагіни, які дозволяють тільки отримувати сертифікати і не встановлюють їх, називаються “аутентификаторами”, оскільки вони використовуються для підтвердження достовірності сервера, якому сертифікат видається.

Давайте розберемося, як використати плагін Webroot для отримання SSL-сертифікату.

Використання плагіну Webroot

Алгоритм роботи Webroot включає створення спеціального файлу в директорії /.well-known, яка розміщується в кореневому каталозі веб-сервера (document root) і може бути відкрита сервісом Let’s Encrypt для перевірки. Залежно від ваших налаштувань, вам може знадобитися явно дозволити доступ до папки /.well-known.

Якщо ви ще не встановили Nginx, зробіть це, слідуючи керівництву по установці Nginx на Ubuntu 16.04.

Щоб переконатися в тому, що папка доступна сервісу Let’s Encrypt, внесемо невеликі зміни в конфігурацію Nginx. За умовчанням файл конфігурації знаходиться в теці /etc/nginx/sites-available/default. Ми використовуватимемо редактор Nano для внесення змін :

sudo nano /etc/nginx/sites-available/default

Всередині блоку server додайте такий блок location:

location ~ /.well-known {
  allow all;
 }

Вам також варто подивитися, де розташований кореневий каталог веб-сервера (document root), оскільки цей шлях потрібний при роботі з Webroot. Якщо ви використовуєте стандартний файл конфігурації,  то він буде в /var/www/html.

Збережіть і закрийте файл.

Перевірте вашу конфігурацію на синтаксичні помилки:

sudo nginx-t

Якщо помилок немає, перезапустіть Nginx, використовуючи цю команду:

sudo systemctl restart nginx

Тепер, коли ми знаємо webroot-path, можна виконати запит на отримання SSL- сертифікату. За допомогою ключа -d вказуються доменні імена. Якщо ви хочете використати єдиний сертифікат для декількох доменних імен (наприклад, example.com і www.example.com), не забудьте додати їх всіх. Також переконаєтеся, що ви замінили значення webroot-path і доменні імена на ті, що відповідають вашим:

sudo certbot certonly --webroot --webroot-path=/var/www/html -d example.com -d www.example.com

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

IMPORTANT NOTES:- Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-07-26. 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 lose your account credentials, you can recover through e-mails
sent to sammy@example.com.- Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.- 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

Зверніть увагу, що шлях до сертифікату і дата закінчення терміну його використання вказані на початку повідомлення.

Примітка 1. Якщо в процесі ви отримаєте помилку ніби Failed to connect to host for DVSNI challenge, значить, вам треба настроїти файрвол вашого сервера, дозволивши TCP- трафік на портах 80 і 443.

Примітка 2. Якщо для вашого домена використовується маршрутизація через такий DNS-сервіс, як CloudFlare, вам доведеться тимчасово відключити її до тих пір, поки сертифікат не буде отриманий.

Файли сертифікату

Після отримання сертифікату у вас повинні з’явитися наступні файли в PEM- кодуванні:

  • cert.pem-сертифікат вашого доменного імені;
  • chain.pem-ланцюжок сертифікатів Let’s Encrypt;
  • fullchain.pem-об’єднані cert.pem і chain.pem;
  • privkey.pem-приватний (секретний) ключ вашого сертифікату.

Важливо запам’ятати розташування цих файлів, оскільки вони використовуватимуться в конфігурації вашого сервера. Самі файли розташовані в теці /etc/letsencrypt/archive. Проте Certbot створює сімлінки на найбільш актуальні файли сертифікату в папці /etc/letsencrypt/live/your-domain/. Оскільки символьні посилання вказують на найбільш актуальні файли сертифікату, саме цей шлях краще використати при зверненні до них.

Ви можете перевірити існування файлів, використовуючи таку команду (підставте ваше доменне ім’я) :

sudo ls-l /etc/letsencrypt/live/your-domain/

Результатом виконання команди мають бути вказані вище файли сертифікату. Тепер ви можете настроїти ваш сервер так, щоб fullchain.pem використовувався як файл сертифікату, а privkey.pem в якості ключа сертифікату.

Генерація ключа по алгоритму Діффі-Хеллмана

Для підвищення безпеки вам необхідно згенерувати ключ по алгоритму Диффи-Хеллмана. Для генерації ключа завдовжки 2048 біт використайте таку команду:

sudo openssl dhparam-out /etc/ssl/certs/dhparam.pem 2048

Процес може зайняти декілька хвилин.

Крок 3. Настройка TLS/SSL на веб-сервері

Тепер, коли у вас є SSL- сертифікат, необхідно настроїти веб-сервер Nginx так, щоб він почав його використати.

Внесемо деякі зміни в нашу конфігурацію:

  1. Створимо сніппет конфігурації, що містить розташування нашого SSL- ключа і файлів сертифікату.
  2. Створимо сніппет конфігурації, що містить налаштування стійкого SSL, які можна буде використати в майбутньому для будь-якого сертифікату.
  3. Оновимо блоки server у конфігурації Nginx, які управлятимуть SSL- запитами і використовуватимуть два вищезгадані сніппети.

Такий підхід до налаштування Nginx дозволяє зберегти блоки server чистими і зробити конфігурацію доступною для повторного використання.

Створюємо сніппет конфігурації для SSL- ключа і сертифікату

Спершу створимо сніппет конфігурації Nginx в теці /etc/nginx/snippets.

Для правильного розпізнавання призначення файлу назвемо його ssl-, потім вкажемо доменне ім'я і у кінці поставимо .conf:

sudo nano /etc/nginx/snippets/ssl-example.com.conf

В цьому файлі необхідно встановити відповідність директиви ssl_certificate файлу сертифікату і ssl_certificate_key– відповідному ключу. У нашому випадку це виглядатиме так:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl certificate key /etc/letsencrypt/live/example.com/privkey.pem;

Коли додасте ці рядки, збережіть і закрийте файл.

Створюємо сніппет конфігурації із стійкими налаштуваннями шифрування

Наступним кроком ми створимо інший сніппет, що визначає деякі налаштування SSL. Це дозволить Nginx підключити стійкий “набір шифрів” SSL (англ. cipher suite) і деякі додаткові функції, які допоможуть забезпечити безпеку нашого сервера. Cipher Suite – це сукупність алгоритмів, використовуваних в конкретній TLS/SSL- сесії:

  • алгоритм вироблення сесійних ключів шифрування;
  • алгоритм, використовуваний для аутентифікації сервера;
  • безпосередньо сам симетричний алгоритм шифрування трафіку;
  • і алгоритм контролю цілісності (MAC, message authentication code).

Встановлені нами параметри можуть бути використані повторно для конфігурацій Nginx в майбутньому, тому дамо файлу стандартну назву:

sudo nano /etc/nginx/snippets/ssl-params.conf

Для налаштування безпечної зв’язки Nginx-SSL ми використовуватимемо рекомендації сайту Cipherli.st. Він створений для надання швидкого доступу до готових налаштувань шифрування популярного програмного забезпечення. Додаткова інформація доступна в керівництві по налаштуванню SSL для Nginx.

Для наших цілей можна скопіювати пропоновані налаштування цілком. Нам потрібно буде внести лише деякі зміни.

Спершу додамо DNS-резолвер. Використовуємо для нашого керівництва той, що пропонує Google. Потім встановимо в якості параметра ssl_dhparam покажчик на файл ключа Діффі-Хеллмана, який ми згенерували раніше.

І, нарешті, почитайте про протокол HTTP Strict Transport Security, чи HSTS. Він забезпечує підвищену безпеку, але його некоректне використання може привести до серйозних наслідків. У цьому керівництві ми відключимо заголовний файл за умовчанням, але ви можете не робити цього, якщо упевнені, що розумієте наслідки:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

После внесення змін збережіть і закрийте файл.

Настроюємо конфігурацію Nginx для SSL

Тепер, коли ми підготували сниппеты, можна оновити нашу конфігурацію Nginx і підключити SSL.

У цьому керівництві ми вважаємо, що ви використовуєте стандартний файл з блоками server, розташований в теці /etc/nginx/sites-available. Якщо ви використовуєте інший файл з блоками server, замініть назву в представлених нижче командах.

Перед тим, як рухатися далі, давайте зробимо резервну копію нашого поточного файлу з блоками server:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

Теперь відкрийте файл з блоками server для внесення змін :

sudo nano /etc/nginx/sites-available/default

Внутри ваш блок server, ймовірно, починається так:

server {
 listen 80 default_server;
 listen [::]:80 default_server;

# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;

Змінимо поточну конфігурацію так, щоб незашифровані HTTP- запити автоматично перенаправлялися на шифрований HTTPS. Такий спосіб забезпечує кращу безпеку. Якщо ви хочете дозволити і HTTP -, і HTTPS- трафік, використайте альтернативну конфігурацію, представлену в наступному розділі.

Розділимо конфігурацію на два окремі блоки. Після перших двох директив listen додамо директиву server_name, що вказує на доменне ім’я вашого сервера. Потім встановимо перенаправлення на створений нами другий блок server. Після цього закриємо поточний блок:

server {
 listen 80 default_server;
 listen [::]:80 default_server;
 server_name example.com www.example.com;
 return 301 https://$server_name$request_uri;
}

# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;

Наступним кроком необхідно відкрити новий блок server відразу за поточним, щоб частина конфігурації, що залишилася, потрапила в нього. Ми можемо розкоментувати обидві директиви listen, що використовують порт 443. До цих рядків можна додати http2, щоб включити HTTP/2 усередині блоку. Після цього нам залишиться підключити налагоджені нами сніппети у файл:

server { 
 listen 80 default_server;
 listen [::]:80 default_server;
 server_name example.com www.example.com;
 return 301 https://$server_name$request_uri;
}

server {
# SSL
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;

Після внесення змін збережіть і закрийте файл.

Альтернативна конфігурація: дозволяємо HTTP-і HTTPS- трафік

Якщо ви хочете або вимушені дозволити і шифрований, і нешифрований контент, вам доведеться настроїти Nginx трохи інакше. Так робити не варто, але в деяких ситуаціях це може бути необхідно. По суті, ми склеїмо розділені блоки server у один і приберемо перенаправлення:

server {
 listen 80 default_server;
 listen [::]:80 default_server;
 listen 443 ssl http2 default_server;
 listen [::]:443 ssl http2 default_server;

 server_name example.com www.example.com;
 include snippets/ssl-example.com.conf;
 include snippets/ssl-params.conf;

Після внесення змін збережіть і закрийте файл.

Крок 4. Настроюємо файрвол

Якщо у вас включений файрвол ufw, вам необхідно оновити налаштування і дозволити SSL- трафік. На щастя, Nginx реєструє декілька профілів з ufw після установки.

Ви можете подивитися поточні налаштування, ввівши:

sudo ufw status

Щоб дозволити HTTPS- трафік, можна включити профіль “Nginx Full” і видалити зайвий профіль “Nginx HTTP” :

sudo ufw allow 'Nginx Full'sudo ufw delete allow 'Nginx HTTP'

Крок 5. Підключаємо зміни в Nginx

Тепер, коли ми внесли зміни в конфігурацію і оновили правила файрвола, треба перезапустити Nginx, щоб зміни набули чинності.

Насамперед варто перевірити і переконатися, що синтаксичні помилки в наших файлах відсутні. Це можна зробити, ввівши:

sudo nginx-t

У разі успіху ваш результат повинен виглядати таким чином:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Якщо ваш результат співпадає з тим, що ви бачите вище, значить, ваш файл конфігурації не містить синтаксичних помилок. Для активації змін безпечно перезапустимо Nginx:

sudo systemctl restart nginx

Тепер TLS/SSL- сертифікат від Let’s Encrypt на місці і файрвол дозволяє трафік на портах 80 і 443. На цьому етапі протестуйте працездатність TLS/SSL- сертифікату, зайшовши на ваш домен у браузері по HTTPS.

Ви можете використати інструмент Qualys SSL Labs Report, щоб подивитися оцінку конфігурації вашого сервера :

# Наберіть у браузері: https://www.ssllabs.com/ssltest/analyze.html?d=example.com

Таке налаштування SSL повинне показати рейтинг A+.

Крок 6. Настроюємо автоматичне оновлення

Сертифікати від Let’s Encrypt діють тільки впродовж 90 днів. Це спонукає користувачів до автоматизації процесу оновлення. Нам знадобиться створити команду, що регулярно запускається, для перевірки і автоматичного оновлення сертифікатів, термін яких збігає.

Для запуску перевірки щоденних оновлень ми використовуватимемо Cron-стандартний системний сервіс для запуску завдань, що повторюються. Завдання Cron вказуються у файлі під назвою crontab:

sudo crontab-e

Вставте наступний рядок в кінець файлу, потім збережіть і закрийте його:

. . . 15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"

Частина рядка 15 3 * * * означає “запускай наступну команду в 3: 15 ночей щодня”. Ви можете вибрати будь-який час.

Команда renew для Certbot перевірить усі сертифікати, встановлені в системі, і оновить кожен, термін використання якого збігає менш, ніж через 30 днів. Ключ --quiet говорить Certbot нічого не виводити і не чекати введення від користувача. --renew-hook "/bin/systemctl reload nginx" перезавантажить Nginx, щоб він використав нові файли сертифікату, але тільки у разі, якщо сталося оновлення.

Cron запускатиме цю команду щодня. Усі встановлені сертифікати будуть автоматично оновлені і підвантажені, коли залишиться менше 30 днів до закінчення терміну їх дії.

Висновок

У цьому керівництві ми встановили клієнт сервісу Let’s Encrypt-Certbot, завантажили SSL- сертифікати для наших доменів, настроїли Nginx, щоб він використав ці сертифікати, і настроїли автоматичне оновлення. Якщо у вас залишилися питання по використанню Certbot, його документація вам допоможе.

 Переклад статті “How To Secure Nginx with Let’s Encrypt on Ubuntu 16.04”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Trends: імя сайту не збігається з іменем серти, чому імя сайту незбігаеться з вказаним сертифікатом

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *