使用 Docker over HTTPS 裝載 ASP.NET Core 映像

作者:Rick Anderson

ASP.NET Core 預設使用 HTTPSHTTPS 依賴憑證來達到信任、身分識別和加密。

本文件說明如何使用 .NET 命令列介面 (CLI),透過 HTTPS 執行預先建置的容器映像。 如需如何使用 Visual Studio 在開發環境中執行 Docker 的指示,請參閱使用 Docker over HTTPS 開發 ASP.NET Core 應用程式

此範例需要 Docker 17.06 或更新版本的 Docker 用戶端

必要條件

目前 .NET SDK

憑證

網域的生產託管需要憑證授權單位提供的憑證。 Let's Encrypt 是提供免費憑證的憑證授權單位。

本文件使用自我簽署的開發憑證,透過 localhost 裝載預先建置的映像。 這些指示類似於使用生產憑證。 dotnet dev-certs 所產生的憑證只能搭配 localhost 使用,且不得在 Kubernetes 之類的環境中使用。 若要在 Kubernetes 叢集內支援 HTTPS,請使用在叢集中管理 TLS 憑證所提供的工具,在 Pod 內設定 TLS。

使用 dotnet dev-certs 來建立自我簽署憑證以進行開發和測試。

針對生產憑證:

  • 不需要 dotnet dev-certs 工具。
  • 憑證不需要儲存在指示中使用的位置。 任何位置都應該能運作,不過不建議在站台目錄中儲存憑證。

下一節包含的指示會使用 Docker 的 -v 命令列選項,將大量憑證裝載到容器中。 您可以在 Dockerfile 中使用 COPY 命令將憑證新增至容器映像,但不建議這麼做。 基於下列理由,不建議將憑證複製到映像:

  • 難以使用相同的映像來測試開發人員憑證。
  • 難以使用相同的映像來裝載生產憑證。
  • 揭露憑證有重大風險。

透過 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 時,以 $env:USERPROFILE 取代 %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

只有在 macOS 和 Windows 上才支援 dotnet dev-certs https --trust。 您必須以您的發行版本支援的方式信任 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 時,以 $env:USERPROFILE 取代 %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 時,以 $env:USERPROFILE 取代 %USERPROFILE%

透過 HTTPS 使用 Docker 開發 ASP.NET Core 應用程式

如需如何在 Docker 容器中透過 HTTPS 開發 ASP.NET Core 應用程式的資訊和範例,請參閱使用 Docker over HTTPS 開發 ASP.NET Core 應用程式

另請參閱