7

我在使用 Docker 和 LetsEncrypt 时遇到了麻烦。

据我所知,Certbot(在 Apache 或任何 HTTP 服务器上安装 LetsEncrypt 的机器人)检查用户是否拥有与证书关联的域。

所以在 Dockerfile 中,我添加了以下行:

RUN certbot --apache -n --agree-tos --email me@mail.com -d domain.tld

麻烦的是,在域检查期间,Certbot 将证书安装在 HTTP 服务器上,并通过解析域来检查该服务器是否暴露了已安装的证书。

我的意思是,只有当 cerbot 命令在在线 Web 服务器上运行时,域检查才能起作用。

但是在 Docker 镜像构建期间没有启动 Apache 服务器。

你有什么想法来解决这个问题吗?我可以在容器启动后执行命令,但我想在 Dockerfile 中安装证书。

谢谢

4

1 回答 1

12

您应该从您的 apache 映像中删除 certbot 并在一个单独的容器(如 blacklabelops/letsencrypt)中运行letsencrypt。

  1. 在映像构建期间使用 certbots testmode 创建虚拟证书
  2. 在目标系统上启动 apache
  3. 在 webroot 模式下启动 blacklabelops/letsencrypt,不使用端口,并且通过 apache webcontext 交换挑战。
  4. 创建真正的证书并保持容器运行以进行每月更新

Letencrypt 容器必须在 Webroot 模式下启动:

$ docker run -d \
  -v letsencrypt_certificates:/etc/letsencrypt \
  -v letsencrypt_challenges:/var/www/letsencrypt \
  -e "LETSENCRYPT_WEBROOT_MODE=true" \
  -e "LETSENCRYPT_EMAIL=dummy@example.com" \
  -e "LETSENCRYPT_DOMAIN1=example.com" \
  --name letsencrypt \
  blacklabelops/letsencrypt

注意:这里的证书将被写入 docker 卷letsencrypt_certificates,webchallenge 将被写入letsencrypt_challenges

您的 apache 必须挂载该卷并在 webroot 下发布挑战:/.well-known/acme-challenge/.

例如,letsencrypt_challenges 下的文件必须可以通过以下方式访问:

http(s)://yourdomain.com/.well-known/acme-challenge/
于 2017-08-19T20:12:19.720 回答