ローカル開発のための自己署名SSL証明書の作成方法

ローカル開発のための自己署名SSL証明書の作成方法

ローカルでの開発時、SSLを使って何かやるときに必要な時があると思います。 ローカルだけで使える自己署名SSL証明書の作成する方法を記述します。 以下、Dockerコンテナ内で動作するNginxサーバー用に自己署名SSL証明書を生成する手順を説明します。

ステップ1: ディレクトリの設定

まず、SSL証明書と鍵を保存するディレクトリを作成します。構造化されたディレクトリを使用すると、プロジェクトが整理されます。以下のコマンドで設定できます:

mkdir -p /あなたのプロジェクトのパス/docker/nginx/ssl

/あなたのプロジェクトのパスをSSLファイルを保存したい実際のパスに置き換えてください。

ステップ2: SSL証明書の生成

自己署名SSL証明書と鍵を生成するために、OpenSSLコマンドを使用します。以下のコマンドは、証明書と鍵を生成し、指定したディレクトリに保存します:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /あなたのプロジェクトのパス/docker/nginx/ssl/server.key -out /あなたのプロジェクトのパス/docker/nginx/ssl/server.crt

このコマンドにより、有効期間365日の2048ビットRSA鍵を使用してSSL証明書が生成されます。次に表示されるプロンプトでは、国名、州または地域名、地域の市町村名、会社名、組織部門名、共通名(FQDNまたはあなたの名前)、電子メールアドレスなど、証明書に含める情報を入力します。

詳細情報入力例

  • 国名 (2文字コード): JP
  • 州・省名: Tokyo
  • 市町村名: Chiyoda
  • 会社名: MyCompany
  • 部門名: IT
  • 共通名: localhost
  • メールアドレス: admin@example.com

ステップ3: Diffie-Hellmanパラメータの生成

SSL通信の安全性を高めるために、Diffie-Hellmanグループのパラメータを生成することが推奨されます。これには以下のコマンドを使用します:

openssl dhparam -out /あなたのプロジェクトのパス/docker/nginx/ssl/dhparam 2048

default.conf

upstream backend {
    server keycloak:8080 fail_timeout=2s;
}

server {
    listen 443 default_server ssl ;
    listen [::]:443 default_server ssl ;
    http2 on;

    server_name localhost;

    ssl_certificate /ssl/server.crt;
    ssl_certificate_key /ssl/server.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_dhparam /ssl/dhparam;

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

    resolver 127.0.0.11 valid=1s;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        # proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Server $host;
        proxy_pass http://backend;
        proxy_redirect http:// https://;
        proxy_connect_timeout 2s;
    }
}

docker compose YAML

services:
  keycloak:
    build:
      context: ./keycloak
      dockerfile: Dockerfile
    environment:
      KC_DB_URL_HOST: host.docker.internal
      KC_DB_URL_DATABASE: keycloakdb
      KC_DB_USERNAME: hogehoge
      KC_DB_PASSWORD: hogehoge
      KC_HOSTNAME_URL:  http://localhost:4000/auth
      KC_HOSTNAME_ADMIN_URL:  http://localhost:4000/auth
      KC_HOSTNAME_STRICT: true
      KC_HOSTNAME_STRICT_BACKCHANNEL: true
      KC_PROXY: edge
      KC_HTTP_ENABLED: true
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password
      TZ: Asia/Tokyo
    command:
      - "-v"
      - start
      - "--optimized"

  nginx:
    image: nginx:latest
    ports:
      - "8080:8080"
      - "443:443"
    volumes:
      - ./nginx/conf.d/staging.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/ssl:/ssl
    depends_on:
      keycloak:
        condition: service_started

関連記事