saber酱的抱枕

生于忧患,死于安乐

12/4
16:05
软件

网站证书续期踩坑

我用的是 certbot-auto,执行自动续期的命令,之前没出问题,这次出乎意料的踩了坑。

一波三折的剧本。

第一波:续期失败

先停止 nginx,然后执行续期命令,这时候我注意到它安装 python 花了点时间。python 我以前安装过啊,难道现在是安装另一个版本?

等命令执行完结果报错了:

'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128)

搜索到的结果显示,这是 python 把 ascii 编码转换为 Unicode 时长度超过了 128。

查看 letsencrypt 的日志,找到了最后一个出现的 py 文件:

/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot_nginx/_internal/nginxparser.py

在它的顶部添加如下代码,把它的编码方式修改为utf-8:

import sys
reload(sys) 
sys.setdefaultencoding('utf-8')

之后重新执行续期命令,显示成功了。

第二波:nginx 启动失败

可是之后我去启动 nginx 却启动不起来了。根据提示执行 systemctl status nginx.service,看到端口被占用了,导致无法启动:

Dec 04 15:23:43 vultr.guest nginx[20215]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Dec 04 15:23:43 vultr.guest nginx[20215]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
......
Failed to start A high performance web server and a reverse proxy server.

看了看 80 端口和 443 端口,都是 nginx 在占用,我寻思这 nm 就离谱,之前我 service nginx stop 好像没问题啊。没办法只好 kill 进程再启动 nginx。

第三波:证书没有更新

查看网站证书,怎么还是旧的。再执行一遍续期命令,发现了问题,它生成的证书应该存放在名为 saber.love 的文件夹里,但结果显示它存放在了 saber.love-001 文件夹。我想了想,大概是因为现在 nginx 在运行,文件被占用,所以续期工具只能再建立一个文件夹存储。第一波里最后续期成功时,因为 nginx 仍在运行(但当时我不知道),所以应该也是放在了 saber.love-001 文件夹。正确的 saber.love 文件夹里始终还是旧版本证书。打开一看果真如此,于是替换为新证书,问题解决。

现在就是心好累。

网站证书续期踩坑