> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/web/ustanovka-besplatnogo-ssl-sertifikata-lets-encrypt-na-server-s-nginx-ili-apache.md](https://docs.f3cloud.com/ru/web/ustanovka-besplatnogo-ssl-sertifikata-lets-encrypt-na-server-s-nginx-ili-apache.md).

# SSL Let's Encrypt для Nginx и Apache через Certbot

Как бесплатно получить SSL-сертификат Let's Encrypt через Certbot для сайта на Nginx или Apache. Выпуск и подключение HTTPS одной командой, автопродление, проверка срока, несколько доменов и разбор частых ошибок.

**SSL-сертификат** нужен, чтобы сайт открывался по защищённому протоколу HTTPS. Тогда данные между посетителем и сервером шифруются, браузер показывает замок рядом с адресом, а не предупреждение «Не защищено».

**Let's Encrypt** выдаёт такие сертификаты бесплатно, а программа **Certbot** получает их, сама подключает к Nginx или Apache и потом сама продлевает. Все команды ниже мы проверили на Debian 12, на Ubuntu они работают так же.

***

## Что нужно до начала

* **Домен**, у которого A-запись указывает на IP-адрес сервера. Проверить это можно командой `getent hosts example.com`, она должна показать IP вашего сервера.
* **Сайт уже открывается** по адресу `http://ваш-домен` на Nginx или Apache. Как настроить Nginx, мы рассказали в [отдельной статье](https://docs.f3cloud.com/ru/web/nginx-installation.md).
* Открытый **порт 80**, ведь Let's Encrypt проверяет домен именно через него. Если включён брандмауэр, откройте порты 80 и 443, как показано в статье [о брандмауэре](https://docs.f3cloud.com/ru/vps/security/firewall.md).

> **Если у домена есть AAAA-запись.**
>
> Let's Encrypt сначала проверяет домен по IPv6. Если AAAA-запись ведёт на другой сервер или сайт по IPv6 не настроен, проверка провалится. Укажите в AAAA-записи IPv6-адрес этого сервера или удалите её.

***

## 1. Установите Certbot

#### Nginx

```bash
# Устанавливаем Certbot и его модуль для Nginx
apt update && apt install -y certbot python3-certbot-nginx
```

#### Apache

```bash
# Устанавливаем Certbot и его модуль для Apache
apt update && apt install -y certbot python3-certbot-apache
```

***

## 2. Выпустите сертификат

Одна команда получает сертификат, подключает его к сайту и включает переадресацию с `http://` на `https://`. Через `-d` перечислите все адреса сайта, обычно это домен с `www` и без.

#### Nginx

```bash
certbot --nginx -d example.com -d www.example.com
```

<figure><img src="https://docs.f3cloud.com/img/ssl-nginx-issue.png" alt="Успешный выпуск сертификата через certbot --nginx"><figcaption><p>Сертификат выпущен и подключён к Nginx</p></figcaption></figure>

#### Apache

```bash
certbot --apache -d example.com -d www.example.com
```

<figure><img src="https://docs.f3cloud.com/img/ssl-apache-issue.png" alt="Успешный выпуск сертификата через certbot --apache"><figcaption><p>Сертификат выпущен и подключён к Apache</p></figcaption></figure>

При первом запуске Certbot задаст несколько вопросов:

1. **Почта** – на неё приходят важные уведомления об аккаунте.
2. **Условия Let's Encrypt** – напишите `Y`, чтобы принять их.
3. **Рассылка EFF** – по желанию, можно ответить `N`.

Если в конце написано `Congratulations! You have successfully enabled HTTPS`, всё готово. Откройте сайт по адресу `https://ваш-домен`, рядом с адресом появится замок.

Certbot сам дописал нужные строки в настройки сайта, они помечены комментарием `# managed by Certbot`. В Nginx это файл сайта в `/etc/nginx/sites-available`.\
В Apache рядом с вашим файлом появится новый с окончанием `-le-ssl.conf`.

***

## 3. Проверьте сертификат

```bash
# Показываем все сертификаты на сервере
certbot certificates
```

<figure><img src="https://docs.f3cloud.com/img/ssl-certificates.png" alt="Список сертификатов с датой окончания"><figcaption><p>Сертификат действует ещё 89 дней</p></figcaption></figure>

В строке **Expiry Date** видна дата окончания.\
В скобках `VALID` указано, сколько дней сертификат ещё будет действовать.

Ниже указаны пути к файлам сертификата и ключа, если они понадобятся для других программ.

***

## 4. Убедитесь, что продление работает

Сертификаты Let's Encrypt выдаются на короткий срок. Сейчас это 90 дней, а к 2028 году Let's Encrypt постепенно сократит срок до 45 дней. Продлевать вручную ничего не нужно. Certbot дважды в день проверяет сертификаты и сам обновляет те, у которых срок подходит к концу.

Проверьте, что продление сработает, пробным запуском. Он ничего не меняет на сервере.

```bash
# Пробное продление всех сертификатов
certbot renew --dry-run
```

<figure><img src="https://docs.f3cloud.com/img/ssl-renew-dry-run.png" alt="Успешное пробное продление сертификата"><figcaption><p>Пробное продление прошло успешно</p></figcaption></figure>

Если в конце написано `Congratulations, all simulated renewals succeeded`, сертификат будет продлеваться сам.

***

## Несколько доменов на одном сервере

Для каждого сайта запустите Certbot отдельно, указав его домены. Чтобы добавить новый адрес к уже выпущенному сертификату, перечислите все старые адреса и новый, добавив ключ `--expand`.

```bash
# Добавляем поддомен shop к сертификату example.com
certbot --nginx --expand -d example.com -d www.example.com -d shop.example.com
```

> **Лимиты Let's Encrypt.**
>
> Один и тот же набор доменов можно выпустить не больше 5 раз за 7 дней.\
> Неудачных проверок одного домена допускается не больше 5 в час.
>
> Поэтому если что-то не получается, сначала найдите причину в разделе ниже и только потом запускайте Certbot снова.

***

## Получить сертификат без настройки сервера

Если вы хотите подключить сертификат вручную или он нужен другой программе, используйте `certonly`. Certbot только получит сертификат и ничего не изменит в настройках.

#### Через Nginx или Apache

```bash
# Certbot сам проходит проверку через работающий веб-сервер.
# Для Apache замените --nginx на --apache
certbot certonly --nginx -d example.com
```

#### Через папку сайта

```bash
# Подходит для любого веб-сервера. Укажите в -w папку,
# из которой сайт отдаёт файлы
certbot certonly --webroot -w /var/www/example.com -d example.com
```

#### Без веб-сервера

```bash
# Certbot сам ненадолго займёт порт 80. Если на нём работает
# веб-сервер, сначала остановите его
certbot certonly --standalone -d example.com
```

Готовые файлы лежат в папке `/etc/letsencrypt/live/example.com/`. Файл `fullchain.pem` – это сертификат.\
Файл `privkey.pem` – это закрытый ключ, его никому нельзя передавать.

***

## Частые ошибки

<details>

<summary>Timeout during connect (likely firewall problem)</summary>

Let's Encrypt не смог подключиться к серверу по порту 80. Чаще всего его закрывает брандмауэр. Откройте порты 80 и 443 и запустите Certbot снова. Проверить, что веб-сервер вообще слушает порт 80, можно командой `ss -tlnp | grep ':80 '`.

</details>

<details>

<summary>DNS problem: NXDOMAIN looking up A</summary>

У домена нет A-записи. Добавьте её у регистратора домена, указав IP-адрес сервера. Новая запись начинает работать не сразу, иногда приходится немного подождать. Проверьте результат командой `getent hosts example.com` и после этого запускайте Certbot.

</details>

<details>

<summary>unauthorized: Invalid response … 404</summary>

Let's Encrypt открыл домен, но не нашёл проверочный файл. Обычно домен указывает на другой сервер, например A-запись осталась от старого хостинга, или AAAA-запись ведёт не туда. Сравните IP в DNS с IP вашего сервера. Если вы используете `--webroot`, проверьте, что в `-w` указана та папка, из которой сайт отдаёт файлы.

</details>

<details>

<summary>Could not automatically find a matching server block</summary>

Сертификат получен, но Certbot не нашёл в настройках Nginx сайт с этим доменом. Впишите домен в директиву `server_name` в настройках сайта, проверьте их командой `nginx -t`, перезагрузите Nginx и подключите уже выпущенный сертификат командой `certbot install --cert-name example.com`.

</details>

<details>

<summary>too many certificates или too many failed authorizations</summary>

Сработали лимиты Let's Encrypt, и нужно подождать, пока они сбросятся.\
Лимит на неудачные проверки действует час.\
Лимит на повторный выпуск действует неделю.

Чтобы спокойно отладить настройки, запускайте Certbot с ключом `--dry-run`, пробные запуски на рабочие лимиты не влияют.

</details>

<details>

<summary>Сертификат истёк и не продлился сам</summary>

Продлите его вручную командой `certbot renew` и посмотрите, не появились ли ошибки. Чаще всего это одна из проблем выше, например закрытый порт 80. Проверить, что таймер продления включён, можно командой `systemctl list-timers | grep certbot`.\
Подробности последних запусков записаны в файле `/var/log/letsencrypt/letsencrypt.log`.

</details>

<details>

<summary>Можно ли получить сертификат на все поддомены сразу?</summary>

Да, это wildcard-сертификат вида `*.example.com`. Но для него Let's Encrypt проверяет домен через DNS-запись, а не через сайт, поэтому способы из этой статьи не подойдут. Обычно проще выпустить сертификат на нужные поддомены через несколько ключей `-d`.

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Сайт хостинга:** [https://f3cloud.com](https://f3cloud.com/ru)
