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

How do I get SSL to work with .net core and 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 设置了它,但无法调用它。邮递员说错误:连接 ECONNREFUSED XX.XXX.XXX.X:443。如果我从 https 切换到 http only 我可以访问该实例并且它按预期工作但当然不那么安全所以我不想坚持下去。它设置了一个静态 IP,这样我就可以将我的子域指向它。我错过了什么?

您必须将 docker 图像的网络服务器告知运行 asp.net 应用程序的位置,以使用 https 协议。

您应该通过将以下值 https://+;http://+.

注入环境变量 ASPNETCORE_URLS 来实现此目的

有关此 env 变量的更多信息可在 docs

中找到

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

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

基本上,您需要提供不同的环境配置属性,分别定义对您的应用程序有效的 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 标志。

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

由于 containers deployed in Compute Engine share the host network, please, be sure that you have configured the necessary firewall rules 允许访问您的容器端口。

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

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

此外,如GCP documentation, you can mount a host directory and make it accessible as a volume to your container, and store the certificate in that directory. In certain images, in order to automate the distribution progress, you can use the --metadata flag and the startup-script key for instance to provide the necessary information about how to access the certificate. But... where to obtain the certificate in first place? Ideally it may be stored in Google KMS in an encrypted form or perhaps within Google Secrets. This approach is suggested for instance in this article所述,虽然我个人没有尝试过。

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

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