コンテナー化された ASP.NET Core アプリに SSL を使用する
SSL (Secure Sockets Layer) は、HTTP (HTTPS) 経由の安全な接続を提供します。 この方法では、接続を保護するために証明書が使用されます。また、コンテナ化されたアプリでは、セキュリティ保護されたエントリ ポイントとセキュリティ保護されていないエントリ ポイントで、異なるポート マッピングが使用されます。
マルチコンテナー アプリのアーキテクチャは、セキュリティ要件によって異なります。 一部のアプリ設計では、外部エンドポイントには HTTPS が使用されますが、コンテナー間の内部通信には HTTP が使用されます。 セキュリティの高い環境では、安全な外部境界内でのみアクセス可能なコンテナー間の通信であっても、すべての通信に HTTPS が使用されることがあります。
ポートとポート マッピング
Dockerfile には、セキュリティで保護されていない HTTP またはセキュリティで保護された HTTPS を介して外部トラフィックにポートを公開するためのディレクティブが含まれています。 また、.NET 8 以降では、コンテナー化されたアプリは一般ユーザーとして実行されますが、それより前の .NET バージョンでは、コンテナー化されたアプリは管理者として実行されます。 管理者として実行する場合、アプリは HTTP トラフィック用の特権ポート 80 と HTTPS トラフィック用の 443 にアクセスできます。 昇格された特権のないユーザーとしてアプリを実行する場合、HTTP にはポート 8080、HTTPS にはポート 8081 が使用されます。 ポートは、Visual Studio が生成する Dockerfile の EXPOSE コマンドに指定されます。 Dockerfile で指定されたコンテナー内のポートは、起動設定ファイルで指定されたマッピングを使用してホスト ポートにマップされます。 「コンテナー ツールの起動設定」を参照してください。 コンテナーの実行中は、[コンテナー] ウィンドウでポート マッピングを表示できます。 「コンテナーを表示および診断する」を参照してください。
証明書
Visual Studio のコンテナー ツールは、コンテナーがない場合に想定される方法で、開発証明書を使用した SSL 対応 ASP.NET Core アプリのデバッグをサポートしています。 それを実現するために、Visual Studio では、証明書をエクスポートしてコンテナーで使用できるようにするために、さらにいくつかの手順を追加しています。 コンテナーでデバッグするときの Visual Studio の処理フローを次に示します。
ローカル開発証明書が存在し、
dev-certs
ツールを介してホスト マシン上で信頼されていることを確認します。この特定のアプリのユーザー シークレット ストアに保存されているセキュリティで保護されたパスワードを使用して、証明書を
%APPDATA%\ASP.NET\Https
にエクスポートします。次のディレクトリのボリュームマウントを行います。
*%APPDATA%\Microsoft\UserSecrets
*%APPDATA%\ASP.NET\Https
ASP.NET Core により、Https フォルダー以下のアセンブリ名に一致する証明書が検索されます。これが、そのパスのコンテナーにマップされる理由です。 または、環境変数 (つまり、ASPNETCORE_Kestrel__Certificates__Default__Path
および ASPNETCORE_Kestrel__Certificates__Default__Password
) を使用して、またはユーザー シークレット json ファイルで証明書パスとパスワードを定義できます。次に例を示します。
{
"Kestrel": {
"Certificates": {
"Default": {
"Path": "c:\\app\\mycert.pfx",
"Password": "strongpassword"
}
}
}
}
構成でコンテナー化されたビルドとコンテナー化されていないビルドの両方がサポートされている場合は、環境変数を使用する必要があります。これは、パスがコンテナー環境に固有であるためです。
コンテナー内の ASP.NET Core アプリで SSL を使用する方法の詳細については、「HTTPS 経由で Docker を使用して ASP.NET Core イメージをホストする」を参照してください。
ホストと HTTPS サービス間通信用のコンテナーで信頼されているマルチサービス アプリのカスタム証明書の作成を示すコード サンプルについては、「CertExample」を参照してください。