1. Блог
  2. Мануали

Безкоштовний SSL-сертифікат ZeroSSL через acme.sh

Безкоштовний SSL-сертифікат ZeroSSL через acme.sh

ZeroSSL — центр сертифікації, який, як і Let’s Encrypt, видає безкоштовні SSL-сертифікати на 90 днів за протоколом ACME. Він стане в пригоді як альтернатива або резервний варіант, якщо Let’s Encrypt недоступний або ви вперлися в його ліміти.

Два способи отримати сертифікат

  • Через сайт zerossl.com. Підходить для разового випуску, але в безкоштовному тарифі доступно лише три сертифікати, і продовжувати їх потрібно вручну.
  • Через ACME-клієнт. Кількість сертифікатів не обмежена, продовження автоматичне. Це правильний варіант для сервера.

Далі використовується клієнт acme.sh: це один скрипт на Bash без залежностей, і ZeroSSL у ньому — типовий центр сертифікації.

Крок 1. Встановлення acme.sh

curl https://get.acme.sh | sh -s email=you@example.com

Вкажіть робочу адресу: на неї зареєструється обліковий запис ZeroSSL. Інсталятор створить каталог ~/.acme.sh і завдання cron для щоденної перевірки продовження. Перечитайте налаштування оболонки:

source ~/.bashrc

Крок 2. Випуск сертифіката

Домен має вказувати на IP-адресу сервера, а порт 80 — бути доступним з інтернету. Оберіть спосіб перевірки домену.

Сайт уже працює на Nginx:

acme.sh --issue -d example.com -d www.example.com --nginx

Сайт на Apache:

acme.sh --issue -d example.com -d www.example.com --apache

Будь-який вебсервер, через каталог сайту:

acme.sh --issue -d example.com -d www.example.com -w /var/www/example.com

Вебсервера немає (acme.sh сам тимчасово займе порт 80, потрібен пакет socat):

acme.sh --issue -d example.com --standalone

Крок 3. Встановлення сертифіката

Не використовуйте файли безпосередньо з ~/.acme.sh: їхнє розташування може змінитися. Скопіюйте сертифікат у постійне місце спеціальною командою — вона ж запам’ятає, як перезавантажувати вебсервер після продовження:

acme.sh --install-cert -d example.com \
  --key-file /etc/ssl/private/example.com.key \
  --fullchain-file /etc/ssl/certs/example.com.crt \
  --reloadcmd "systemctl reload nginx"

Крок 4. Підключення в Nginx

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com www.example.com;

    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

    root /var/www/example.com;
}

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
sudo nginx -t && sudo systemctl reload nginx

У версіях Nginx до 1.25.1 замість рядка http2 on; використовується запис listen 443 ssl http2;.

Wildcard-сертифікат

Сертифікат для всіх піддоменів (*.example.com) випускається лише з перевіркою через DNS. acme.sh уміє сам створювати потрібний запис через API більшості DNS-провайдерів. Приклад для Cloudflare:

export CF_Token="токен_api"
acme.sh --issue -d example.com -d '*.example.com' --dns dns_cf

Список підтримуваних провайдерів і назви змінних є в документації acme.sh.

Продовження та керування

Продовження виконується автоматично через cron. Корисні команди:

acme.sh --list                          # усі сертифікати й дати продовження
acme.sh --renew -d example.com --force  # продовжити примусово
acme.sh --remove -d example.com         # припинити продовження
acme.sh --upgrade                       # оновити сам клієнт

Перемикання на Let’s Encrypt

Центр сертифікації можна змінити однією командою — клієнт і всі налаштування залишаться тими самими:

acme.sh --set-default-ca --server letsencrypt

Повернутися назад: --server zerossl. Для окремого сертифіката центр задається ключем --server у команді --issue.

ZeroSSL чи Let’s Encrypt

Для відвідувачів сайту різниці немає: обидва сертифікати довірені всіма браузерами. ZeroSSL зручний як запасний центр сертифікації й не має жорстких тижневих лімітів на домен. Let’s Encrypt звичніший і краще підтримується готовими інструментами на кшталт Certbot — він використовується в статті про налаштування віртуальних хостів Nginx.

Відеоінструкція

YouTube video
#ssl#zerossl#acme.sh#https#nginx

Ця стаття іншими мовами:EnglishРусский