Certbot 半手动操作

Certbot 半手动操作

我想问一下是否可以使用 Certbot 进行半自动化设置,其中底层基础设施由而不是由 Certbot 提供的。

我知道 Certbot 将与 Let's Encrypt 通信以发出挑战,这基本上是 Certbot 需要在我的 IP 地址或 DNS 上找到的令牌。

我对 Apache 服务器拥有完全控制权,但这是一个高度定制的多主机设置(需要 SNI!),我不希望 Certbot 弄乱我的 Apache 配置,也不想以 root 身份运行。我们稍后会回到 sudoers。

我已经设置了托管空间mta-sts.example.org,因为我正在实施邮件传输代理的严格传输安全

我已经使用宏告诉 Apache,这/home/djechelon/srv/www/domains/mta-sts.example.org是我的工作区

  • htdocs:通过 HTTP 提供的内容
  • htdocs-secure:通过 HTTPS 提供内容
  • 日志:Apache VHost 日志
  • ssl:这是mta-sts.example.org.{key,crt,ca_bundle?}存在的地方

我想告诉 Certbot 为我执行以下操作

  1. 接受执法部门的挑战
  2. 将挑战写入下面的相应文件/home/djechelon/..../htdocs,Apache 即可为其提供服务
  3. 要求 LE 验证挑战,因为 Apache准备迎接挑战
  4. 将证书写入/home/djechelon/..../ssl/。如果 LE 没有提供 ca_bundle,那也没问题,在我这里这是可选的
  5. 发出 Apache 重新加载(可能很快就会有 sudoers 设置)

我知道在这种情况下我需要使用webroot插件,但我很难找到所有选项的命令行帮助,包括存储文件和证书的位置。

文档假设该过程是交互式的,所以我必须手动复制挑战文件并要求 Certbot 联系 LE 进行域验证。

我相信应该有一种简单的方法来运行上面的简单脚本,该脚本在假设整体 IT 基础设施存在(例如,您确实想要运行自己的服务器软件)并且配置良好的情况下运行。

有什么帮助吗?

[编辑] 我现在设法以交互方式调用它

 certbot certonly --webroot -d mta-sts.example.org --preferred-challenges http --work-dir /home/djechelon/etc/letsencrypt --logs-dir /home/djechelon/letsencrypt-logs --config-dir /home/djechelon/etc/letsencrypt

它要求我提供 webroot 目录和电子邮件(我本来希望将其作为参数传递,以便将来续订)。所以现在的问题可能是“我如何在将来以非交互方式使用 cron 重新运行它?”

答案1

我不会将证书存储在用户的主目录下(/home/djechelon/..../ssl/),原因是如果用户删除证书文件,Apache 将无法启动。我同意您的理由,即如果 Certbot 不干扰 Web 服务器配置会更好,但目前看来,您实际上正在造成您试图避免的相同问题,因此我试图警告您。

没有理由将主目录用于 HTTP-01 挑战或日志文件,也可以使用 Apache 的静态配置,certonly像您已经做的那样在模式下使用 Certbot。

我对于自动续订的解决方案是针对所有 HTTP-01 挑战使用相同的工作目录(来自/etc/letsencrypt/renewal/example.com.conf):

# renew_before_expiry = 30 days
version = 0.31.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = webroot
server = https://acme-v02.api.letsencrypt.org/directory
account = 0123456789abcdef0123456789abcdef
rsa_key_size = 4096
[[webroot_map]]
example.com = /var/www/letsencrypt
www.example.com = /var/www/letsencrypt

通过这种方式,可以添加一个全局变量Alias来处理所有挑战,但也可以将其仅放到需要它的虚拟主机上:

<IfModule alias_module>
    Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>

答案2

交互模式可能只运行一次。Certbot 会记住证书的存储位置,并且始终位于工作目录下。

还不错。我的解决方案是/home/djechelon/srv/..../ssl/*用符号链接替换

简而言之:

  1. 照常设置虚拟主机
  2. 使用命令为新网站获取新证书
  3. 重新加载 apache(我需要它来设置虚拟主机)
  4. 更新时,只需使用certbot renew适当的工作目录即可以非 root 身份运行

发卡指令

 certbot certonly --webroot -d mta-sts.example.org --preferred-challenges http --work-dir [non-root-workdir --logs-dir [non-root-workdir] --config-dir [non-root-workdir]

更新命令(cron也许可以是 -ned)

 certbot renew --work-dir [non-root-workdir --logs-dir [non-root-workdir] --config-dir [non-root-workdir]

当然,在续订时,至少应该安排 Apache 重新加载

相关内容