• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Let’s Encrypt wildcard сертифікат

Зміст

 

Для чого потрібний 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

Оновлення на серверній ОС Ubuntu

Потім встановимо веб-сервер Nginx:

1) Команда для OC Ubuntu:

sudo apt install nginx

Встановлення веб-сервера Nginx

2) Команда для OC CentOS:

sudo yum install nginx

Потім наш домен треба додати як віртуальний хост на веб-сервер 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>

Вихідний код для index.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;
}
}

Редагування virtual.conf

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

#Virtual Hosts
178.20.153.253   letsencrypt.co.ua

Редагування файлу /etc/hosts

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

/etc/init.d/nginx restart

Перезавантаження веб-сервера Nginx

/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:

Отримання API токену у Cloudflare

Процес отримання API токену у Cloudflare

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

Налаштування зони DNS у Cloudflare

Після цього, натисніть “Continue to summary”, щоб побачити “Edit zone DNS API token summary”.

Насамкінець, скопіюйте токен, який ви побачите на екрані, для отримання доступу до Cloudflare API. Тримайте цей токен у секреті.

Отримано API токен у Cloudflare

Перевіряємо правильну роботу токена командою:

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

Встановлення клієнта 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

Переглянути параметри сервісу acme.sh можна за допомогою наступних команд:

source /root/.bashrc
acme.sh --list
acme.sh --version

Параметри сервісу acme.sh

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'

Процес випуску Let’s Encrypt wildcard сертифікату

Успішний випуск Let’s Encrypt wildcard сертификату

Якщо ви працюєте з криптографією на основі еліптичних кривих (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

Перевірка ключа Cloudflare DNS API

Перевірка ключа Cloudflare DNS API командою grep

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

Перевірка роботи 443 порту через браузер

7. Автоматичне продовження Let’s Encrypt wildcard сертифікату

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

crontab -l

Відобразиться приблизно наступна інформація (див. скріншот нижче):

8 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Автоматичне продовження Let’s Encrypt wildcard сертификату через crontab

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

./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: використовується для примусового випуску або негайного оновлення сертифікату.

Примусовий випуск сертифікату SSL за допомогою acme.sh

Після виконання робіт з випуску або примусового продовження сертифікату необхідно перезапустити веб-сервер (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
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA