以前にDockerを利用し、リバースプロキシとしてnginxを利用したプリザンター環境を構築しました。今回はその続きでHTTPS化(SSL/TLS)を行います。
前提
利用するソフトウェア
OS | Red Hat Enterprise Linux 10 |
.NET | 8.0.410 |
DB | PostgreSQL17 |
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_ENABLED | ForwardedHeadersMiddleware を有効にし、効果:X-Forwarded-For や X-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でサイトにアクセスしてみましょう!!
以上