Как использовать certbot для установки SSL-сертификата на домен?

Как я могу настроить certbot с использованием Docker и Nginx для выпуска SSL-сертификата Let's Encrypt? Получаю ошибку 175<ip-address>: Invalid response from http://site.ru/.well-known/acme-challenge/roKPhi6RN2yLh5VbNBSINBm2276hX7z_dnh2nOY и затем страницу 404. Мой Docker-compose файл включает сервисы frontend и certbot, и моя конфигурация Nginx внутри Docker содержит раздел location настройки для webroot. Подскажите, пожалуйста, в чем может быть проблема?
  • 16 января 2024 г. 9:38
Ответы на вопрос 2
Чтобы использовать Certbot для установки SSL-сертификата Let's Encrypt на домен с использованием Docker и Nginx, следуйте этим основным шагам:

0. Подготовьте ваше окружение:
   Убедитесь, что у вас установлен Docker и Docker Compose на сервере и вы имеете доступности всех используемых DNS-имен.

1. Создайте файл `docker-compose.yml` с контейнерами для Nginx и Certbot:
```yaml
version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    depends_on:
      - certbot

  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
```

2. Настройте конфигурацию Nginx (`./data/nginx/default.conf`), чтобы обслуживать `.well-known/acme-challenge` через корректный root:

```nginx
server {
    listen 80;
    server_name site.ru;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
        try_files $uri =404;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}
```

3. Запустите Nginx контейнер:

```bash
docker-compose up -d nginx
```

4. Запустите Certbot для получения сертификата:

```bash
docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d site.ru
```

5. Если Certbot успешно выпустил сертификат, обновите конфигурацию Nginx, чтобы включить SSL:
```nginx
server {
    listen 80;
    server_name site.ru;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name site.ru;

    ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem;

    location / {
        # Конфигурация для обслуживания вашего приложения через HTTPS
    }
}
```

6. Перезапустите Nginx, чтобы применить новую конфигурацию:

```bash
docker-compose down
docker-compose up -d nginx
```

Если возникает ошибка 404 при доступе к пути `.well-known/acme-challenge`, это может быть вызвано следующими проблемами:

- Директория `/var/www/certbot` не существует в контейнере или неправильно настроена. Убедитесь, что вы создали соответствующие тома в `docker-compose.yml`.
- DNS настройки для вашего домена неправильные или DNS изменения еще не распространились. Убедитесь, что ваш домен корректно указывает на IP-адрес сервера.
- Ошибка в конфигурации Nginx. Проверьте правильность настроек и путей в `server` блоке относящемся к `.well-known/acme-challenge`.

Попробуйте также запросы на сервере для локальной диагностики:

```bash
curl -i localhost/.well-known/acme-challenge/test
```

Это должно вернуть 404 ошибку, но без внешнего HTTP запроса, чтобы проверить, что внутренняя маршрутизация работает как задумано.
Предварительные требования: 


Допустим, у вас уже установлен certbot. Если нет, тогда выполняем:

После того, как certbot установлен, выполняем команду для получения сертификата на ваше доменное имя :

Далее проверяем наличие ключей примерно по таким путям (После установки сертификата вам напишет расположение ключей):
/etc/letsencrypt/live/yourdomainname.com/

Далее очень важно , что бы у вас уже был сервис (Именно linux сервис для выполнения процессов) вашего веб-сайта. Открываете ваш сервис и в секцию server додаёте запись:

Так же очень важно, что бы у вас в nginx уже была прописана секция для https протокола по порту 443. Так же не забудьте об настройках firewall, но это уже другая история

Далее додаём дополнительные настройки ssl. Теперь ваша секция будет выглядеть примерно следующим образом

Сохраняем файл, после чего выполняем:

Для повышения качества сертификата делаем следующие действия. Выполняем команду:

Возвращаемся в сервис вашего веб-сайта . В той же секции server дописываем следующие строки:

После этого перезагружаемся:

ГОТОВО!)
Похожие вопросы