プリザンター+nginx環境のhttps化(RHEL10/Docker利用)

office1 システム開発全般
office1

以前にDockerを利用し、リバースプロキシとしてnginxを利用したプリザンター環境を構築しました。今回はその続きでHTTPS化(SSL/TLS)を行います。

前提

利用するソフトウェア

OSRed Hat Enterprise Linux 10
.NET8.0.410
DBPostgreSQL17
Webサーバーnginx 1.25.1
Pleasanterプリザンター 1.4.0.0以降(最新版を利用)

nginxのリバースプロキシ設定

以下の記事を参考にポート80でリバースプロキシ環境が出来ていることを前提とします。

自己証明書の作成

以下の記事を参考に自己証明書を作成してください。

nginx.confの設定

nginx.confを以下のように修正します。

server {
    listen 443 ssl;
    server_name <IPアドレス or ホスト名>
    root /var/www/html;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    client_max_body_size 100M;

    location / {
       proxy_pass         http://localhost:8080;
       proxy_http_version 1.1;
       proxy_set_header   Upgrade $http_upgrade;
       proxy_set_header   Host $host;
       proxy_cache_bypass $http_upgrade;
       proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

・「listen 443 ssl;」で443ポートを待ち受け
・「ssl_certificate」と「ssl_certificate_key」でTLS証明書と暗号鍵を指定
・「ssl_protocols」で利用可能なTLSバージョンを指定
・「ssl_ciphers」で利用可能な暗号を指定
・「location」でプロキシ設定をしています。ポイントは「proxy_pass」です。ここでは受け付けたリクエストを「http://localhost:8080;」へ転送するよう指定しています。
・「X-Forwarded-Proto」ヘッダーを付与することで、プリザンターへhttps経由のリクエストであることを伝えます。

docker-compose.ymlの設定

docker-compose.ymlを以下のように修正します。

version: '3'
services:
  db:
    container_name: postgres
    image: docker.io/postgres:17
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_HOST_AUTH_METHOD=${POSTGRES_HOST_AUTH_METHOD}
      - POSTGRES_INITDB_ARGS=${POSTGRES_INITDB_ARGS}
    volumes:
      - pg_data:/var/lib/postgresql/data

  pleasanter:
    container_name: pleasanter
    image: docker.io/implem/pleasanter:latest #完全修飾イメージ名で指定
    depends_on:
      - db
    ports:
      - "8080:8080"
    environment:
      - Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
      - Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
      - Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
      - ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
      - ASPNETCORE_FORWARDEDHEADERS_KNOWNNETWORKS=0.0.0.0/0
      - ASPNETCORE_FORWARDEDHEADERS_KNOWNPROXIES=127.0.0.1 # nginxホストのIPを指定

  codedefiner:
    container_name: codedefiner
    image: docker.io/implem/pleasanter:codedefiner #完全修飾イメージ名で指定
    depends_on:
      - db
    environment:
      - Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
      - Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
      - Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}

  nginx:
    container_name: nginx
    image: docker.io/library/nginx:1.25.1-alpine
    depends_on:
      - pleasanter
    # ホストネットワークで起動することで、nginx の内部の "localhost:8080" が
    # ホストの8080番に向かうようにします。
    network_mode: "host"

    ports:
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./html:/var/www/html:ro
      - /etc/nginx/ssl:/etc/nginx/ssl:ro
    environment:
     - TZ=Asia/Tokyo

volumes:
  pg_data:

ポイントはプリザンターのenvironmentに指定している以下の3行です。これはプリザンターの仕様ではなくASP.NET Coreに対する設定になります。

- ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
- ASPNETCORE_FORWARDEDHEADERS_KNOWNNETWORKS=0.0.0.0/0
- ASPNETCORE_FORWARDEDHEADERS_KNOWNPROXIES=127.0.0.1 # nginxホストのIPを指定
変数内容
ASPNETCORE_FORWARDEDHEADERS_ENABLEDForwardedHeadersMiddleware を有効にし、効果X-Forwarded-ForX-Forwarded-Proto などのヘッダーを ASP.NET Core が正しく解釈できるようにします。
ASPNETCORE_FORWARDEDHEADERS_KNOWNNETWORKS信頼できるネットワークの範囲を指定します。
ASPNETCORE_FORWARDEDHEADERS_KNOWNPROXIES信頼できるプロキシの IP アドレスを指定します。network_mode: host を使っている場合、nginx と プリザンター は同じネットワーク空間にいるため、127.0.0.1 で OK です。

コンテナ再起動とHTTPS接続

これで設定は完了です。コンテナを再起動します。

podman-compose down
podman-compose up -d

httpsでサイトにアクセスしてみましょう!!

以上

タイトルとURLをコピーしました