使用 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,请使用 Manage TLS Certificates in a Cluster(管理群集中的 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 时,将 %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

使用 Docker over HTTPS 开发 ASP.NET Core 应用程序

有关如何在 Docker 容器中使用 HTTPS 开发 ASP.NET Core 应用程序的信息和示例,请参阅使用 Docker over HTTPS 开发 ASP.NET Core 应用程序

另请参阅