Как использовать 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 запроса, чтобы проверить, что внутренняя маршрутизация работает как задумано.
Предварительные требования: <br/> <br/> <br/> Допустим, у вас уже установлен certbot. Если нет, тогда выполняем: <br/> <br/> После того, как certbot установлен, выполняем команду для получения сертификата на <b>ваше доменное имя</b> : <br/> <br/> Далее проверяем наличие ключей примерно по таким путям (После установки сертификата вам напишет расположение ключей): <br/> <i>/etc/letsencrypt/live/yourdomainname.com/</i> <br/> <br/> Далее <b>очень важно</b> , что бы у вас уже был сервис (Именно linux сервис для выполнения процессов) вашего веб-сайта. Открываете ваш сервис и в секцию server додаёте запись: <br/> <br/> <b>Так же очень важно, что бы у вас в nginx уже была прописана секция для https протокола по порту 443. Так же не забудьте об настройках firewall, но это уже другая история</b> <br/> <br/> Далее додаём дополнительные настройки ssl. Теперь ваша секция будет выглядеть примерно следующим образом <br/> <br/> Сохраняем файл, после чего выполняем: <br/> <br/> Для повышения качества сертификата делаем следующие действия. Выполняем команду: <br/> <br/> Возвращаемся в <b>сервис вашего веб-сайта</b> . В той же секции server дописываем следующие строки: <br/> <br/> После этого перезагружаемся: <br/> <br/> <b>ГОТОВО!)</b>
Похожие вопросы