我想问一下是否可以使用 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 为我执行以下操作
- 接受执法部门的挑战
- 将挑战写入下面的相应文件
/home/djechelon/..../htdocs
,Apache 即可为其提供服务 - 要求 LE 验证挑战,因为 Apache是准备迎接挑战
- 将证书写入
/home/djechelon/..../ssl/
。如果 LE 没有提供 ca_bundle,那也没问题,在我这里这是可选的 - 发出 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/*
用符号链接替换
简而言之:
- 照常设置虚拟主机
- 使用命令为新网站获取新证书
- 重新加载 apache(我需要它来设置虚拟主机)
- 更新时,只需使用
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 重新加载