コンテナー化された 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 の処理フローを次に示します。

  1. ローカル開発証明書が存在し、dev-certs ツールを介してホスト マシン上で信頼されていることを確認します。

  2. この特定のアプリのユーザー シークレット ストアに保存されているセキュリティで保護されたパスワードを使用して、証明書を %APPDATA%\ASP.NET\Https にエクスポートします。

  3. 次のディレクトリのボリュームマウントを行います。

    • *%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」を参照してください。