目次

10 Docker Let's Encrypt

certbot のdockerイメージ利用

certbotをそのままインストールは→18 Let's Encrypt Certbot

Let's Encryptの証明書だけサッと利用したい場合にとても便利

※network_mode: hostで利用したい場合は、firewallも開ける

docker-compose.yml

---
version: "3"
services:
  nginx:
    image: nginx
    restart: always
    volumes:
      - /etc/nginx/conf.d:/etc/nginx/conf.d
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/html:/var/www/html
    ports:
      - 80:80
    #network_mode: host

  certbot:
    image: certbot/certbot
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/html:/var/www/html
    command: ["--version"]
    network_mode: host

Nginxのdefault.conf用意

mkdir -p /etc/nginx/conf.d

下記のdefault.confを用意しておく

/etc/nginx/conf.d/default.conf

server {
    server_name  example.com;
    listen 80;
    listen [::]:80;

    # テストとして普通に表示させる場合
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
    
    # 全てのリクエストをSSLサイトにリダイレクト
    #location / {
    #    return 301 https://$host$request_uri;
    #}

    # 例外的に証明書更新時のlet's encryptからのリクエストは80番で受ける(443に飛ばしても実は問題ない)
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
}

一回起動

これでnginxのdocker imageをダウンロードして起動してくれる。

# docker-compose up -d

証明書作成

docker-compose run --rm certbot certonly --webroot -w /var/www/html -d hogehoge.com

証明書更新

docker-compose run --rm certbot renew

証明書一覧確認

docker-compose run --rm certbot certificates

Cronでの証明書更新

2024.08.31 Docker ComposeのCron実行

NginxでSSL有効化

server {
    server_name  example.com;
    listen 80;
    listen [::]:80;

    # テストとして普通に表示させる場合
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
    
    # 全てのリクエストをSSLサイトにリダイレクト
    #location / {
    #    return 301 https://$host$request_uri;
    #}

    # 例外的に証明書更新時のlet's encryptからのリクエストは80番で受ける(443に飛ばしても実は問題ない)
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
}

server {
    server_name  example.com;

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

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=2592000" always;

    root         /var/www/html;
}