docker - 如何让 SSL 与 .net core 和 Google Compute Engine 一起工作?

标签 docker asp.net-core https asp.net-core-webapi google-compute-engine

我有一个带有以下 dockerfile 的 .net 核心 API 项目:

FROM mcr.microsoft.com/dotnet/aspnet:5.0.0-buster-slim AS base
WORKDIR /app
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["API/API.csproj", ""]
RUN dotnet restore "./API.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "API/API.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "API/API.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "API.dll"]

我已成功将此镜像推送到 Google Cloud Artifact Registry,并使用它创建了一个 Google Cloud Compute Engine 实例。我只使用 https 设置了它,但无法调用它。 postman 说错误:连接 ECONNREFUSED XX.XXX.XXX.X:443。如果我从 https 切换到 http only 我可以访问该实例并且它按预期工作但当然不那么安全所以我不想坚持下去。它设置了一个静态 IP,这样我就可以将我的子域指向它。我错过了什么?

最佳答案

您的问题可能与您的容器 HTTPS 配置有关。

在描述 how to develop ASP.NET Core Applications with Docker over HTTPSHosting ASP.NET Core images with Docker Compose over HTTPS 时,请考虑查看 Microsoft 提供的文档。这个 related question 也可能有帮助。

基本上,您需要提供不同的环境配置属性,分别定义对您的应用程序有效的 URL、HTTPS 监听端口、要使用的 SSL 证书的路径以及保护该证书的密码:

ASPNETCORE_URLS="https://+;http://+"
ASPNETCORE_HTTPS_PORT=8001
ASPNETCORE_Kestrel__Certificates__Default__Password="password"
ASPNETCORE_Kestrel__Certificates__Default__Path=\https\aspnetapp.pfx

GCP documentation 中所示,您可以使用 GCP Web 控制台或 gcloud CLI 提供此环境信息,在后一种情况下使用 --container-env--container-env-file 标志。

aforementioned SO question 中所述,我认为您也可以利用多阶段 Docker 构建过程来传递此环境信息。

由于 containers deployed in Compute Engine share the host network ,请确保您已配置必要的 firewall rules 以允许访问您的容器端口。

为了从您的容器访问您的证书,我认为您可能有两种选择。

一方面,您可以在构建过程中将证书包含在图像中。它有一个明显的缺点,它会使证书更容易访问,这是一个不太安全的解决方案,尽管如果将图像部署到非公共(public)存储库可以减轻它;此外,考虑到您仍然需要 pfx 的密码,因此,请谨慎使用,这可能是一个有效的解决方案。

此外,如 GCP documentation 中所述,您可以挂载主机目录并使其作为容器可访问的卷,并将证书存储在该目录中。在某些图像中,为了自动执行分发过程,您可以使用 --metadata flagstartup-script 键来提供有关如何访问证书的必要信息。但是……首先去哪里领证呢?理想情况下,它可能以加密形式存储在 Google KMS 中,或者可能存储在 Google Secrets 中。例如在 this article 中建议使用这种方法,尽管我个人从未尝试过。

话虽如此,在我看来,与其尝试自定义您的容器,更好的解决方案是在您的 VM 前配置一个 HTTPS load balancer:除了高可用性和可扩展性、易于维护等,关于HTTPS 配置,您只需要在配置负载均衡器前端时提供您的证书详细信息;如有必要,您也可以申请 Google 管理的证书。

请注意,如果您采用第二个选项,您不再需要在您的应用程序本身中配置 HTTPS,它可以安全地在端口 80 上运行。这个想法是将 HTTPS 处理委托(delegate)给负载均衡器,并使用负载均衡器前端提供 SSL 终止,从而使您的应用程序免于承担该责任。

关于docker - 如何让 SSL 与 .net core 和 Google Compute Engine 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69670770/

相关文章:

asp.net-core - 无法在 asp.net 5 MVC 6 站点中关闭 requirehttps

c# - 带有 .Net Core SDK 3.0 预览版的 Visual Studio Code 和 Omnisharp Extension 错误

.htaccess - htaccess 将 http ://example. com 重写为 http ://www. example.com 但将 https ://www. example.com 重写为 https ://example. com

docker - 从 docker 镜像中删除环境变量

docker - 如何在 CircleCI 中为 Docker 镜像构建缓存 Yarn 依赖项?

asp.net-core - DbContext 实例不能在 OnConfiguring 内部使用,因为此时它仍在配置中

.htaccess - HTTPS 与 HTTP 缓存 Javascript 文件?

docker - nginx 不会自动获取 swarm 中的 dns 更改

postgresql - 无法使用 sequelize 通过端口映射连接到 docker 中的 postgres

web-services - 轴 2 和 Rampart-为什么服务返回 wsse :Security header in request?