# Установка SSL-сертификата на Nginx&#x20;

Рассмотрим, как установить SSL-сертификат от Let's Encrypt для веб-сервера Nginx на операционных системах Ubuntu и CentOS.

## Выпуск и установка Let's Encrypt

### Установка Certbot

Для выпуска сертификата воспользуемся утилитой Certbot.

{% tabs %}
{% tab title="Ubuntu" %}
Установим Certbot и плагин для Nginx:

```bash
sudo apt install certbot python3-certbot-nginx
```

{% endtab %}

{% tab title="CentOS" %}
Установим Certbot и плагин для Nginx:

```bash
sudo apt install certbot python3-certbot-nginx
```

{% endtab %}
{% endtabs %}

Теперь Certbot готов к использованию для выпуска и настройки SSL-сертификата.

### Проверка конфигурации Nginx

Certbot настроит сертификат для виртуального хоста, ориентируясь на домен, указанный в директиве `server_name`. Убедитесь, что в конфигурации Nginx указан правильный домен вашего сайта.

Откройте файл конфигурации (пример пути для Ubuntu / CentOS):

```bash
sudo nano /etc/nginx/sites-available/имя_сайта
```

Проверьте, что в директиве `server_name` указан правильный домен. Если нужно внести изменения, сделайте это, а затем сохраните файл.

Проверьте конфигурацию Nginx на наличие ошибок:

```bash
sudo nginx -t
```

Если вы вносили изменения в конфигурацию, перезапустите веб-сервер:

```bash
sudo systemctl reload nginx
```

### Получение SSL

Запустите Certbot с плагином Nginx, чтобы получить и настроить SSL-сертификат:

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

Где `example.com` и `www.example.com` — домены, которые должны быть указаны в конфигурации Nginx.

При первом запуске Certbot запросит ваш контактный email и предложит принять условия лицензионного соглашения.

После успешного завершения Certbot покажет путь к сохранённым сертификатам, например:

```
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.com and www.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2025-01-14.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/conf.d/example.com.conf
Successfully deployed certificate for www.example.com to /etc/nginx/conf.d/example.com.conf
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com
```

### Автоматическое обновление SSL-сертификатов

Сертификаты Let's Encrypt действуют 90 дней, поэтому их необходимо своевременно обновлять. Вручную:

```bash
certbot renew
```

Рекомендуется настроить автоматическое обновление с помощью cron. Откройте редактор cron:

```bash
crontab -e
```

Добавьте следующую строку:

```cron
30 3 * * 2 /usr/bin/certbot renew >> /var/log/renew-ssl.log --post-hook "systemctl reload nginx"
```

Эта задача настроит автоматическое обновление сертификатов каждый вторник в 03:30 утра. Certbot будет проверять срок действия сертификатов и, если до их истечения останется менее 30 дней, выполнит обновление. После успешного обновления Nginx будет перезагружен, чтобы начать использовать новый сертификат. Все действия Certbot будут записываться в файл `renew-ssl.log`.

## Установка существующего сертификата

Если у вас уже приобретён SSL-сертификат, установить его можно по инструкции ниже.

### Загрузка файлов сертификата на сервер

{% stepper %}
{% step %}

### Шаг 1 — Сформируйте единый .crt (сертификат + цепочка)

Обычно после покупки сертификата доступны: сам сертификат (`.crt`) и цепочка сертификатов (`.ca-bundle`) с промежуточным и корневым сертификатом.

Скопируйте их содержимое в единый файл `ваш_домен.crt`, друг под другом, без пробелов. Пример содержимого:

```
-----BEGIN CERTIFICATE-----
#Сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----
```

Если у вас есть один CRT-файл, который уже содержит всю цепочку (например, в Timeweb Cloud), используйте его целиком.

Если цепочки нет, запросите её у провайдера или сгенерируйте с помощью <https://whatsmychaincert.com/>.
{% endstep %}

{% step %}

### Шаг 2 — Получите приватный ключ

После покупки должен быть файл приватного ключа (`ваш_домен.key`). Если его нет — запросите у провайдера.

Создайте файл `ваш_домен.key` и вставьте в него содержимое приватного ключа.
{% endstep %}

{% step %}

### Шаг 3 — Загрузите файлы на сервер

Подключитесь к серверу по FTP / SFTP и загрузите файлы в директорию `/etc/ssl`.

Или подключитесь по SSH и создайте файлы вручную, например:

```bash
sudo nano /etc/ssl/mydomain.ru.crt
# вставьте содержимое сертификата и цепочки
```

Сохраните, затем:

```bash
sudo nano /etc/ssl/mydomain.ru.key
# вставьте содержимое приватного ключа
```

{% endstep %}
{% endstepper %}

