使用LetsEncrypt创建Docker Apache映像

had*_*adf 2 apache docker lets-encrypt certbot

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

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

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

RUN certbot --apache -n --agree-tos --email me@mail.com -d domain.tld
Run Code Online (Sandbox Code Playgroud)

问题是在域检查期间,Certbot会在HTTP Server上安装证书,并检查此服务器是否通过解析域来公开已安装的证书.

我的意思是,只有在在线Web服务器上运行cerbot命令时,域检查才能生效.

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

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

谢谢

bla*_*ops 6

您应该从apache映像中删除certbot,并在另一个容器(如blacklabelops/letsencrypt)中运行letsencrypt.

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

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

$ 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
Run Code Online (Sandbox Code Playgroud)

注意:此处的证书将写入letsencrypt_certificatesdocker 卷,将写入webchallengeletsencrypt_challenges

你的apache必须安装该卷并在webroot下发布挑战:/.well-known/acme-challenge/.

例如,letsencrypt_challenges下的文件必须可以在以下位置访问:

http(s)://yourdomain.com/.well-known/acme-challenge/
Run Code Online (Sandbox Code Playgroud)

  • 任何地方都有这方面的完整教程吗?我正在尝试找到描述整个过程的内容,以便我可以升级现有的 Apache Docker 映像以使用 Certbot 托管证书运行,但到目前为止,此问答是我能找到的唯一针对 Apache 的结果。我发现的其他所有内容都引用了 Nginx 而不是 Apache,而且我找不到任何适用的描述 Apache 和 Nginx 之间差异的内容,所以我有点卡住了。 (8认同)