Перейти до змісту

Генерація ключів SSL - Let's Encrypt

Передумови та припущення

  • Володіння командним рядком
  • Знайомство із захистом веб-сайтів за допомогою сертифікатів SSL є перевагою
  • Знання текстових редакторів командного рядка (у цьому прикладі використовується vi)
  • Веб-сервер, відкритий для світу та працює на порту 80 (http)
  • Знайомство з ssh (захищена оболонка) і можливість доступу до вашого сервера за допомогою ssh
  • Усі команди припускають, що ви є користувачем root або що ви використовували sudo для отримання доступу root

Вступ

Одним із найпопулярніших способів захисту веб-сайту на даний момент є використання сертифікатів Let's Encrypt SSL, які також безкоштовні.

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

Встановлення

Щоб виконати наступні кроки, скористайтеся ssh для входу на свій сервер. Якщо повне DNS-ім’я вашого сервера було www.myhost.com, ви б використовували:

ssh -l root www.myhost.com

Або якщо ви спочатку маєте отримати доступ до свого сервера як непривілейований користувач. Використовуйте своє ім'я користувача:

ssh -l username www.myhost.com

І потім:

sudo -s

У цьому випадку вам знадобляться облікові дані вашого користувача, щоб отримати доступ до системи як root.

Let's Encrypt використовує пакет під назвою certbot, який потрібно встановити через репозиторії EPEL. Додайте їх першими:

dnf install epel-release

Потім встановіть відповідні пакети залежно від того, чи використовуєте ви Apache або Nginx як веб-сервер. Для Apache це:

dnf install certbot python3-certbot-apache

Для Nginx просто змініть один пакет:

dnf install certbot python3-certbot-nginx

За потреби ви завжди можете встановити обидва серверні модулі.

Примітка

Попередня версія цього посібника вимагала версії пакета знімків certbot, яка тоді була необхідною. Версії RPM були нещодавно повторно перевірені та зараз працюють. Проте Certbot наполегливо рекомендує використовувати процедуру швидкого встановлення. Rocky Linux 8 і 9 мають certbot, доступний у EPEL, тому ми показуємо цю процедуру тут. Якщо ви бажаєте скористатися процедурою, рекомендованою Certbot, дотримуйтеся цієї процедури.

Отримання сертифіката Let's Encrypt для сервера Apache

Ви можете отримати свій сертифікат Let's Encrypt двома способами: за допомогою команди для зміни файлу конфігурації http або лише отриманням сертифіката. Якщо ви використовуєте процедуру багатосайтового налаштування, запропоновану для одного або кількох сайтів у процедурі Мультисайтове налаштування веб-сервера Apache, просто отримайте свій сертифікат.

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

certbot --apache

Це найпростіший спосіб зробити справу. Однак іноді ви хочете застосувати більш ручний підхід і отримати сертифікат. Щоб отримати лише сертифікат, використовуйте цю команду:

certbot certonly --apache

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

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): yourusername@youremaildomain.com

Далі пропонується прочитати та прийняти умови абонентської угоди. Прочитавши угоду, дайте відповідь «Y», щоб продовжити:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

Далі — прохання поділитися вашою електронною поштою з Electronic Frontier Foundation. Дайте відповідь 'Y' або 'N' на свій смак:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

У наступному запиті вас запитають, для якого домену ви хочете отримати сертифікат. Він має відображати домен у списку на основі вашого запущеного веб-сервера. Якщо так, введіть номер біля домену, для якого ви отримуєте сертифікат. У цьому випадку є тільки один варіант ('1'):

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your-server-hostname
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Якщо все йде добре, ви повинні отримати таке повідомлення:

Requesting a certificate for your-server-hostname
Performing the following challenges:
http-01 challenge for your-server-hostname
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: yourusername@youremaildomain.com).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your-server-hostname/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your-server-hostname/privkey.pem
   Your certificate will expire on 2021-07-01. 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 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

Конфігурація сайту - https

Застосування файлу конфігурації на нашому сайті майже ідентично процедурі, яка використовується для придбаного сертифіката SSL від іншого постачальника.

Один файл PEM (Privacy Enhanced Mail) містить сертифікат і файл ланцюжка. Зараз це загальний формат для всіх файлів сертифікатів. Незважаючи на те, що в посиланні є «Пошта», це лише тип файлу сертифіката. Нижче наведено ілюстрацію файлу конфігурації та опис того, що відбувається:

Інформація

Раніше ця документація містила рядок у конфігурації для директиви SSLCertificateChainFile. Починаючи з версії Apache 2.4.8, ця директива застаріла як директива SSLCertificateFile тепер включає проміжний файл CA.

