Добавлен скрипт для автоматизации получения и обновления SSL сертификатов Let's Encrypt с использованием API reg.ru. Реализованы функции для работы с DNS-валидацией, логирования, проверки сертификатов и управления ими. Также создан bash-скрипт для упрощения процесса получения wildcard сертификата и обновления существующих сертификатов. Добавлена документация по настройке Nginx Proxy Manager с использованием полученного сертификата.

This commit is contained in:
Dmitriy Fofanov
2025-10-27 20:59:15 +03:00
parent f7de3d27b0
commit 07a65ffbba
8 changed files with 2498 additions and 51 deletions

555
README.md
View File

@@ -1,79 +1,532 @@
# Подробная инструкция по настройке Nginx Proxy Manager с одним глобальным SSL сертификатом для всех доменов dfv24.com
# Руководство по использованию скриптов для управления SSL сертификатами Let's Encrypt с DNS-валидацией через API reg.ru
## Предпосылки
- Установлен и запущен [Nginx Proxy Manager](http://192.168.10.14:81/)
- Основной домен: dfv24.com
- Хостинг и DNS записи домена находятся на reg.ru
- Нужно использовать один SSL сертификат (например, wildcard) для всех поддоменов dfv24.com
## Содержание
1. [Введение](#введение)
2. [Требования](#требования)
3. [Установка зависимостей](#установка-зависимостей)
4. [Настройка](#настройка)
5. [Использование Bash скрипта](#использование-bash-скрипта)
6. [Использование Python скрипта](#использование-python-скрипта)
7. [Автоматизация обновления](#автоматизация-обновления)
8. [Устранение неполадок](#устранение-неполадок)
---
## Шаг 1. Покупка и получение SSL Wildcard сертификата для dfv24.com
1. На reg.ru или любом другом удостоверяющем центре (CA) закажите wildcard сертификат на домен вида `*.dfv24.com`.
2. Получите файлы сертификата:
- Главный сертификат (CRT)
- Промежуточные сертификаты (CA Bundle)
- Приватный ключ (KEY)
## Введение
В проекте представлены два скрипта для автоматического создания и обновления SSL сертификатов Let's Encrypt с использованием DNS-валидации через API reg.ru:
1. **letsencrypt_regru_dns.sh** - Bash скрипт с использованием плагина certbot-dns-regru
2. **letsencrypt_regru_api.py** - Python скрипт с прямым взаимодействием с API reg.ru
Оба скрипта поддерживают:
- Создание wildcard сертификатов (*.domain.com)
- Автоматическое обновление сертификатов
- DNS-валидацию через API reg.ru
- Логирование всех операций
- Перезагрузку веб-сервера после обновления
---
## Шаг 2. Импорт вашего SSL сертификата в Nginx Proxy Manager
1. Авторизуйтесь в Nginx Proxy Manager на http://192.168.10.14:81/
2. Перейдите в раздел **SSL Certificates** → кнопку **Add SSL Certificate**
3. Выберите **Custom** (пользовательский сертификат)
4. В поля вставьте:
- **Certificate** — основной CRT + CA Bundle (если CA Bundle раздельно, склейте в один файл или вставляйте последовательно)
- **Key** — содержимое приватного ключа
- Имя сертификата задайте, например, `dfv24_wildcard`
5. Сохраните
## Требования
### Общие требования
- Операционная система: Linux (Ubuntu/Debian/CentOS)
- Права: root или sudo
- Домен зарегистрирован на reg.ru
- Доступ к API reg.ru (имя пользователя и пароль)
### Для Bash скрипта
- certbot
- certbot-dns-regru (плагин)
- curl
- jq
- openssl
### Для Python скрипта
- Python 3.6+
- certbot
- pip3
- Модули Python: requests, cryptography
---
## Шаг 3. Настройка прокси-хостов с использованием глобального сертификата
## Установка зависимостей
1. Перейдите в **Proxy Hosts****Add Proxy Host**
2. Заполните поля:
- **Domain Names**: Например, `sub1.dfv24.com` (для первого поддомена)
- **Scheme**: http или https, в зависимости от бекенда
- **Forward Hostname / IP**: IP или DNS адрес вашего внутреннего сервиса
- **Forward Port**: порт сервиса (например, 80 или 443)
3. Включите **SSL** → Отметьте **Use a shared SSL certificate** (если такая опция доступна) или выберите ранее импортированный сертификат из списка
4. Активируйте: **Block Common Exploits**, **Websockets Support**, выставьте Redirect HTTP to HTTPS, если требуется
5. Сохраните прокси-хост
### Ubuntu/Debian
6. Повторите для всех поддоменов, указывая нужные домены и выбирая тот же wildcard SSL сертификат
```bash
# Обновление пакетов
sudo apt-get update
# Установка базовых зависимостей
sudo apt-get install -y certbot curl jq openssl python3 python3-pip
# Для Python скрипта
sudo pip3 install certbot-dns-regru requests cryptography
# Для Bash скрипта (если используете)
sudo pip3 install certbot-dns-regru
```
### CentOS/RHEL
```bash
# Обновление пакетов
sudo yum update -y
# Установка EPEL репозитория
sudo yum install -y epel-release
# Установка базовых зависимостей
sudo yum install -y certbot curl jq openssl python3 python3-pip
# Установка плагина
sudo pip3 install certbot-dns-regru requests cryptography
```
---
## Шаг 4. Настройка DNS записей на reg.ru
## Настройка
1. Войдите в панель управления доменом на reg.ru
2. Создайте или отредактируйте DNS записи типа A:
- `dfv24.com` → IP вашего Nginx Proxy Manager (например, 192.168.10.14)
- `*.dfv24.com` → тот же IP или конкретные поддомены, если есть специальные
3. Сохраните изменения
4. Дождитесь обновления DNS (от нескольких минут до 24 часов)
### 1. Получение учетных данных API reg.ru
1. Войдите в личный кабинет на сайте [reg.ru](https://www.reg.ru)
2. Перейдите в раздел "Управление API"
3. Используйте ваше имя пользователя и пароль для доступа к API
4. Убедитесь, что у вас есть права на управление DNS-записями
### 2. Настройка конфигурации
#### Для Python скрипта
Создайте файл конфигурации на основе примера:
```bash
# Создание примера конфигурации
sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json
# Редактирование конфигурации
sudo nano /etc/letsencrypt/regru_config.json
```
Отредактируйте параметры:
```json
{
"regru_username": "your_actual_username",
"regru_password": "your_actual_password",
"domain": "dfv24.com",
"wildcard": true,
"email": "admin@dfv24.com",
"cert_dir": "/etc/letsencrypt/live",
"log_file": "/var/log/letsencrypt_regru.log",
"dns_propagation_wait": 60,
"dns_check_attempts": 10,
"dns_check_interval": 10
}
```
#### Для Bash скрипта
Отредактируйте переменные в начале скрипта:
```bash
sudo nano letsencrypt_regru_dns.sh
```
Измените следующие параметры:
```bash
REGRU_USERNAME="your_actual_username"
REGRU_PASSWORD="your_actual_password"
DOMAIN="dfv24.com"
WILDCARD_DOMAIN="*.dfv24.com"
EMAIL="admin@dfv24.com"
```
### 3. Установка прав доступа
```bash
# Для Bash скрипта
sudo chmod +x letsencrypt_regru_dns.sh
# Для Python скрипта
sudo chmod +x letsencrypt_regru_api.py
# Защита файла конфигурации
sudo chmod 600 /etc/letsencrypt/regru_config.json
```
---
## Шаг 5. Тест и проверка работы
## Использование Bash скрипта
1. В браузере откройте любой из поддоменов `https://sub1.dfv24.com`
2. Сертификат должен быть валидным, выданным на wildcard `*.dfv24.com`
3. Проверьте работу прокси и корректность подстановки сертификата
4. При необходимости проверьте логи Nginx Proxy Manager и исправьте ошибки
### Первый запуск (получение сертификата)
```bash
sudo ./letsencrypt_regru_dns.sh
```
Скрипт автоматически:
1. Проверит зависимости
2. Создаст файл с учетными данными
3. Установит плагин certbot-dns-regru (если не установлен)
4. Проверит наличие существующего сертификата
5. Получит новый сертификат или обновит существующий
6. Перезагрузит веб-сервер
### Просмотр логов
```bash
sudo tail -f /var/log/letsencrypt_regru.log
```
### Ручная проверка сертификата
```bash
sudo certbot certificates
```
---
## Дополнительно
## Использование Python скрипта
- Если в Nginx Proxy Manager нет GUI опции выбора общего сертификата, можно вручную сконфигурировать конфиги через директорий `/data/nginx/proxy_host` и прописать SSL сертификат для всех хостов.
- При обновлении сертификата — повторно импортировать его в Nginx Proxy Manager.
- Можно использовать LetsEncrypt для автоматического получения wildcard сертификата с помощью DNS-валидации (если поддерживается вашим DNS-провайдером).
### Создание примера конфигурации
```bash
sudo python3 letsencrypt_regru_api.py --create-config /etc/letsencrypt/regru_config.json
```
### Получение нового сертификата
```bash
# С использованием конфигурационного файла
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain
# С подробным выводом
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --obtain -v
```
### Обновление существующего сертификата
```bash
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --renew
```
### Проверка срока действия сертификата
```bash
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json --check
```
### Автоматический режим (проверка и обновление)
```bash
# Скрипт сам определит, нужно ли обновление
sudo python3 letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json
```
### Опции командной строки
```
-c, --config FILE Путь к файлу конфигурации (JSON)
--create-config FILE Создать пример файла конфигурации
--obtain Получить новый сертификат
--renew Обновить существующий сертификат
--check Проверить срок действия сертификата
-v, --verbose Подробный вывод
```
---
# Итог
## Автоматизация обновления
Используйте один wildcard сертификат для всех поддоменов, импортируйте его как пользовательский сертификат в Nginx Proxy Manager, при создании прокси-хостов выбирайте его в настройках SSL. Управляйте DNS записями на reg.ru, направляя domен на IP Nginx Proxy Manager.
Это позволит юридически использовать единый сертификат для всех сервисов с различными поддоменами под вашим доменом dfv24.com.
Let's Encrypt сертификаты действительны 90 дней. Рекомендуется настроить автоматическое обновление.
### Использование cron (для обоих скриптов)
#### Для Python скрипта
```bash
# Открыть crontab
sudo crontab -e
# Добавить задачу (проверка каждый день в 3:00 AM)
0 3 * * * /usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json >> /var/log/letsencrypt_cron.log 2>&1
```
#### Для Bash скрипта
```bash
# Открыть crontab
sudo crontab -e
# Добавить задачу (проверка каждый день в 3:00 AM)
0 3 * * * /path/to/letsencrypt_regru_dns.sh >> /var/log/letsencrypt_cron.log 2>&1
```
### Использование systemd timer
Создайте systemd service и timer для более гибкого управления:
#### Создание service файла
```bash
sudo nano /etc/systemd/system/letsencrypt-regru.service
```
Содержимое:
```ini
[Unit]
Description=Let's Encrypt Certificate Renewal with reg.ru DNS
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /path/to/letsencrypt_regru_api.py -c /etc/letsencrypt/regru_config.json
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
```
#### Создание timer файла
```bash
sudo nano /etc/systemd/system/letsencrypt-regru.timer
```
Содержимое:
```ini
[Unit]
Description=Daily Let's Encrypt Certificate Check and Renewal
Requires=letsencrypt-regru.service
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=1h
[Install]
WantedBy=timers.target
```
#### Активация timer
```bash
# Перезагрузка systemd
sudo systemctl daemon-reload
# Включение и запуск timer
sudo systemctl enable letsencrypt-regru.timer
sudo systemctl start letsencrypt-regru.timer
# Проверка статуса
sudo systemctl status letsencrypt-regru.timer
sudo systemctl list-timers
```
---
## Устранение неполадок
### Проблема: Ошибка аутентификации API reg.ru
**Решение:**
- Проверьте правильность имени пользователя и пароля
- Убедитесь, что у вашего аккаунта есть доступ к API
- Проверьте, что домен находится под управлением вашего аккаунта
```bash
# Проверка доступа к API
curl -X POST "https://api.reg.ru/api/regru2/user/get_balance" \
-d "username=YOUR_USERNAME" \
-d "password=YOUR_PASSWORD" \
-d "output_format=json"
```
### Проблема: DNS запись не распространяется
**Решение:**
- Увеличьте параметр `dns_propagation_wait` в конфигурации (например, до 120 секунд)
- Проверьте DNS записи вручную:
```bash
nslookup -type=TXT _acme-challenge.dfv24.com
# или
dig TXT _acme-challenge.dfv24.com
```
### Проблема: Certbot не установлен
**Решение:**
```bash
# Ubuntu/Debian
sudo apt-get install certbot
# CentOS/RHEL
sudo yum install certbot
# Или через snap
sudo snap install --classic certbot
```
### Проблема: Плагин certbot-dns-regru не найден
**Решение:**
```bash
# Установка через pip
sudo pip3 install certbot-dns-regru
# Или через pip3 с обновлением
sudo pip3 install --upgrade certbot-dns-regru
```
### Проблема: Недостаточно прав
**Решение:**
- Убедитесь, что запускаете скрипт от имени root или с sudo
- Проверьте права доступа к директории `/etc/letsencrypt/`
```bash
sudo chmod 755 /etc/letsencrypt/
sudo chown -R root:root /etc/letsencrypt/
```
### Проблема: Ошибка при перезагрузке веб-сервера
**Решение:**
- Проверьте, какой веб-сервер используется:
```bash
systemctl status nginx
systemctl status apache2
```
- Вручную перезагрузите веб-сервер:
```bash
# Для Nginx
sudo systemctl reload nginx
# Для Apache
sudo systemctl reload apache2
```
### Просмотр подробных логов certbot
```bash
# Логи certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log
# Логи скрипта
sudo tail -f /var/log/letsencrypt_regru.log
```
### Тестовый режим (staging)
Для тестирования используйте staging окружение Let's Encrypt:
```bash
# Добавьте опцию --staging к команде certbot
certbot certonly --staging --dns-regru ...
```
---
## Проверка полученного сертификата
### Просмотр информации о сертификате
```bash
# Просмотр всех сертификатов
sudo certbot certificates
# Просмотр конкретного сертификата
sudo openssl x509 -in /etc/letsencrypt/live/dfv24.com/cert.pem -text -noout
# Проверка даты истечения
sudo openssl x509 -enddate -noout -in /etc/letsencrypt/live/dfv24.com/cert.pem
```
### Проверка сертификата в браузере
1. Откройте ваш сайт в браузере: `https://dfv24.com`
2. Нажмите на иконку замка в адресной строке
3. Проверьте информацию о сертификате
4. Убедитесь, что сертификат выдан Let's Encrypt и покрывает wildcard домен
### Онлайн проверка SSL
- [SSL Labs](https://www.ssllabs.com/ssltest/)
- [SSL Shopper](https://www.sslshopper.com/ssl-checker.html)
---
## Использование сертификата в Nginx Proxy Manager
После получения сертификата вы можете использовать его в Nginx Proxy Manager:
### Вариант 1: Импорт существующего сертификата
1. Войдите в Nginx Proxy Manager: http://192.168.10.14:81/
2. Перейдите в **SSL Certificates****Add SSL Certificate**
3. Выберите **Custom**
4. Вставьте содержимое файлов:
- Certificate Key: `/etc/letsencrypt/live/dfv24.com/privkey.pem`
- Certificate: `/etc/letsencrypt/live/dfv24.com/fullchain.pem`
5. Сохраните сертификат
### Вариант 2: Прямая настройка Nginx
Если вы используете Nginx напрямую, добавьте в конфигурацию:
```nginx
server {
listen 443 ssl http2;
server_name dfv24.com *.dfv24.com;
ssl_certificate /etc/letsencrypt/live/dfv24.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dfv24.com/privkey.pem;
# Дополнительные SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# ... остальная конфигурация
}
```
---
## Поддержка и вопросы
При возникновении проблем:
1. Проверьте логи: `/var/log/letsencrypt_regru.log`
2. Проверьте логи certbot: `/var/log/letsencrypt/letsencrypt.log`
3. Используйте подробный режим: `-v` для Python скрипта
4. Проверьте документацию reg.ru API: https://www.reg.ru/support/api
5. Проверьте документацию Let's Encrypt: https://letsencrypt.org/docs/
---
## Заключение
Оба скрипта предоставляют надежное решение для автоматического управления SSL сертификатами Let's Encrypt с использованием DNS-валидации через API reg.ru.
**Рекомендации:**
- Используйте Python скрипт для более гибкой настройки и интеграции
- Используйте Bash скрипт для простоты и минимальных зависимостей
- Настройте автоматическое обновление через cron или systemd timer
- Регулярно проверяйте логи и статус сертификатов
- Храните учетные данные в безопасности (chmod 600)
Успешной автоматизации! 🔒