如何在 .net core 和 Google Compute Engine 上使用 SSL?

3

我有一个带以下dockerfile的 .net core 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显示错误:连接被拒绝XX.XXX.XXX.X:443。如果我从https切换到http,我可以访问该实例,并且按预期工作,但当然不够安全,所以我不想坚持使用它。它设置了静态IP,以便我可以将子域指向它。我错过了什么?
2个回答

2
您的问题可能与容器的 HTTPS 配置有关。请考虑查看 Microsoft 提供的文档,例如 如何使用 Docker 开发 ASP.NET Core 应用程序(支持 HTTPS)如何使用 Docker Compose 托管支持 HTTPS 的 ASP.NET Core 映像。此外,这个相关的问题 也可能有所帮助。
基本上,您需要提供不同的环境配置属性,分别定义应用程序有效的 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文档所示,您可以使用GCP Web控制台或gcloud CLI提供此环境信息,在后一种情况下,可以使用--container-env--container-env-file标志。
上述SO问题所示,我认为您可以利用多阶段Docker构建过程来传递此环境信息。
由于在Compute Engine中部署的容器共享主机网络,请确保您已配置必要的防火墙规则以允许访问您的容器端口。
为了从容器中访问您的证书,我认为您可能有两个选项。
一方面,您可以在构建过程中将证书作为图像的一部分包含在内。这显然有缺点,即会使证书更容易被访问,这是一种不太安全的解决方案,尽管如果您将图像部署到非公共存储库中,则可以减轻这种情况。此外,请注意,您仍然需要pfx的密码,因此,在谨慎的情况下,这可能是一个有效的解决方案。
此外,如 GCP 文档 中所述,您可以挂载主机目录并将其作为卷访问到容器中,并将证书存储在该目录中。在某些映像中,为了自动化分发进程,您可以使用 --metadata 标志startup-script 键,例如提供有关如何访问证书的必要信息。但是...首先从哪里获取证书呢?理想情况下,它可能以加密形式存储在 Google KMS 中,或者可能在 Google Secrets 中。例如,在本文中建议采用这种方法,尽管我个人从未尝试过。
说到这里,我认为,与其尝试定制您的容器,更好的解决方案是在您的虚拟机前面配置一个HTTPS负载均衡器:除了高可用性和可扩展性、易于维护等方面之外,在HTTPS配置方面,您只需要在配置负载均衡器前端时提供证书详细信息即可;如果必要,您还可以请求Google管理的证书。
请注意,如果您选择第二个选项,您不再需要在应用程序本身中配置HTTPS,它可以安全地运行在端口80上。这个想法是将HTTPS处理委托给负载均衡器,并使用负载均衡器前端提供SSL终止,使您的应用程序免除这个责任。

如何在容器中包含SSL证书? - James Anderbard
非常感谢您的反馈,@JamesAnderbard。是的,当然,抱歉。我认为您可能有两个选择。一方面,您可以将证书包含在图像中:这显然有一个缺点,即会使证书更容易访问,但如果您从非公共图像存储库部署图像,并考虑到您仍需要pfx的密码,那么这可能是一个有效的解决方案。请参见下一个评论。 - jccampanero
@JamesAnderbard,我认为更好的解决方案是在您的VM前面配置一个HTTPS负载均衡器:除了高可用性等方面之外,如果需要,仅需在配置负载均衡器前端时提供有关HTTPS配置的证书详细信息即可;您也可以请求Google托管的证书。 - jccampanero
项目相关的额外费用。 - jccampanero
是的,我终于成功了,在设置负载均衡器后。 - James Anderbard
显示剩余9条评论

1
你需要告诉Docker镜像的Web服务器也使用https协议来运行asp.net应用程序。
你可以通过注入环境变量ASPNETCORE_URLS并将其值设置为https://+;http://+来实现此目标。
有关此环境变量的更多信息,请参见文档

我在我的 .net core web api 项目的根目录下添加了一个 .env 文件并将其推送上去,但仍然收到相同的错误。文件内容包含:"ASPNETCORE_URLS=https://+;http://+"。我需要通过 Google Cloud VM 添加它吗?我可能还缺少其他步骤吗?这对本地 docker 是否有效? - James Anderbard
我不知道Google Cloud VM是否考虑了.env文件;也许你需要为其指定环境变量。或者,你可以在Dockerfile中提供默认值:ENV ASPNETCORE_URLS https://+;http://+ - ddegasperi
我已经将环境变量添加到Docker文件中,但仍然遇到相同的连接被拒绝错误。还有其他想法吗? - James Anderbard
我查看了Google文档,并找到了以下条目https://cloud.google.com/compute/docs/containers/configuring-options-to-run-containers#setting_environment_variables。我假设您使用gcloud命令行工具启动容器。在创建容器时尝试添加`--container-env ASPNETCORE_URLS=https://+;http://+`。 - ddegasperi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接