<VirtualHost *:80>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        Redirect / https://your-server-hostname/
</VirtualHost>
<Virtual Host *:443>
        ServerName your-server-hostname
        ServerAdmin username@rockylinux.org
        DocumentRoot /var/www/sub-domains/com.yourdomain.www/html
        DirectoryIndex index.php index.htm index.html
        Alias /icons/ /var/www/icons/
        # ScriptAlias /cgi-bin/ /var/www/sub-domains/com.yourdomain.www/cgi-bin/

        CustomLog "/var/log/httpd/com.yourdomain.www-access_log" combined
        ErrorLog  "/var/log/httpd/com.yourdomain.www-error_log"

        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1
        SSLHonorCipherOrder on
        SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384
:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS

        SSLCertificateFile /etc/letsencrypt/live/your-server-hostname/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/your-server-hostname/privkey.pem

        <Directory /var/www/sub-domains/com.yourdomain.www/html>
                Options -ExecCGI -Indexes
                AllowOverride None

                Order deny,allow
                Deny from all
                Allow from all

                Satisfy all
        </Directory>
</VirtualHost>

Ось що відбувається:

  • Навіть якщо порт 80 (стандартний http) прослуховує, ви перенаправляєте весь трафік на порт 443 (https)
  • SSLEngine увімкнуто - просто говорить про використання SSL
  • SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - говорить про використання всіх доступних протоколів, крім тих, які мають вразливості. Ви повинні періодично досліджувати, які протоколи зараз прийнятні для використання.
  • SSLHonorCipherOrder on - це стосується наступного рядка щодо наборів шифрів і повідомляє, що потрібно мати справу з ними в тому порядку, у якому вони вказані. Це ще одна область, де ви повинні переглядати набори шифрів, які ви хочете періодично включати
  • SSLCertificateFile – це файл PEM, який містить сертифікат сайту ТА проміжний сертифікат.
  • SSLCertificateKeyFile – файл PEM для закритого ключа, згенерований за допомогою запиту certbot.

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

Використання certbot із Nginx

Коротка примітка: використання certbot з Nginx майже таке ж, як і з Apache. Ось коротка версія посібника:

Виконайте цю команду, щоб почати:

certbot --nginx

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

1. yourwebsite.com
2. subdomain.yourwebsite.com

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

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

server {
    server_name yourwebsite.com;

    listen 80;
    listen [::]:80;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

Коли certbot впорається з цим, це виглядатиме приблизно так:

server {
    server*name  yourwebsite.com;

    listen 443 ssl; # managed by Certbot
    listen [::]:443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/yourwebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/yourwebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

server {
    if ($host = yourwebsite.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  listen [::]:80;
  server_name yourwebsite.com;
    return 404; # managed by Certbot
}

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

Автоматизація поновлення сертифіката Let's Encrypt

Примітка

Замініть випадки на «ім’я хоста-вашого-сервера» в цих прикладах на фактичне ім’я домену або ім’я хосту.

Принадність встановлення certbot полягає в тому, що сертифікат Let's Encrypt автоматично поновлюється. Для цього не потрібно створювати процес. Вам треба перевірити оновлення за допомогою:

certbot renew --dry-run

Коли ви запустите цю команду, ви отримаєте гарний результат, який показує процес оновлення:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your-server-hostname.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator apache, Installer apache
Account registered.
Simulating renewal of an existing certificate for your-server-hostname
Performing the following challenges:
http-01 challenge for your-server-hostname
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/your-server-hostname/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/your-server-hostname/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Команду для оновлення certbot можна знайти одним із таких методів:

  • Перерахувавши вміст /etc/crontab/
  • Перерахувавши вміст /etc/cron.*/*
  • Запустивши systemctl list-timers

Використовуючи метод systemctl list-timers, ви можете побачити, що certbot існує, і його інсталяцію було виконано за допомогою процедури snap:

sudo systemctl list-timers
Sat 2021-04-03 07:12:00 UTC  14h left   n/a                          n/a          snap.certbot.renew.timer     snap.certbot.renew.service

Висновки

Сертифікати Let's Encrypt SSL є ще одним варіантом для захисту вашого веб-сайту за допомогою SSL. Після встановлення система забезпечує автоматичне оновлення сертифікатів і шифрує трафік до вашого веб-сайту.

Сертифікати Let's Encrypt призначені для стандартних сертифікатів DV (перевірка домену). Їх неможливо використовувати для сертифікатів OV (перевірка організації) або EV (розширена перевірка).

Author: Steven Spencer

Contributors: wsoyinka, Antoine Le Morvan, Ezequiel Bruni, Andrew Thiesen, Ganna Zhyrnova