Стаття також доступна російською (перейти до перегляду).

Зміст
- Для чого потрібний Let’s Encrypt wildcard сертифікат
- Підготовчі роботи з встановлення та конфігурування веб-сервера Nginx
- Покроковий процес первинного випуску wildcard сертифікату Let’s Encrypt
- 1. Отримуємо Cloudflare API токен.
- 2. Інсталюємо acme.sh клієнт.
- 3. Випускаємо Let’s Encrypt wildcard сертифікат.
- 4. Конфігуруємо веб-сервер Nginx.
- 5. Інсталюємо Let’s Encrypt wildcard сертифікат.
- 6. Перевіряємо роботу сайту за https.
- 7. Автоматичне продовження Let’s Encrypt wildcard сертифікату.
- Примусове оновлення сертифікату Let's Encrypt
- Команди certbot для оновлення сертифікатів Let's Encrypt
- Команди acme. sh для оновлення сертифікатів Let's Encrypt.
- Висновок
Для чого потрібний Let’s Encrypt wildcard сертифікат
SSL-сертифікати (англ. Secure Sockets Layer) потрібні для організації захищеного доступу до сайту за https. Як правило, видача SSL-сертифікату не безкоштовна, але існує такий сервіс, як Let's Encrypt, за допомогою якого можна абсолютно безкоштовно випустити сертифікат для свого сайту.
Останнім часом Let's Encrypt дозволяє також випускати і безкоштовні wildcard сертифікати, які ми можемо отримати не на один домен (наприклад, на site.org), а на цілу групу піддоменів *.site.org (приміром, example1.site.org, example2.site.org тощо). Загалом, для веб-майстра значно спрощена процедура отримання та продовження сертифікату ssl.
У цій статті ми покажемо, як випустити та продовжити ssl сертифікат на веб-сервері Nginx під Linux (Ubuntu 20) за допомогою утиліти ACME.sh, розповімо як за допомогою сервісу Cloudflare DNS API можна отримати токен для нашого домену. Зупинимося і на способах оновлення SSL-сертифікату.
Підготовчі роботи з встановлення та конфігурування веб-сервера Nginx
Всі дії будемо проводити з тестовим доменом letsencrypt.co.ua. Перед тим, як почати процес встановлення, необхідно виконати оновлення на серверній ОС Ubuntu:
apt update && apt full-upgrade -y

Потім встановимо веб-сервер Nginx:
1) Команда для OC Ubuntu:
sudo apt install nginx

2) Команда для OC CentOS:
sudo yum install nginx
Потім наш домен треба додати як віртуальний хост на веб-сервер Nginx, для цього виконаємо наступні дії:

1) Створюємо каталог для нового сайту, замість letsencrypt.co.ua підставте ім'я свого домена (параметр -p потрібний для автоматичної генерації каталогів):
mkdir -p /var/www/letsencrypt.co.ua/public_html
2) Виставимо права на папку, щоб ми мали можливість читати файли в ній:
chmod 755 /var/www
3) В редакторі nano створюємо новий файл index.html у вже створеному нами каталозі:
nano /var/www/letsencrypt.co.ua/public_html/index.html
4) Поміщаємо у файл наступний вихідний код:
<html> <head> <title>letsencrypt.co.ua</title> </head> <body> <h1>Hello!!!!!!!!Cool!!!!!!</h1> </body> </html>

5) Зараз відредагуємо файл з налаштуваннями nginx:
nano /etc/nginx/conf.d/virtual.conf
Необхідно вписати наступні рядки у файл (вказати ім'я домена, кореневу папку тощо):
#
# A virtual host using mix of IP-, name-, and port-based configuration
#
server {
listen 80;
# listen *:80;
server_name letsencrypt.co.ua;
location / {
root /var/www/letsencrypt.co.ua/public_html/;
index index.html index.htm;
}
}

6) Тепер відредагуємо файл nano /etc/hosts (пропишемо відповідність нашого домена IP-адресі VPS):
#Virtual Hosts 178.20.153.253 letsencrypt.co.ua

7) Для того, щоб усі наші налаштування набрали чинності, виконаємо рестарт Nginx командою:
/etc/init.d/nginx restart

/etc/init.d/nginx restart
8) Щоб перевірити, чи працює наш сайт і чи прив'язаний він до IP, відкриємо браузер і наберемо:
letsencrypt.co.ua
Як ми бачимо на скриншоті нижче, наша тестова сторінка відображається, значить все налаштовано правильно.

Покроковий процес первинного випуску wildcard сертифікату Let’s Encrypt
1. Отримуємо Cloudflare API токен
Спершу, нам необхідно зареєструватися в Cloudflare та отримати там API токен. Ці дії нам потрібні для свідчення нашого права на володіння доменом (для Let’s Encrypt). Після реєстрації в сервісі, заходимо в панель керування Cloudflare та отримаємо API токен, виконавши наступні дії (див. скріншоти нижче):
"Create Token” > “Edit zone DNS” > Use template:


Переконайтеся, що ви налаштували DNS дозволи для редагування та увімкнули зону для свого доменного імені (наприклад, для letsencrypt.co.ua), див. скріншот:

Після цього, натисніть “Continue to summary”, щоб побачити “Edit zone DNS API token summary”.
Насамкінець, скопіюйте токен, який ви побачите на екрані, для отримання доступу до Cloudflare API. Тримайте цей токен у секреті.

Перевіряємо правильну роботу токена командою:
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" -H "Authorization: Bearer yourtokenhere" -H "Content-Type:application/json"

2. Інсталюємо acme.sh клієнт
На наступному етапі, необхідно встановити клієнт acme.sh, для цього виконаємо наступні команди (клонуємо репозиторій acme.sh за допомогою команди git):
cd /tmp/ git clone https://github.com/Neilpang/acme.sh.git

Для подальших дій необхідно працювати як користувач з правами root, для цього виконайте:
sudo -i touch /root/.bashrc cd /tmp/acme.sh/ EMAIL="myemail@domen.com" ./acme.sh --install --accountemail "$EMAIL"
На скріншоті нижче показаний процес інсталяції acme.sh.

Переглянути параметри сервісу acme.sh можна за допомогою наступних команд:
source /root/.bashrc acme.sh --list acme.sh --version

3. Випускаємо Let’s Encrypt wildcard сертифікат
Після встановлення та конфігурування веб-сервера Nginx, отримання Cloudflare API токена та інсталяції acme.sh, саме час розпочати випуск wildcard сертифікату для домену letsencrypt.co.ua.
Перейдемо в каталог cd /root/.acme.sh для подальших дій.
Спочатку налаштуємо CF_Token за допомогою команди експорту таким чином:
# Export single variable for the CloudFlare DNS challenge to work # export CF_Token="Your_Cloudflare_DNS_API_Key_Goes_here"
Визначати змінні оболонки CF_Account_ID та CF_Zone_ID нам не треба, оскільки вони будуть автоматично витягнуті файлом acme.sh. Потім запросимо сертифікат для домену:
./acme.sh --issue --dns dns_cf --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua -d '*.letsencrypt.co.ua'


Якщо ви працюєте з криптографією на основі еліптичних кривих (ECC/ECDSA) замість RSA, то синтаксис команди буде наступним:
./acme.sh --issue --dns dns_cf --ocsp-must-staple --keylength ec-384 -d letsencrypt.co.ua -d '*.letsencrypt.co.ua'
Наш ключ Cloudflare DNS API знаходиться у файлі /root/.acme.sh/account.conf, перевірити його можливо за допомогою команди cat або grep:
cat /root/.acme.sh/account.conf grep '_CF_' /root/.acme.sh/account.conf


