Генерація ключів 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
У цьому випадку вам знадобляться облікові дані вашого користувача sudo, щоб отримати доступ до системи як 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 від іншого постачальника (і якби ми не дозволили certbot зробити це автоматично).
Один файл PEM (Privacy Enhanced Mail) містить сертифікат і файл ланцюжка. Зараз це загальний формат для всіх файлів сертифікатів, тому, хоча в посиланні на нього є «Пошта», це лише тип файлу сертифіката. Щоб проілюструвати файл конфігурації, ми покажемо його повністю, а потім опишемо, що відбувається:
<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
SSLCertificateChainFile /etc/letsencrypt/live/your-server-hostname/fullchain.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>
Ось що відбувається вище. Ви можете переглянути Налаштування кількох сайтів веб-сервера Apache, щоб побачити відмінності в застосуванні SSL, придбаного в іншого постачальника і сертифікат Let's Encrypt:
- Незважаючи на те, що порт 80 (стандартний http) прослуховує, ми перенаправляємо весь трафік на порт 443 (https)
- SSLEngine увімкнуто - просто говорить про використання SSL
- SSLProtocol all -SSLv2 -SSLv3 -TLSv1 - говорить про використання всіх доступних протоколів, крім тих, які мають вразливості. Ви повинні періодично досліджувати, які протоколи зараз прийнятні для використання.
- SSLHonorCipherOrder on - це стосується наступного рядка щодо наборів шифрів і повідомляє, що потрібно мати справу з ними в тому порядку, у якому вони вказані. Це ще одна область, де ви повинні переглядати набори шифрів, які ви хочете періодично включати
- SSLCertificateFile – це файл PEM, який містить сертифікат сайту ТА проміжний сертифікат. Нам все ще потрібен рядок «SSLCertificateChainFile» у нашій конфігурації, але він просто знову вкаже той самий файл PEM.
- SSLCertificateKeyFile – файл PEM для закритого ключа, згенерований за допомогою запиту certbot.
- SSLCertificateChainFile – сертифікат від вашого постачальника сертифікатів, який часто називають проміжним сертифікатом, у цьому випадку точно так само, як розташування «SSLCertificateFile» вище.
Коли ви внесете всі зміни, просто перезапустіть 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
У цьому прикладі ми використовуємо останню опцію та бачимо, що 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 (Domain Validation). Їх не можна використовувати для сертифікатів OV (перевірка організації) або EV (розширена перевірка).
Author: Steven Spencer
Contributors: wsoyinka, Antoine Le Morvan, Ezequiel Bruni, Andrew Thiesen, Ganna Zhyrnova