【问题标题】:SSL Certificate on Container Optimized OS (Docker)容器优化操作系统 (Docker) 上的 SSL 证书
【发布时间】:2020-07-26 14:06:27
【问题描述】:

问题:当端口 80/443 只能分配给 Container Opimized OS 中的一台服务器时,如何让网络流量通过 certbot 服务器然后传输到您的应用程序?

上下文: 常规 certbot 安装不适用于 Google Cloud 的“容器优化操作系统”(它会阻止写访问,因此无法执行任何文件)。所以我使用了一个来自letsencrypt的cerbot docker容器,但它需要打开我当前的网络应用程序正在使用的端口80/443。

以前我会运行 certbot,然后在我的旧实例上停止服务器,认证将保留 90 天。但是,运行 certbot docker 容器仅在端口 80/443 上运行时提供 SSL,但一旦停止,SSL 证书将不再有效。

用于letsencrypt的Docker:https://hub.docker.com/r/linuxserver/letsencrypt

我想在端口 80/443 上托管的 Docker Web 应用程序:https://hub.docker.com/r/lbjay/canvas-docker

Google 容器优化实例信息:https://cloud.google.com/container-optimized-os/docs/concepts/features-and-benefits

【问题讨论】:

  • 您可以使用 Get HTTPS for free! 等其他工具颁发证书。另外,你的 HTTP 服务器是什么?你看,如果你正在使用 NGINX,你可以修改你的 SERVER 指令,以便在达到“http:///.well-known/acme-challenge/”时将流量转发到letsencrypt容器。我的第二个问题是,为什么证书不再有效?这看起来是一种可怕而奇怪的行为。
  • 您在 GCP 中使用 Cloud DNS 吗?如果您愿意在官方certbot/dns-google 图像中使用服务帐户公开一些 Cloud DNS 角色,那么有一个干净的解决方案。 (documentation for the plugin)
  • @ArmandoCuevas 非常感谢您的回答。 HTTP 服务器是 apache,它带有 Canvas 应用程序 docker 的图像,它显然应该检查 /etc/apache2 中的文件夹以获取凭据,但该文件夹不存在。但是我还没有尝试过 NGINX。我可以尝试将它安装在 Canvas 应用程序 docker 映像中。原始认证在 90 天后过期。如果不暴露端口 80/443,续订过程将无法运行。
  • @rpatel 是的!我正在使用云 DNS。我安装了 certbot docker 并运行了 /dns-google,但它失败并出现与 google 相关的错误。我可以尝试再次运行它并在此处复制并粘贴错误,因为这样会更明确。
  • 我最好的猜测是您的容器正在尝试与 Cloud DNS 交互而没有必要的凭据。我发布了一个答案,其中包含有关如何使用服务帐户凭据运行容器的一些信息

标签: docker google-cloud-platform web-applications port certbot


【解决方案1】:

这是通过 certbot/dns-google 容器映像中的 Cloud DNS 对 Certbot 使用 DNS 验证的解决方案。它将使用服务帐户凭据在可执行容器中运行certbot-dns-google 插件;这将在主机上绑定安装的位置配置 LetsEncrypt 证书。

您首先需要使用service account credentials 将文件添加到您的实例,以获取DNS Administrator role - 有关更多上下文,请参阅下面的注释。在下面的示例命令中,凭据文件是 dns-svc-account.json(放置在调用命令的工作目录中)。

docker run --rm \
    -v /etc/letsencrypt:/etc/letsencrypt:rw \
    -v ${PWD}/dns-svc-acct.json:/var/dns-svc-acct.json \
    certbot/dns-google certonly \
        --dns-google \
        --dns-google-credentials /var/dns-svc-acct.json \
        --dns-google-propagation-seconds 90 \
        --agree-tos -m team@site.com --non-interactive \
        -d site.com

关于标志的一些说明:

  • -v config-dir-mount

    这会挂载配置目录,以便 Certbot 在容器中创建的文件也会在主机的文件系统中传播。

  • -v credentials-file-mount

    这会从容器上的主机装载服务帐户凭据。

  • --dns-google-credentials path-to-credentials

    容器将使用挂载的服务帐号凭据来管理 Cloud DNS 中的更改,以便通过 ACME 服务器进行验证(涉及创建和删除 DNS TXT 记录)。

  • --dns-google-propagation-seconds n | 可选,默认:60

  • --agree-tos, -m email, --non-interactive | 可选

    这些对于以非交互方式运行容器很有帮助;当用户交互可能无法进行时(例如持续交付),它们特别有用。

  • Certbot command-line reference

【讨论】:

  • 刚刚通过在新的 Container Optimized OS 实例上进行测试确认了这一点。希望对你有帮助
  • 谢谢!那么这不会阻止应用程序使用主机上的端口 80 呢?我会继续努力实现这一点。
  • 是的,这种方法不需要任何 http 入口到您的实例。它将通过 DNS 处理验证,因此您的应用/服务器可以继续正常运行。
  • 嘿@rpatel,我尝试了您的解决方案并已关闭,但使用您的命令将 JSON 文件挂载为目录。我刚刚在 ` -v ${PWD}/dns-svc-acct.json:/var/dns-svc-acct.json ` 中添加了${PWD},它运行良好。你认为你的答案应该相应更新吗?
  • 啊,是的,你是对的 - 绑定挂载采用绝对路径(如果不使用 docker compose)。我添加了一个编辑来反映这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
  • 2019-06-21
  • 2019-12-09
相关资源
最近更新 更多