4. Конфігуруємо веб-сервер Nginx
На цьому етапі нам необхідно переконатися в тому, що файл обміну ключами Діффі-Геллмана вже створений:
mkdir -pv /etc/nginx/ssl/letsencrypt.co.ua/ openssl dhparam -out /etc/nginx/ssl/dhparams.pem 4096 acme.sh --issue --nginx --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua
Потім створимо та відредагуємо файл конфігурації нашого домена letsencrypt.co.ua:
nano /etc/nginx/conf.d/letsencrypt.co.ua.conf
Занесемо туди наступні рядки:
# Port 80 config
server {
listen 80 default_server; # IPv4
listen [::]:80 default_server; # IPv6
server_name www.letsencrypt.co.ua;
access_log off;
error_log off;
root /var/www/html;
return 301 https://$host$request_uri;
}
# Port 443 config
server {
listen 443 ssl http2; # IPv4
listen [::]:443 ssl http2; # HTTP/2 TLS IPv6
server_name www.letsencrypt.co.ua; # domain name
# Set document root
location / {
root /var/www/html;
index index.html;
}
# Set access and error log for this vhos
access_log /var/log/nginx/letsencrypt.co.ua_access.log;
error_log /var/log/nginx/letsencrypt.co.ua_error.log;
# TLS/SSL CONFIG
ssl_certificate /etc/nginx/ssl/letsencrypt.co.ua/letsencrypt.co.ua.fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/letsencrypt.co.ua/letsencrypt.co.ua.key;
ssl_dhparam /etc/nginx/ssl/dhparams.pem;
# A little bit of optimization
ssl_session_timeout 1d;
ssl_session_cache shared:NixCraftSSL:10m;
# TLS version 1.2 and 1.3 only
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header Feature-policy "accelerometer 'none'; camera 'none'; geolocation 'none';
gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'" always;
add_header content-security-policy "default-src https://www.letsencrypt.co.ua:443" always; # OCSP stapling
# Verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/letsencrypt.co.ua/letsencrypt.co.ua.fullchain.cer;
# Replace with the IP address of your resolver
resolver 1.1.1.1;
}
5. Інсталюємо Let’s Encrypt wildcard сертифікат
Зараз необхідно приступити до встановлення сертифікату (при необхідності, замініть команду systemctl reload nginx відповідно до інструкції вашого дистрибутиву Linux):
DOMAIN="letsencrypt.co.ua"
CONFIG_ROOT="/etc/nginx/ssl/${DOMAIN}"
acme.sh -d "$DOMAIN" --install-cert --reloadcmd "systemctl reload nginx" --fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer" --key-file "${CONFIG_ROOT}/$DOMAIN.key" --cert-file "${CONFIG_ROOT}/$DOMAIN.cer"
Якщо ви використовуєте ECC/ECDSA, то синтаксис команди буде виглядати таким чином:
DOMAIN="letsencrypt.co.ua"
CONFIG_ROOT="/etc/nginx/ssl/${DOMAIN}"
acme.sh -d "$DOMAIN" --ecc --install-cert --reloadcmd "systemctl reload nginx" --fullchain-file "${CONFIG_ROOT}/$DOMAIN.fullchain.cer.ecc" --key-file "${CONFIG_ROOT}/$DOMAIN.key.ecc" --cert-file "${CONFIG_ROOT}/$DOMAIN.cer.ecc"
6. Перевіряємо роботу сайту за https
Перед перевіркою переконаємося, що TCP-порт 443 сервера Nginx у нас відкритий, якщо він ще не відкритий, тоді це можна зробити за допомогою команди (для Ubuntu або Debian Linux):
sudo ufw allow https comment 'Open all to access Nginx port 443'
Запускаємо веб-браузер і вводимо URL:
https://letsencrypt.co.ua