### Настройка конфигурационного файла Nginx

В зависимости от настроек, нужно изменить либо основной конфиг (`/etc/nginx/nginx.conf`), либо конфиг виртуального хоста.

* Для Ubuntu: `/etc/nginx/sites-available/ваш_домен.conf`
* Для CentOS: `/etc/nginx/conf.d/ваш_домен.conf`

Откройте файл, например:

```bash
sudo nano /etc/nginx/sites-available/ваш_домен.conf
```

В блоке server{} вместо:

```nginx
listen 80;
listen [::]:80;
```

укажите:

```nginx
listen 443 ssl;
```

Под строкой:

```nginx
server_name ваш_домен www.ваш_домен;
```

укажите пути к файлам сертификата и ключа:

```nginx
ssl_certificate /etc/ssl/ваш_домен.crt;
ssl_certificate_key /etc/ssl/ваш_домен.key;
```

Чтобы перенаправлять HTTP на HTTPS, добавьте дополнительный блок server{}:

```nginx
server {
    listen 80;
    listen [::]:80;

    server_name ваш_домен www.ваш_домен;
    return 302 https://$server_name$request_uri;
}
```

(302 — временный редирект; после проверки замените на 301 при необходимости.)

Пример итоговой конфигурации:

```nginx
server {
  listen 443 ssl;

  server_name mydomain.ru www.mydomain.ru;
  ssl_certificate /etc/ssl/mydomain.ru.crt;
  ssl_certificate_key /etc/ssl/mydomain.ru.key;
  root /var/www/mydomain.ru/html;
  index index.html index.xml;
}

server {
  listen 80;
  listen [::]:80;

  server_name mydomain.ru www.mydomain.ru;
  return 302 https://$server_name$request_uri;
}
```

Этих настроек достаточно для работы сертификата. Дальше можно настроить дополнительные параметры (опционально).

### Дополнительные настройки (опционально)

{% stepper %}
{% step %}

### Опция — SSL сессии (кэш)

Добавьте в блок server{} под путями до сертификатов:

```nginx
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 70;
```

* `ssl_session_cache` — общий (shared) кэш размером 10 MB.
* `ssl_session_timeout` — таймаут кэша (приведен 10 минут).
* `keepalive_timeout` — время работы соединения (пример 70).
  {% endstep %}

{% step %}

### Опция — SSL stapling (OCSP)

Создайте файл `ca.crt` с корневым сертификатом (последний сертификат в цепочке) и разместите в `/etc/ssl`.

Включите stapling и укажите доверенный сертификат и резолвер:

```nginx
ssl_stapling on;
ssl_trusted_certificate /etc/ssl/ca.crt;
resolver 8.8.8.8;
```

Пример конфигурации с опциями:

```nginx
server {
  listen 443 ssl;

  server_name mydomain.ru www.mydomain.ru;
  ssl_certificate /etc/ssl/mydomain.ru.crt;
  ssl_certificate_key /etc/ssl/mydomain.ru.key;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  keepalive_timeout 70;
  ssl_stapling on;
  ssl_trusted_certificate /etc/ssl/ca.crt;
  resolver 8.8.8.8;

  root /var/www/mydomain.ru/html;
  index index.html index.xml;
}
```

{% endstep %}
{% endstepper %}

### Применение настроек

Проверьте конфигурацию Nginx:

```bash
sudo nginx -t
```

Перезапустите Nginx, чтобы изменения вступили в силу:

```bash
sudo systemctl restart nginx
```

Проверьте работу сайта — он должен быть доступен по HTTPS.

## Часто задаваемые вопросы (FAQ)

<details>

<summary>В каком файле найти директиву server_name?</summary>

Проверьте файл `/etc/nginx/sites-available/имя_сайта`. В качестве имени сайта может быть указан домен или другое значение — зависит от того, как настраивал Nginx ваш администратор. Часто файл `default` не используют; ищите конфигурацию в `/etc/nginx/sites-available/`.

</details>

<details>

<summary>Как понять, какой домен указывать вместо example.com?</summary>

Вместо `example.com` укажите домен вашего сайта, для которого хотите выпустить сертификат. Этот домен должен быть прописан в `server_name` конфигурации Nginx.

</details>

<details>

<summary>Что делать, если в конфигурации Nginx нет ожидаемых элементов?</summary>

Нужны подробности: опишите, какие элементы отсутствуют и на каком этапе возникла проблема. Упрощённые примеры конфигурации приведены в разделе про установку существующего сертификата.

</details>

## Ссылки

* <https://whatsmychaincert.com/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.kimaro.ru/instrukcii-dlya-unix-sistem/ustanovka-ssl-sertifikata-na-nginx.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
