leadsdoit/certbot

By leadsdoit

Updated 8 months ago

Cerbot Auto create cert

Image
Web Servers

35

leadsdoit/certbot

Данный образ основан на образе certbot/certbot:v2.11.0

Предназначен для удобного взаимодействия с nginx. Данный образ умеет при запуске генерировать все нужные файлы и сертификаты переданные в переменную $DOMAINS

Опубликовано на Docker Hub

Переменные

  • DOMAINS - принимает массив доменов для которых надо создать сертификаты. Обязательно при запуске контейнера укажите внешний volume чтоб сертификаты и вспомогательные файлы сложились в него

  • WEBROOT_PATH - не обязательная переменная, указывает папку куда cerbot будет генерить временные файлы. По умолчанию данная папка лежит в /etc/letsencrypt/httpscert потому вам достаточно подключить внешнюю папку для cerbot и nginx /etc/letsencrypt и в самом nginx прописать роут

    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt/httpscert;
    }
    

Volume

Необходимо подключить внешнее хранилище для папки /etc/letsencrypt.

Туда будут складываться сертификаты и дополнительный ключ для шифрования.

Этот же volume надо будет подключить и к nginx. Далее можно использовать в конфиге nginx

    ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

Где {domain} - это ваш домен/субдомен для данного конфига

Команды

Создать ssl-сертификат

Чтоб создать ssl-сертификат

  • Если через docker

    docker exec -it <имя контейнера> create_cert <домен>

  • Если создано через docker compose

    docker compose exec <имя сервиса> create_cert <домен>

Пример использования

version: '3.8'

services:
    certbot:
        image: leadsdoit/certbot
        restart: always
        environment:
            DOMAINS: |
                example.com
                example.org
                example.net
            # или так 
            # DOMAINS: "example.com example.org example.net"
        volumes:
            - "./cert:/etc/letsencrypt"

    nginx:
        image: nginx:stable-alpine3.19
        restart: always
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - "./cert:/etc/letsencrypt:ro"
            - "./conf/https.conf:/etc/nginx/conf.d/default.conf:ro"
            - "./conf/ssl-nginx.conf:/etc/nginx/ssl-nginx.conf:ro"

Для старта

server {
    listen 80;
    listen [::]:80;
    
    server_name {domain};

    # другие настройки    
    
    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt/httpscert;
    }
}

После генерации сертификата

Создайте общий конфиг /etc/nginx/ssl-nginx.conf куда поместите общие настройки для всех доменов настройки защищенного соединения HTTPS

listen 443 ssl;
listen [::]:443 ssl;

ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

В конфиг nginx необходимо добавить

server {
    listen 80;
    listen [::]:80;
    
    server_name {domain};

    ############################
    #
    # другие настройки NGINX
    #
    ############################
    
    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt/httpscert;
    }
    
    include /etc/nginx/ssl-nginx.conf;
    
    ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
}

Или для редиректа всегда на https

server {    
    server_name {domain};

    ############################
    #
    # другие настройки NGINX
    #
    ############################
    
    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt/httpscert;
    }
    
    include /etc/nginx/ssl-nginx.conf;
    
    ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
}

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

    server_name {domain};
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /etc/letsencrypt/httpscert;
    }

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

После изменения конфига, необходимо перечитать конфиги nginx

Тест конфига nginx -t

Для начала делаем тест конфига nginx -t

  • Если через docker

    docker exec -it <имя контейнера> nginx -t

  • Если создано через docker compose

    docker compose exec <имя сервиса> nginx -t

Обновляем конфига nginx -s reload

Если все ок, то выполняем перечитывание конфигов nginx -s reload

  • Если через docker

    docker exec -it <имя контейнера> nginx -s reload

  • Если создано через docker compose

    docker compose exec <имя сервиса> nginx -s reload

Docker Pull Command

docker pull leadsdoit/certbot