はじめに
前回の以下の記事では、WSL2 上の Docker で ASP.NET Core Web アプリを実行し、Visual Studio 2022(Visual Studio Cdoe ではなく) でデバッグする方法を説明しました。
この記事では、実行したコンテナーへ http で接続を行っていたので、今回は、https で接続できるようにする方法を説明します。Windows 側の .NET CLI で自己署名証明書を作成し、WSL2 上のコンテナー起動時に同証明書を設定する方法を説明します。
前提条件
- WSL2(ディストリビューション: Ubuntu) に Docker CE をインストール済
- セットアップは、WSL2 に Docker をインストールする を参照ください。
- コンテナー イメージ
- ASP.NET Core Web アプリ(.NET 6) のビルド済イメージを使用します。
-
Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築
で作成したイメージを使用します。
.NET CLI による自己署名証明書の作成
Windows 側で、dotnet dev-certs https -eq <PFX ファイル名> -p <PFX ファイルのパスワード>
を実行し、自己署名証明書を作成します。以下の NetCoreWebAppOnWslDocker001.pfx
、PfxFilePassword
の部分は、任意に指定してください。
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\NetCoreWebAppOnWslDocker001.pfx -p PfxFilePassword
カレントユーザーの証明書ストアの [個人] に、自己署名証明書が、フレンドリ名: ASP.NET Core HTTPS development certificate で登録され、%USERPROFILE%\.aspnet\https\
ディレクトリに、指定した名前の PFX ファイルが出力されます。
次に、dotnet dev-certs https --trust
を実行し、自己署名証明書を信頼します。
dotnet dev-certs https --trust
[セキュリティ警告] - [はい] を選択します。カレントユーザーの証明書ストアの [信頼されたルート証明機関] に、自己署名証明書が登録されます。
Windows 環境変数を WSL へ共有
Windows 側で %USERPROFILE% 以下へ出力した PFX ファイルのパスを WSL で参照するために、環境変数 USERPROFILE を WSL 側へ共有します。
Windows 側で、setx <環境変数名> <値>
を実行してください。カレントユーザーの環境変数に WSLENV、値 USERPROFILE/up を追加します。"/up" は、オプションで、Windows 側から、WSL 側へパスを変換して環境変数を共有します。
setx WSLENV USERPROFILE/up
上記のコマンド実行後、WSL のシェルを起動している場合は、ログアウトし、シェルを起動しなおしてください。Windows Terminal を使用している場合は、Windows Terminal を再起動するか、あたらしいプロセスを起動して以降の手順を実行してください。Windows Terminal のタブで、WSL のシェルを起動しても環境変数の共有が行われませんでした。
WSL のシェルを起動して、環境変数 USERPROFILE が共有されていることを確認します。
echo $USERPROFILE
次に、WSL 側から、環境変数を含めたパスで、Windows 側で作成した PFX が参照できることを確認します。
ls $USERPROFILE/.aspnet/https/
コンテナーの起動
docker run
でコンテナーを起動します。
-v
で、PFX ファイルの格納場所: $USERPROFILE/.aspnet/https/ をコンテナーの /https/ にマウントしています。
-e
で、コンテナーの環境変数を設定しています。
ASPNETCORE_HTTPS_PORT では、HTTP 要求を HTTPS にリダイレクトする際のリダイレクト先のポートを指定しています。ASPNETCORE_Kestrel__Certificates__Default__Path では、マウントしたパスを起点とした PFX ファイルの場所、ASPNETCORE_Kestrel__Certificates__Default__Password では、PFX のパスワードを指定しています。
docker run -d --rm --name netcorewebapp001 \
-p 8080:80 -p 8081:443 \
-v $USERPROFILE/.aspnet/https/:/https/ \
-e ASPNETCORE_URLS="https://+;http://+" \
-e ASPNETCORE_HTTPS_PORT=8081 \
-e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/NetCoreWebAppOnWslDocker001.pfx \
-e ASPNETCORE_Kestrel__Certificates__Default__Password="PfxFilePassword" \
hiromasa/netcorewebapp001
https で Web アプリにアクセスして、正しく動作することを確認します。
まとめ
Windows 側の .NET CLI で自己署名証明書を %USERPROFILE% 以下に保存し、WSL 側から環境変数で参照できるようにしました。自己署名証明書の作成方法は、いくつかの方法があると思いますが、.NET CLI だと容易に作成できます。
また、作成した自己署名証明書をコンテナーイメージに含めず、コンテナー起動時に証明書を指定し、https で接続する方法も説明しました。