GoProxy-VPS实现自动更新letsencrypt证书

之前写过一篇Letsencrypt手动更新证书,时隔数月之后,终于想要实现自动更新letsencrypt证书。

更改goproxy-vps配置文件

首先goproxy-vps依赖于letsencrypt生成的证书,我之前的配置文件goproxy-vps.toml内容如下

1
2
3
4
5
6
7
8
9
10
11
12
[[http2]]
listen = ":443"
server_name = ["example.org"]
disable_legacy_ssl = false
proxy_fallback = "http://127.0.0.1:80"
proxy_auth_method = "pam"
pem = """
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
"""

手动更新完letsencrypt证书后,还要将/etc/letsencrypt/live/yourdomain目录下的cert.pem以及privkey.pem的证书内容黏贴到配置文件中的pem处,非常麻烦。好在goproxy-vps支持直接从文件读取证书,修改一下goproxy-vps.toml配置文件

1
2
3
4
5
6
7
8
[[http2]]
listen = ":443"
server_name = ["example.org"]
disable_legacy_ssl = false
proxy_fallback = "http://127.0.0.1:80"
proxy_auth_method = "pam"
certfile = "/etc/letsencrypt/live/yourdomain/cert.pem"
keyfile = "/etc/letsencrypt/live/yourdomain/privkey.pem"

这样的话,每次证书更新完毕后,不用去黏贴证书内容了,方便了许多。对于实现自动更新letsencrypt证书也同样如此。

使用crontab实现定时更新

如果要实现letsencrypt自动更新,就需要用到crontab来定时执行。letsencrypt的证书有效期为90天,貌似少于30天才给更新,否则letsencrypt会提示你更新无效,这也是对服务器的一种保护。

由于我之前首次生成letsencrypt证书的时候使用的是--standalone模式,在验证域名的时候需要启用443端口,而我的goproxy-vps占用了该端口,所以不管是自动更新还是手动更新,都需要先停止goproxy-vps的进程。

先查看crontab服务是否开启

1
service crond status

如果开启则创建crontab定时任务

1
crontab -e

certbot工具支持钩子参数写法

1
15  2 * */2 * certbot-auto renew --pre-hook "service goproxy-vps stop" --post-hook "service goproxy-vps start" > /home/youraccount/log.txt

上面代码中goproxy-vps已经设置成一个服务了。如果没有设置成服务,可以使用绝对路径来执行。certbot-auto已经放到usr/local/bin目录下了成为一个全局命令。--pre-hook 这个参数表示执行更新操作之前要做的事情,--post-hook 这个参数表示执行更新操作完成后要做的事情。这条命令的含义是,每隔2个月的02:15分执行一次letsencrypt证书更新。执行日志输出到你的用户名的目录下。

查看刚才创建的crontab定时任务

1
crontab -l

总结

目前还没有测试过这段代码,要等两个月后,才能确定是否能正常执行。据我所知,443端口是要在执行certbot前必须关闭的,但是占用80端口的Nginx服务我没有关闭,不知道会不会受影响。主要是--pre-hook这个钩子参数貌似不支持执行多个命令,官方文档又看着头大,等两个月后就见分晓了。

avatar

chilihotpot

You Are The JavaScript In My HTML