将 SSL 用于容器化 ASP.NET Core 应用
SSL(安全套接字层)通过 HTTP (HTTPS) 提供安全连接。 这种保护连接的方法使用证书,在容器化应用中,安全和不安全入口点的端口映射是不同的。
多容器应用体系结构因安全要求而异。 一些应用设计使用 HTTPS 作为外部终结点,但 HTTP 用于从一个容器到另一个容器的内部通信。 高安全性环境可能会对所有通信使用 HTTPS,即使在只能在安全外部外围访问的容器之间也是如此。
端口和端口映射
Dockerfile 包含用于通过不安全的 HTTP 或安全 HTTPS 向外部流量公开端口的指令。 此外,.NET 8 及更高版本以典型用户身份运行容器化应用;但在早期 .NET 版本中,容器化应用以管理员身份运行。 以管理员身份运行时,应用有权访问 HTTP 流量的特权端口 80 和 443 HTTPS 流量。 当应用以没有提升权限的用户身份运行时,它们将端口 8080 用于 HTTP,将端口 8081 用于 HTTPS。 端口显示在 Visual Studio 生成的 Dockerfile 的 EXPOSE 命令中。 使用启动设置文件中指定的映射,将 Dockerfile 中指定的容器中的端口映射到主机端口。 请参阅容器工具启动设置。 容器运行时,可以在容器窗口中查看端口映射。 请参阅查看和诊断容器。
Certificates
Visual Studio 中的容器工具支持使用开发证书调试启用 SSL 的 ASP.NET Core 应用,调试方式与在没有容器的情况下相同。 为实现此目的,Visual Studio 会添加几个步骤来导出证书,使其可供容器使用。 下面是 Visual Studio 在容器中进行调试时处理的流:
通过
dev-certs
工具,确保主机上存在本地开发证书且该证书受主机信任。使用存储在此特定应用的用户机密存储中的安全密码将该证书导出到
%APPDATA%\ASP.NET\Https
。卷装载以下目录:
*%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"
}
}
}
}
如果配置同时支持容器化和非容器化生成,则你应使用环境变量,因为路径是特定于容器环境的。
要详细了解如何将 SSL 与容器中的 ASP.NET Core 应用结合使用,请参阅 Hosting ASP.NET Core images with Docker over HTTPS(通过 HTTPS 使用 Docker 托管 ASP.NET Core 映像)。
如需代码示例来演示如何为主机和容器中受信任的多服务应用创建自定义证书来进行 HTTPS 服务到服务通信,请参阅 CertExample。