使用 Docker over HTTPS 托管 ASP.NET Core 映像
ASP.NET Core 默认使用 HTTPS。 HTTPS 依赖于证书进行信任、identity 和加密。
本文档介绍如何使用 .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
在 Linux 上,dotnet dev-certs https --trust
需要 .NET 9 SDK 或更高版本。 对于 .NET 8.0.401 SDK 或更早版本上的 Linux,请参阅 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 应用程序。
另请参阅
ASP.NET Core 默认使用 HTTPS。 HTTPS 依赖于证书进行信任、identity 和加密。
本文档介绍如何使用 .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 应用程序。