WSL2 + Docker + ASP.NET Core Web アプリを https で実行する

# はじめに
前回の以下の記事では、WSL2 上の Docker で ASP.NET Core Web アプリを実行し、Visual Studio 2022(Visual Studio Cdoe ではなく) でデバッグする方法を説明しました。
- [Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築
](https://qiita.com/hiromasa-masuda/items/526c30d3914ae32565aa)

この記事では、実行したコンテナーへ http で接続を行っていたので、今回は、https で接続できるようにする方法を説明します。Windows 側の .NET CLI で自己署名証明書を作成し、WSL2 上のコンテナー起動時に同証明書を設定する方法を説明します。

# 前提条件
- WSL2(ディストリビューション: Ubuntu) に Docker CE をインストール済
    - セットアップは、[WSL2 に Docker をインストールする](https://qiita.com/hiromasa-masuda/items/4902686b404682376c29) を参照ください。
- コンテナー イメージ
    - ASP.NET Core Web アプリ(.NET 6) のビルド済イメージを使用します。
    - [Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築
](https://qiita.com/hiromasa-masuda/items/526c30d3914ae32565aa) で作成したイメージを使用します。

# .NET CLI による自己署名証明書の作成

Windows 側で、`dotnet dev-certs https -eq <PFX ファイル名> -p <PFX ファイルのパスワード>` を実行し、自己署名証明書を作成します。以下の `NetCoreWebAppOnWslDocker001.pfx`、`PfxFilePassword` の部分は、任意に指定してください。
```console:cmd
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` を実行し、自己署名証明書を信頼します。
```console:cmd
dotnet dev-certs https --trust
```
[セキュリティ警告] - [はい] を選択します。カレントユーザーの証明書ストアの [信頼されたルート証明機関] に、自己署名証明書が登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/847b337d-4573-f5c8-1b23-08804cce6dbb.png)

# Windows 環境変数を WSL へ共有
Windows 側で %USERPROFILE% 以下へ出力した PFX ファイルのパスを WSL で参照するために、環境変数 USERPROFILE を WSL 側へ共有します。
Windows 側で、`setx <環境変数名> <値>` を実行してください。カレントユーザーの環境変数に WSLENV、値 USERPROFILE/up を追加します。"/up" は、オプションで、Windows 側から、WSL 側へパスを変換して環境変数を共有します。
 ```console:cmd
setx WSLENV USERPROFILE/up
```
上記のコマンド実行後、WSL のシェルを起動している場合は、ログアウトし、シェルを起動しなおしてください。Windows Terminal を使用している場合は、Windows Terminal を再起動するか、あたらしいプロセスを起動して以降の手順を実行してください。Windows Terminal のタブで、WSL のシェルを起動しても環境変数の共有が行われませんでした。

WSL のシェルを起動して、環境変数 USERPROFILE が共有されていることを確認します。
```bash:WSL
echo $USERPROFILE
```
次に、WSL 側から、環境変数を含めたパスで、Windows 側で作成した PFX が参照できることを確認します。
```bash:WSL
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 のパスワードを指定しています。
```bash:WSL
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 アプリにアクセスして、正しく動作することを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172205/94d30392-707b-3a44-c5a7-1f505017ab03.png)

# まとめ
Windows 側の .NET CLI で自己署名証明書を %USERPROFILE% 以下に保存し、WSL 側から環境変数で参照できるようにしました。自己署名証明書の作成方法は、いくつかの方法があると思いますが、.NET CLI だと容易に作成できます。
また、作成した自己署名証明書をコンテナーイメージに含めず、コンテナー起動時に証明書を指定し、https で接続する方法も説明しました。

# 参考
- [dotnet dev-certs](https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-dev-certs)
- [Share Environment Vars between WSL and Windows
](https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/)
- [HTTPS 経由で Docker を使用して ASP.NET Core イメージをホストする](https://learn.microsoft.com/ja-jp/aspnet/core/security/docker-https)
- [.NET CLI を使用して自己署名証明書を生成する](https://learn.microsoft.com/ja-jp/dotnet/core/additional-tools/self-signed-certificates-guide)
- [Visual Studio 2022 + WSL2 + Docker で ASP.NET Core Web アプリのリモート デバッグ環境構築
](https://qiita.com/hiromasa-masuda/items/526c30d3914ae32565aa)