使用LetsEncrypt创建Docker Apache映像

时间:2017-08-18 17:17:24

标签: 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

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:6)

您应该从apache映像中删除certbot,然后在blacklabelops / letsencrypt这样的单独容器中运行letsencrypt。

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

    注意:此处的证书将写入docker卷letsencrypt_certificates,网络质询将写入letsencrypt_challenges

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

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

    http(s)://yourdomain.com/.well-known/acme-challenge/