Выпуск сертификатов для сайтов через reversproxy

В качестве reversproxi используется nginx. Автоматизация с помощью ansible.

Вариант 1. Одной командой в консоли

Просто перечислите все домены по очереди. Первым указывайте основной домен:

bash

sudo certbot certonly --webroot \
  -w /var/www/letsencrypt \
  -d mydomen.ru \
  -d www.mydomen.ru \
  -d app.mydomen.ru \
  -d crm.mydomen.ru \
  --deploy-hook "nginx -s reload" \
  --non-interactive \
  --agree-tos \
  -m mymail@.mydomen.ru \
  --cert-name mydomen-bundle

Важные параметры:

  • -d имя_сайта — повторяется для каждого домена (Let’s Encrypt позволяет добавлять до 100 доменов в один сертификат).
  • --cert-name mydomen-bundle — задает фиксированное имя для папки с сертификатом (/etc/letsencrypt/live/mydomen-bundle/). Если этого не сделать, Certbot назовет папку по имени самого первого домена, что может запутать при добавлении новых сайтов.

Вариант 2. Автоматизация через Ansible (Мультидоменный)

Создайте или обновите ваш файл issue_multi_cert.yml:

yaml

---
- name: Выпуск единого SSL сертификата для группы сайтов
  hosts: proxy_servers
  become: yes
  vars:
    certbot_email: "mymail@mydomain.ru"
    webroot_path: "/var/www/letsencrypt"
    # Имя папки, где будет лежать общий сертификат
    cert_bundle_name: "mydomain-bundle"
    # Список доменов, которые войдут в один сертификат
    domains_list:
      - "mydomain.ru"
      - "www.mydomain.ru"
      - "app.mydomain.ru"
      - "crm.mydomain.ru"

  tasks:
    - name: Шаг 1. Проверить наличие общей папки webroot
      ansible.builtin.file:
        path: "{{ webroot_path }}"
        state: directory
        owner: www-data
        group: www-data
        mode: '0755'

    - name: Шаг 2. Выпуск единого сертификата (SAN)
      ansible.builtin.command: >
        certbot certonly --webroot
        -w {{ webroot_path }}
        {{ domains_list | map('regex_replace', '^(.*)$', '-d \1') | join(' ') }}
        --cert-name {{ cert_bundle_name }}
        --deploy-hook "nginx -s reload"
        --non-interactive
        --agree-tos
        -m {{ certbot_email }}
      args:
        # Плейбук не будет делать лишних запросов, если бандл уже создан
        creates: "/etc/letsencrypt/live/{{ cert_bundle_name }}/fullchain.pem"
      register: certbot_output

    - name: Шаг 3. Мягкий перезапуск Nginx для применения ключей
      ansible.builtin.service:
        name: nginx
        state: reloaded

Строка {{ domains_list | ... }} автоматически превратит ваш список YAML в плоскую строку вида -d домен1 -d домен2 для команды Certbot.


Настройка Nginx для всех этих сайтов.

Так как сертификат теперь один на всех, файлы конфигурации Nginx (блоки server для порта 443) для всех этих сайтов будут ссылаться на одни и те же пути.

Пример для app.mydomain.ru:

nginx

server {
    listen 443 ssl;
    server_name app.mydomain.ru;
    # Ссылаемся на общее имя бандла, которое мы указали в --cert-name
    ssl_certificate /etc/letsencrypt/live/mydomain-bundle/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain-bundle/privkey.pem;

    location / {
        proxy_pass https://внутренний_ip_приложения:443;
        # ... заголовки проксирования
    }
}

Для сайтов crm..., www... и самого корня конфигурация будет идентичной, изменятся только директивы server_name и proxy_pass.

Чтобы расширить список доменов:

  1. Вручную или в Ansible добавить новый домен в общую команду (или список domains_list).
  2. Запустить команду/плейбук заново, удалив параметр creates: (или добавьте флаг --expand в ручную команду). Certbot увидит, что список доменов изменился, перевыпустит один этот файл, добавив туда новый сайт, и Nginx обновит его на лету.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *