Make https with SSL let'sencrypt

Vadym Kykalo · June 4, 2022

lets-encrypt


Let’s Encrypt

Let's Encrypt - це безкоштовний, автоматизований і відкритий сертифікатний орган, який випускає SSL/TLS сертифікати. Для випуску сертифіката Let’s Encrypt перевіряє, чи контролює заявник домен, для якого випускається сертифікат. Це зазвичай відбувається шляхом розміщення спеціального файлу на веб-сервері або налаштування DNS-запису для домену.


SSL та HTTPS

SSL (Secure Sockets Layer) та HTTPS (Hyper Text Transfer Protocol Secure) тісно пов’язані, але не ідентичні. SSL - це технологія шифрування, яка забезпечує безпечне з’єднання між веб-сервером та браузером. HTTPS - це HTTP, який використовує SSL для шифрування даних, переданих по інтернету. Основна різниця полягає в тому, що SSL - це протокол шифрування, тоді як HTTPS - це спосіб застосування цього протоколу для захисту веб-трафіку. Технічно, SSL може існувати без HTTPS, оскільки воно може бути використане для шифрування інших типів даних, а не тільки веб-трафіку. Однак, в контексті веб-браузерів та серверів, вони зазвичай використовуються разом.

HTTPS не може працювати без SSL (або його наступника, TLS). HTTPS є розширенням HTTP з додаванням шифрування за допомогою SSL/TLS. Це означає, що вся інформація, передана між веб-сервером та браузером, зашифрована для забезпечення безпеки та конфіденційності. HTTPS забезпечує захист від перехоплення та зміни даних під час їх передачі. Тому без SSL/TLS, протокол HTTP не може стати HTTPS.

Випуск сертифіката Let’s Encrypt відбувається наступним чином:
  • Запит сертифіката: Використовуючи клієнт, такий як Certbot, формується запит на випуск сертифіката для певного домену.

  • Перевірка домену: Let’s Encrypt перевіряє, що заявник контролює домен. Це може бути зроблено через HTTP-відповідь із сервера (за допомогою файлу на сервері) або через DNS-записи.

  • Генерація сертифіката: Після успішної перевірки, Let’s Encrypt генерує SSL/TLS сертифікат для домену.

  • Встановлення сертифіката: Сертифікат потім встановлюється на сервері, забезпечуючи шифрування з’єднань через HTTPS.

  • Цей процес забезпечує, що тільки авторизовані користувачі можуть отримати сертифікат для домену, гарантуючи безпеку та автентичність сайту.


Передумови для встановлення SSL-сертифіката

Для початку роботи з SSL-сертифікатом необхідно мати сервер з доступом до інтернету (маючи публічну IP-адресу) та доступом по SSH. Цей сервер може бути розміщений на будь-якому хостингу, такому як hetzner, aws, digitalocean, тощо. Також потрібно мати зареєстрований домен, який можна придбати, наприклад, через ukrnames.

Якщо ваш сайт вже розміщений на сервері і налаштований на роботу через порт 80 (стандарт для HTTP), він буде доступний у веб-браузері за адресою http://your_domain. Однак, при спробі доступу через https://your_domain виникне помилка this site can't provide a secure connection, та ERR_SSL_PROTOCOL_ERROR, оскільки SSL сертифікат ще не встановлений.


Отримання SSL сертифікату від Let’s Encrypt

Для отримання SSL сертифікату від Let’s Encrypt потрібно увійти на сервер через SSH і встановити certbot. Спочатку встановлюємо необхідні пакети і оновлюємо систему:

sudo apt -y install software-properties-common
sudo apt -y update
sudo apt -y install certbot

Для випуску SSL сертифікату виконуємо команду з certbot, вказуючи ваш домен та електронну пошту:

sudo certbot certonly --standalone -d <your_domain> --staple-ocsp -m <email> --agree-tos

Замініть <your_domain> на ім’я вашого домену і <email> на вашу email адресу. Після успішного виконання команди, сертифікати будуть збережені на сервері. Важливо відзначити, що сертифікати потрібно регулярно оновлювати. Для цього можна налаштувати автоматичне оновлення через cron.

Якщо команда завершиться успішно, побачимо повідомлення в терміналі типу:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/<your_domain>/fullchain.pem. Your
cert will expire on 2022-08-21. To obtain a new version of the
certificate in the future, simply run Certbot again.
- If you lose your account credentials, you can recover through
e-mails sent to <email>
- 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

Після випуску SSL сертифікату від Let’s Encrypt, наступним кроком є налаштування веб-сервера nginx для використання цих сертифікатів. Сертифікати зберігаються за шляхом /etc/letsencrypt/live/<your_domain>. У конфігураційному файлі nginx /etc/nginx/conf.d/default.conf потрібно налаштувати прослуховування на порту 443 з параметрами SSL, вказавши шляхи до сертифіката fullchain.pem та приватного ключа privkey.pem.

Відкриємо конфігураційний файл nginx по шляху /etc/nginx/conf.d/default.conf та пропишемо нову директиву

server {
    listen 443 ssl;
    server_name _;
    root /usr/share/nginx/html;
    ssl_certificate /etc/letsencrypt/live/<your_domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<your_domain>/privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    .....................................

Для нас важливо додати наступні рядки

ssl_certificate /etc/letsencrypt/live/<your_domain>/fullchain.pem; 
ssl_certificate_key /etc/letsencrypt/live/<your_domain>/privkey.pem;

Якщо використовується докер, можна прокинути волюм в контейнер nginx

Після цього, необхідно перезапусти вебсервер service nginx reload, якщо використовується докер, перезапустити контейнер з nginx

Повністю робочий конфіг

server {
    listen 80;
    server_name <your_domain>;
    root /usr/share/nginx/html;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name <your_domain>;
    root /usr/share/nginx/html;
    ssl_certificate /etc/letsencrypt/live/<your_domain>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<your_domain>/privkey.pem;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Якщо у корні сайту є index.html і відкритий порт 443, то відтепер запрацює сертифікат і можна використовувати протокол https набравши в браузері https://your_domain.


Оновлення сертифікату

Сертифікат видається на 90 днів, так що після цього терміну потрібно його оновити командою.

sudo certbot renew

Щоб постійно кожні 90 днів не заходити на сервер, щоб перевипустити сертифікати, можна додати в cron задачу від root користувача sudo crontab -e


Посилання

Twitter, Facebook