Вступ
Цей урок покаже вам, як налаштувати TLS / SSL сертифікат від Let's Encrypt на сервері CentOS 7 під управлінням Apache в якості веб-сервера. Крім того, ми розглянемо, як автоматизувати процес оновлення сертифіката за допомогою cron завдання.
SSL сертифікати використовуються на веб-серверах для шифрування трафіку між сервером і клієнтом, забезпечуючи додаткову безпеку для користувачів, що мають доступ до ваших програм. Let's Encrypt забезпечує простий спосіб отримати і встановити надійні сертифікати безкоштовно.
Вимоги
Для того, щоб завершити цей посібник, вам буде потрібно:
- CentOS 7 сервер з некореневим sudo користувачем, який ви можете налаштувати, слідуючи нашим керівництвом по установці сервера
- Веб-сервер Apache встановлений з одним або декількома правильно налаштованими доменними іменами
Для цілей цього посібника, ми встановимо Let's Encrypt сертифікат для домену example.com. Це буде як приклад по всьому керівництві, але ви повинні замінити його з вашим власним доменом.
Коли ви будете готові рухатися далі, необхідно увійти в ваш сервер, використовуючи обліковий запис sudo.
Крок 1. Створення віртуального хостингу для вашого домену
Apache плагін для Let's Encrypt значно спрощує процес створення і встановлення SSL-сертифікатів для доменів з Apache. Проте, на момент написання цієї статті, необхідно, щоб у вас були ваші домени організовані в віртуальні хости, кожен з них в окремому файлі конфігурації.
Якщо домен вже налаштований в якості віртуального хоста в окремому файлі конфігурації, ви можете перейти до наступного кроку.
Створення структури каталогів
Ми почнемо з створення нової структури каталогів для зберігання ваших файлів віртуальних хостів всередині каталогу конфігурації Apache, / etc / httpd. Ми будемо слідувати стандартній структурі введеної збірками на основі Debian, що робить більш легким включення і відключення сайтів, які налаштовані як віртуальні хости всередині Apache.
Доступ до каталогу конфігурації Apache з:
$ cd /etc/httpd
По-перше, створіть каталог, який буде містити всі доступні сайти на цьому сервері:
$ sudo mkdir /etc/httpd/sites-available
Далі, створіть каталог, який вміщуватиме активні в даний момент (включені) веб-сайти, розміщених на цьому сервері. Цей каталог буде містити тільки символічні посилання на файли віртуальних хостів, розташованих усередині /etc/httpd/sites-available.
$ sudo mkdir /etc/httpd/sites-enabled
Тепер нам потрібно повідомити Apache, як знайти файли віртуальних хостів. Для досягнення цієї мети ми будемо редагувати основний конфігураційний файл Apache і додавати рядок, оголошуючи додатковий каталог для додаткових конфігураційних файлів. За допомогою командного рядка вашого улюбленого текстового редактора, відкрийте файл/etc/httpd/conf/httpd.conf:
$ sudo nano /etc/httpd/conf/httpd.conf
Додайте цей рядок в кінець файлу:
IncludeOptional sites-enabled/*.conf
Збережіть і закрийте файл, коли додасте цей рядок.
Створення нового файлу віртуального хоста
Наступним кроком є створення файлу конфігурації віртуального хоста. За допомогою командного рядка вашого улюбленого текстового редактора, створіть новий файл під / etc / httpd / sites-available. Ми назвемо файл example.com.conf, але ви можете вибрати будь-яке ім'я. Важливо, однак, щоб файл закінчувався розширенням .conf.
$ sudo nano /etc/httpd/sites-available/example.com.conf
Додайте наступний вміст в файл, замінивши example.com вашим власним доменом:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
ErrorLog /var/log/apache/example.com/error.log
</VirtualHost>
Збережіть файл і вийдіть. Нижче ви можете знайти короткий опис кожної опції конфігурації, що використовується для цього прикладу:
- ServerName: ім'я вашого головного домену.
- ServerAlias (optional): аліас для основного домену. Це звичайна практика, щоб додати WWW субдомен як аліаса (псевдоніма) основного домену.
- DocumentRoot: місце, де повинні бути знайдені файли веб-сайту. У конфігурації Apache за замовчуванням на CentOS 7, головний кореневий документ, як правило, /var/www/html, але ви можете змінити це значення, якщо ви хочете розмістити файли сайту в іншому місці на сервері.
- ErrorLog (необов'язково): призначене для користувача місце для ведення журналу помилок, характерних для даного віртуального хоста. Якщо ви не вкажете цю опцію, помилки будуть реєструватися в журналі помилок Apache за замовчуванням: /var/log/httpd/error_log.
Ввімкнення віртуального хоста
Файл віртуального хоста зараз створюється, але нам все ще потрібно сказати Apache, що ми хочемо щоб цей сайт був ввімкнений. Щоб домогтися цього, нам потрібно створити символічне посилання всередині sites-enabled, що вказує на новий файл конфігурації віртуального хоста. запустіть:
$ sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
Таким чином, всякий раз, коли ви хочете, щоб відключити віртуальний хост, ви можете просто видалити посилання всередині sites-enabled і перезавантажити службу Apache, зберігаючи вихідний файл віртуального хоста всередині sites-available для будь-яких майбутніх потреб.
Якщо ваш домен був попередньо налаштований в якості основного веб-сайту Apache всередині файлу httpd.conf, важливо видалити стару конфігурацію з цього файлу, щоб уникнути несподіваного поведінки при генерації сертифікату SSL.
Відкрийте файл /etc/httpd/conf/httpd.conf і шукайте директиви ServerName і ServerAlias. Якщо вони встановлені в тому ж домені, який ви налаштували в якості віртуального хоста, ви повинні закомментировать їх, додавши знак # на початку рядка:
$ sudo nano /etc/httpd/conf/httpd.conf
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName example.com:80
#ServerAlias www.example.com
Все, що залишилося зробити зараз - це перезапустити Apache, щоб зміни вступили в силу:
$ sudo systemctl restart httpd
Крок 2. Встановлення залежностей сервера
Перш ніж ми зможемо встановити Let's Encrypt клієнт і згенерувати сертифікат SSL, нам потрібно встановити кілька залежностей на сервері CentOS.
По-перше, встановіть репозиторій EPEL (Extra Packages for Enterprise Linux):
$ sudo yum install epel-release
Нам знадобиться git, щоб завантажити Let's Encrypt клієнт. Для встановлення git, виконайте наступну команду:
$ sudo yum install git
Тепер ви повинні бути готові слідувати решти цього керівництва.
Крок 3. Завантаження Let's Encrypt клієнта
Далі, ми будемо завантажувати Let's Encrypt клієнт з офіційного репозиторію, поміщаючи свої файли в спеціальному місці на сервері. Ми будемо робити це, щоб полегшити процес оновлення файлів сховища, коли буде доступна нова версія. Оскільки Let's Encrypt клієнт все ще знаходиться в бета-версії, можуть знадобитися часті оновлення для виправлення помилок і реалізації нових функціональних можливостей.
Ми скопіюємо репозиторій Let's Encrypt в / opt, який є стандартним каталогом для розміщення програмного забезпечення сторонніх виробників на системах Unix:
$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Це створить локальну копію офіційного репозиторію Let's Encrypt під /opt/letsencrypt.
Крок 4. Налаштування SSL-сертифіката
Створення SSL сертифікату для Apache за допомогою Let's Encrypt клієнта досить просте. Клієнт автоматично отримає і встановить новий сертифікат SSL, який дійсний для доменів, наданих в якості параметрів.
Доступ до каталогу letsencrypt:
$ cd /opt/letsencrypt
Щоб виконати інтерактивну установку і отримати сертифікат, який охоплює тільки один домен, виконайте команду letsencrypt-auto:
$ ./letsencrypt-auto --apache -d example.com
Якщо хочете встановити один сертифікат, який дійсний для декількох доменів або піддоменів, ви можете вказати їх в якості додаткових параметрів команди. Перше доменне ім'я в списку параметрів буде базовий домен, який використовується Let's Encrypt для створення сертифіката, і з цієї причини ми рекомендуємо вам вказати голе доменне ім'я верхнього рівня першим в списку, а потім - будь-які додаткові піддомени або аліаси (псевдоніми):
$ ./letsencrypt-auto --apache -d example.com -d www.example.com
Для цього прикладу, базовим доменом буде example.com.
Після того, як залежності будуть встановлені, вам буде представлено покрокове керівництво, щоб налаштувати параметри сертифіката. Вам буде запропоновано вказати адресу електронної пошти для повідомлень і відновлення втраченого ключа, і ви будете мати можливість вибирати між включенням і http і https доступу; або перенаправляти всі запити на https.
Коли встановлення успішно завершене, ви повинні побачити повідомлення, схоже на це:
Output:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to [email protected]
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-15. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
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 Let's
Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Сформовані файли сертифікатів повинні бути доступні в /etc/letsencrypt/live.
Організація ваших віртуальних хостів
Плагін Apache для Let's Encrypt створює новий віртуальний хост-файл для забезпечення доступу по протоколу https для вашого домену. Це робиться автоматично за допомогою клієнта при створенні сертифіката за допомогою плагіна Apache. Проте, файл створюється всередині sites-enabled, каталогу, який повинен містити тільки посилання для реальних файлів віртуальних хостів, які розташовані всередині каталогу sites-available.
Щоб зберегти ваші файли віртуальних хостів організованими і відповідно до значень за замовчуванням, ви можете перемістити цей новий файл віртуального хоста в каталог sites-available і створити символічне посилання всередині sites-enabled:
$ sudo mv /etc/httpd/sites-enabled/example.com-le-ssl.conf /etc/httpd/sites-available/example.com-le-ssl.conf
$ sudo ln -s /etc/httpd/sites-available/example.com-le-ssl.conf /etc/httpd/sites-enabled/example.com-le-ssl.conf
Ваш каталог sites-enabled повинен виглядати приблизно так:
lrwxrwxrwx 1 root root 48 Jan 25 12:37 example.com.conf -> /etc/httpd/sites-available/example.com.conf
lrwxrwxrwx 1 root root 55 Jan 25 12:44 example.com-le-ssl.conf -> /etc/httpd/sites-available/example.com-le-ssl.conf
Перезапустіть Apache, щоб застосувати зміни:
$ sudo systemctl restart httpd
Перевірка стану сертифіката
Ви можете перевірити статус вашого SSL сертифікату за наступним посиланням (не забудьте замінити example.com вашим базовим доменом):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
Тепер ви повинні мати можливість отримати доступ до веб-сайту, використовуючи префікс https.
Крок 5. Налаштування автоподовження
Сертифікат Let's Encrypt дійсний 90 днів, але рекомендується продовжувати термін дії сертифікатів кожні 60 днів, щоб забезпечити межі похибки. Let's Encrypt клієнт має комманду renew, яка автоматично перевіряє встановлені сертифікати і намагається продовжити їх, якщо залишилося менше ніж за 30 днів від дати закінчення терміну придатності.
Щоб запустити процес оновлення для всіх встановлених доменів, виконайте наступну команду:
./letsencrypt-auto renew
Так як ми недавно встановили сертифікат, то команда буде перевіряти тільки дату закінчення терміну дії та видасть повідомлення, що повідомляє про те, що сертифікат ще продовжувати не треба. Результат повинен виглядати приблизно так:
Checking for new version...
Requesting root privileges to run letsencrypt...
/root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Зверніть увагу, що якщо ви створили сертифікат в комплекті з кількома доменами, тільки базове ім'я домену буде показано на виході, але оновлення має бути дійсним для всіх доменів, включених в цей сертифікат.
Практичний спосіб переконатися, що ваші сертифікати не будуть застарівати - це створити cron задачу, яка буде періодично виконувати автоматичну команду продовження для вас. Оскільки оновлення спочатку перевіряє на дату закінчення терміну дії та тільки виконує оновлення сертифіката менш ніж за 30 днів від закінчення терміну дії, безпечно створити cron задачу, яка працює щотижня або навіть щодня, наприклад.
Давайте відредагуємо crontab, щоб створити нове завдання, яка буде виконувати команду оновлення щотижня. Для редагування crontab для кореневого користувача, виконайте наступну команду:
$ sudo crontab -e
Увімкніть наступний вміст, все в одному рядку:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
Збережіть і вийдіть. Це створить нову cron задачу, яка буде виконувати letsencrypt-auto renew команду щопонеділка о 2:30 ранку, і перезавантажувати Nginx о 2:35 ранку (тому оновлений сертифікат буде використовуватися). Висновок, що генерується командою буде надходити в лог-файл, розташований в /var/log/le-renewal.log.
Крок 6. Оновлення Let's Encrypt клієнта (не обов'язково)
Кожен раз, коли будуть доступні нові оновлення для клієнта, ви можете оновити локальну копію, запустивши git pull зсередини каталогу Let's Encrypt:
$ cd /opt/letsencrypt
$ sudo git pull
Це дозволить завантажити всі останні зміни в сховище, оновивши ваш клієнт.
Висновок
У цьому керівництві, ми побачили, як встановити безкоштовний SSL сертифікат від Let's Encrypt для захисту веб-сайту, розміщеного на сервері CentOS 7 з Apache. Оскільки Let's Encrypt client все ще знаходиться в бета-версії, ми рекомендуємо вам час від часу перевіряти офіційний блог Let's Encrypt на наявність оновлень.