来自 LetsEncrypt 的 TLS 证书应该在所有容器上吗?
Should TLS certs from LetsEncrypt be on all containers?
我正在尝试让我的 dockerized 应用程序在生产中启用 HTTPS。我可以找到大量关于自签名证书的教程。他们都缺乏生产能力。他们几乎以 "Yeah just use Let's Encrypt" 结尾。对于我来说,这并没有真正阐明生产中负载平衡情况的行业标准是什么。
为了提供一些上下文,我使用以下命令创建了一个 dotnet 核心应用程序:
dotnet new react -au Individual
我遵循了为我的容器创建 Dockerfile 的示例文档:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
这部分引起了很多麻烦,因为应用程序正在发布,它正在进入生产模式并期待有效的证书。无论哪种方式,我都尝试在生产中推进和测试。这引发了很多关于证书的问题。在我安装 Certbot 并获得签名证书后。我剩下这四个文件:
- cert.pem - 我认为这必须变成 .pfx
- chain.pem - 我知道这是什么但不确定谁需要它。
- 完整chain.pem - 此文件相同。
- privkey.pem - 我认为这是用来帮助创建我的 .pfx 文件的。
我的主要问题是,在负载平衡的情况下。 certbot 会安装在每个容器上吗?是否应该在每个容器上生成证书?
我认为它应该只创建一次,然后每个应用程序服务器都会获得生成的相同证书和密钥。这就引出了应该在哪里安装 certbot 的问题。
我看到一些设置说 nginx 会在这些容器前面并扮演负载平衡器的角色。然后 nginx 将处理 https 流量。这对我来说听起来不对,不仅你从 nginx 到应用程序服务器的流量是未加密的,而且我认为 IdentityServer 不会让我的应用程序 运行 没有有效的证书。
欢迎就本部门的行业标准提供任何指导。
这个问题的答案很简单,如果您使用的是 https,则需要在通过 https 协议进行通信的每个容器上拥有有效证书。要处理容器内的证书传播,您可以使用 service mesh
工具,例如 Linkerd
或 Istio
google 使用的工具。
您可以使用 Kubernetes 证书管理控制器 cert-manager
。它可以帮助从各种来源颁发证书,例如 Let's Encrypt、HashiCorp Vault、Venafi、简单的签名密钥对或自签名。
它将确保证书有效且最新,并尝试在过期前的配置时间续订证书。
我正在尝试让我的 dockerized 应用程序在生产中启用 HTTPS。我可以找到大量关于自签名证书的教程。他们都缺乏生产能力。他们几乎以 "Yeah just use Let's Encrypt" 结尾。对于我来说,这并没有真正阐明生产中负载平衡情况的行业标准是什么。
为了提供一些上下文,我使用以下命令创建了一个 dotnet 核心应用程序:
dotnet new react -au Individual
我遵循了为我的容器创建 Dockerfile 的示例文档:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
这部分引起了很多麻烦,因为应用程序正在发布,它正在进入生产模式并期待有效的证书。无论哪种方式,我都尝试在生产中推进和测试。这引发了很多关于证书的问题。在我安装 Certbot 并获得签名证书后。我剩下这四个文件:
- cert.pem - 我认为这必须变成 .pfx
- chain.pem - 我知道这是什么但不确定谁需要它。
- 完整chain.pem - 此文件相同。
- privkey.pem - 我认为这是用来帮助创建我的 .pfx 文件的。
我的主要问题是,在负载平衡的情况下。 certbot 会安装在每个容器上吗?是否应该在每个容器上生成证书?
我认为它应该只创建一次,然后每个应用程序服务器都会获得生成的相同证书和密钥。这就引出了应该在哪里安装 certbot 的问题。
我看到一些设置说 nginx 会在这些容器前面并扮演负载平衡器的角色。然后 nginx 将处理 https 流量。这对我来说听起来不对,不仅你从 nginx 到应用程序服务器的流量是未加密的,而且我认为 IdentityServer 不会让我的应用程序 运行 没有有效的证书。
欢迎就本部门的行业标准提供任何指导。
这个问题的答案很简单,如果您使用的是 https,则需要在通过 https 协议进行通信的每个容器上拥有有效证书。要处理容器内的证书传播,您可以使用 service mesh
工具,例如 Linkerd
或 Istio
google 使用的工具。
您可以使用 Kubernetes 证书管理控制器 cert-manager
。它可以帮助从各种来源颁发证书,例如 Let's Encrypt、HashiCorp Vault、Venafi、简单的签名密钥对或自签名。
它将确保证书有效且最新,并尝试在过期前的配置时间续订证书。