7. Автоматичне продовження Let’s Encrypt wildcard сертифікату
Оновлення буде відбуватися автоматично через cronjob, щоб переглянути усі завдання в cron, введіть команду:
crontab -l
Відобразиться приблизно наступна інформація (див. скріншот нижче):
8 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Якщо виникне необхідність, ми можемо зробити оновлення вручну:
./acme.sh --renew --force --dns dns_cf --ocsp-must-staple --keylength 4096 -d letsencrypt.co.ua -d '*. letsencrypt.co.ua'
У наступному розділі ми більш детально опишемо процедуру продовження ssl сертифікату.
Примусове оновлення сертифікату Let's Encrypt
Для ОС Лінукс існують декілька способів випуску та оновлення сертифікату Let's Encrypt, нижче розглянемо найбільш популярні способи продовження сертифікату ssl.
Як продовжити сертифікат https автоматично через cronjob, ми описали в попередньому розділі статті.
Отже, ми завжди можемо примусово оновити наш сертифікат Let's Encrypt, навіть якщо його термін дії ще не збіг. Для цього можна використати наступні сервіси:
- certbot, необхідно виконати команду certbot Renew --force-Renewal (для вказівки конкретного домену потрібно використовувати параметр -d):
certbot -d domen.ua,www.domen.ua --force-renewal
- acme.sh, для примусового оновлення ssl сертифікату використовується команда:
acme.sh -f -r -d domen.ua
Якщо термін дії вашого сертифікату для домену закінчився, ви отримаєте повідомлення від сервісу Let's Encrypt.
Системний адміністратор зобов'язаний стежити за сертифікатами Let's Encrypt, які були отримані для всіх доменів, що належать компанії, а саме:
- випускати сертифікати для нових доменів;
- оновлювати сертифікати ssl, якщо у них збіг термін дії або примусово продовжувати сертифікати (за потребою);
- за необхідності відкликати сертифікати.
Нижче покажемо приклади синтаксису команд для примусового оновлення сертифікатів Let's Encrypt, як за допомогою сервісу certbot, так і використовуючи утиліту acme.sh.
Команди certbot для оновлення сертифікатів Let's Encrypt
Загальний синтаксис команди :
certbot --force-renewal
Синтаксис команди з використанням параметра -d:
certbot --force-renewal -d domain-name-1-here,domain-name-2-here
Для отримання довідки щодо використання всіх опцій certbot, застосуйте такі команди:
certbot --help certbot --help all
Використати команди grep або egrep (для пошуку та фільтрації потрібних нам даних) можна таким чином:
certbot --help all | grep -i force certbot --help all | egrep -i 'renewal|force'
Команди acme.sh для оновлення сертифікатів Let's Encrypt
Загальний синтаксис:
acme.sh -f -r -d {your-domain-here}
acme.sh --force --renew --domain {your-domain-name-here}
Приклад використання команди для нашого домену:
acme.sh -f -r -d letsencrypt.co.ua
Де:
--renew АБО -r: продовжити сертифікат; --domain АБО -d: вказує домен; --force АБО -f: використовується для примусового випуску або негайного оновлення сертифікату.

Після виконання робіт з випуску або примусового продовження сертифікату необхідно перезапустити веб-сервер (Nginx або Apache) за допомогою наступних команд (відповідно до інструкції вашого дистрибутиву Лінукс).
Для Nginx:
sudo service nginx reload
Для Apache:
sudo service httpd reload
Висновок
У цій статті ми розповіли, як отримати та продовжити ssl сертифікат абсолютно безкоштовно за допомогою сервісу Let's Encrypt для основного домену та усіх його піддоменів. Також докладно описано процес конфігурування веб-сервера Nginx, використання сервісу Cloudflare та утиліти ACME.sh для випуску wildcard Let's Encrypt сертифікату.
Цей матеріал буде корисний системним адміністраторам та веб-майстрам корпоративних сайтів. Фахівці компанії FREEhost.UA завжди проконсультують Вас з питань випуску та оновлення ssl сертифікату для ваших доменів.
|
Дата: 12.02.2021 Автор: Євген
|
|

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus