HTTPS 経由で Docker を使用して ASP.NET Core イメージをホストする

作成者: Rick Anderson

ASP.NET Core では、既定で HTTPS が使用されます。 HTTPS は、信頼、ID、暗号化を証明書に依存します。

このドキュメントでは、.NET コマンド ライン インターフェイス (CLI) を使用して、ビルド済みのコンテナー イメージを HTTPS で実行する方法について説明します。 Visual Studio を使用した開発環境で Docker を実行する方法については、「Developing ASP.NET Core Applications with Docker over HTTPS (HTTPS 経由で Docker を使用した ASP.NET Core アプリケーションの開発)」をご覧ください。

このサンプルには、Docker 17.06 以降の Docker クライアントが必要です。

前提条件

最新の .NET SDK

証明書

ドメインの運用環境のホスティングには、証明機関からの証明書が必要です。 Let's Encrypt は、無料の証明書を提供する証明機関です。

このドキュメントでは、localhost 上で構築済みのイメージをホストするために自己署名開発証明書 を使用します。 手順は、運用証明書の使用に似ています。 dotnet dev-certs によって生成される証明書を使用できるのは localhost のみであり、Kubernetes のような環境では "使用できません"。 Kubernetes クラスター内で HTTPS をサポートするには、「Manage TLS Certificates in a Cluster (クラスターで TLS 証明書を管理する)」で提供されているツールを使って、ポッド内で TLS を設定します。

dotnet dev-certs を使って、開発とテスト用の自己署名証明書を作成します。

運用証明書の場合:

  • dotnet dev-certs ツールは必要ありません。
  • 証明書を、手順で使用されている場所に格納する必要はありません。 どこでも動作しますが、ご自分のサイト ディレクトリ内に証明書を格納することはお勧めしません。

次のセクションに記載されている手順では、Docker の -vコマンド ライン オプションを使って、コンテナーへの証明書のボリューム マウントを行います。 DockerfileCOPY コマンドを使用してコンテナー イメージに証明書を追加することもできますが、お勧めはしません。 証明書をイメージにコピーすることは、次の理由からお勧めされません。

  • 開発者証明書を使用したテストに同じイメージを使用するのが難しくなります。
  • 運用証明書を使用したホスティングに同じイメージを使用するのが難しくなります。
  • 証明書の公開には大きなリスクがあります。

HTTPS を使用した事前ビルド済みコンテナー イメージの実行

オペレーティング システム構成については、次の手順を使用します。

Linux コンテナーを使用した Windows

証明書を生成して、ローカル コンピューターを構成します。

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

上記のコマンドで、<CREDENTIAL_PLACEHOLDER> をパスワードに置き換えます。

コマンド シェルで HTTPS 用に構成された ASP.NET Core を使用してコンテナー イメージを実行します。

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

上記のコードで、<CREDENTIAL_PLACEHOLDER> をパスワードに置き換えます。 パスワードは、証明書に使用されているパスワードと一致する必要があります。

PowerShell を使うときは、%USERPROFILE%$env:USERPROFILE に置き換えます。

注: この場合の証明書は、.pfx ファイルになっている必要があります。 パスワードの有無にかかわらず、.crt または .key ファイルを利用することは、サンプルのコンテナーではサポートされていません。 たとえば、.crt ファイルを指定すると、コンテナーから "サーバー モード SSL は関連付けられた秘密キーを使用した証明書を使用しなければなりません" といったエラー メッセージが返されることがあります。 WSL を使用するときは、マウント パスを検証して、証明書が正しく読み込まれることを確認します。

macOS または Linux

証明書を生成してローカル コンピューターを構成します。

dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

dotnet dev-certs https --trust は macOS と Windows でのみサポートされています。 お使いのディストリビューションでサポートされている方法で、Linux 上の証明書を信頼する必要があります。 ブラウザーで証明書を信頼する必要があることが考えられます。

上記のコマンドで、<CREDENTIAL_PLACEHOLDER> をパスワードに置き換えます。

HTTPS 用に構成された ASP.NET Core を使用してコンテナー イメージを実行します。

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp

上記のコードで、<CREDENTIAL_PLACEHOLDER> をパスワードに置き換えます。 パスワードは、証明書に使用されているパスワードと一致する必要があります。

Windows コンテナーを使用する Windows

証明書を生成してローカル コンピューターを構成します。

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p <CREDENTIAL_PLACEHOLDER>
dotnet dev-certs https --trust

上記のコマンドで、<CREDENTIAL_PLACEHOLDER> をパスワードに置き換えます。 PowerShell を使うときは、%USERPROFILE%$env:USERPROFILE に置き換えます。

HTTPS 用に構成された ASP.NET Core を使用してコンテナー イメージを実行します。

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORTS=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="<CREDENTIAL_PLACEHOLDER>" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\aspnetapp.pfx -v %USERPROFILE%\.aspnet\https:C:\https\ --user ContainerAdministrator mcr.microsoft.com/dotnet/samples:aspnetapp

メモ:<CREDENTIAL_PLACEHOLDER> は、Kestrel 証明書の既定のパスワードのプレースホルダーです。

パスワードは、証明書に使用されているパスワードと一致する必要があります。 PowerShell を使うときは、%USERPROFILE%$env:USERPROFILE に置き換えます。

「Developing ASP.NET Core Applications with Docker over HTTPS (Docker を使用して HTTPS による ASP.NET Core アプリケーションを開発する)」

Docker コンテナーで HTTPS を使用する ASP.NET Core アプリケーションを開発する方法の詳細とサンプルについては、「Developing ASP.NET Core Applications with Docker over HTTPS (Docker での HTTPS を使用する ASP.NET Core アプリケーションの開発)」をご覧ください。

関連項目