如今主流浏览器已经逐渐放弃对Flash、http的支持,转向和html5,https等迭代技术,如果遇上网站证书过期对企业/组织还是有非常大的影响。

背景

博客最近更新得少,不过后台还是常常在用,暂存一些文本/照片用于多平台同步。(linux与ios/Android互相传文件实在是麻烦)
今天打开博客的时候发现Chrome报错,提示为安全原因,检查后发现错误原因为SSL证书到期(2019.9.24~12.24),没有自动续签导致无法访问。

博客运行了一年多,基本上没有出现问题。使用的是Let's Encrypt签发的证书,有效期为90天,使用到60天时acme.sh自动续签,所以这次报错还是挺纳闷的。

预警

虽然遇到报错很疑惑,但是这次事故其实还是有前兆的,之前在Outlook上收到了证书续订提醒(如下图),不过以往没有出错,惯性思维加上最近比较忙,没放在心上。
以后遇到邮件提醒还是长个心眼,重要邮件进行归档,多确认一下。

解决

上次进行后台设置大概在春季,大半年过去加上老电脑报废,给问题解决带来了一些困难。幸运的是,这次的证书问题影响到很多使用Ghost的用户,时间也较早(十月底开始),网上的解决方法很多。

最主要的原因是Let's encrypt和acme.sh的更新,旧版本出现了一些问题。然后自己最近没有折腾前端界面和后台插件,对一些组件更新较少,导致事件发生。

连上服务器之后,常规的对软件进行了更新,软件版本迭代就略过不提了,完善的软件开发,用户根据文本说明都应当能够进行简单的排查。通过history还是回忆起了当时安装的情况,服务器只运行了博客,所以没有其他干扰。

主应用ghost引用了ssl配置脚本,即使将程序升级到最新,输出日志显示ssl配置正常,检查后跳过(skip)了...放弃尝试从ghost上解决,组件估计没有更新。

Nginx简单的排查了一下,服务是没有问题的,ip访问也有界面;

那么问题只能出在用于证书更新的acme.sh上了,找到原来的目录/etc/Letsencrypt/ (应该是ghost更改了安装位置)。运行脚本有相应的提示,阅读帮助后选择更新,提醒可能缺少依赖程序socat,更新后的脚本默认储存在~/.acme.sh,新建目录后权限为root,还是可能报错,建议使用用root或者更改安装位置。正常更新脚本后,renew获取新证书即可,最后将检测脚本加入定时任务中。

对于sudoer用户组,脚本在可以使用--home参数在原目录下更新;
我用的是root账户,发行版ubuntu 18.04,这是我的解决方案

#可选,standalone mode下更新证书需要
sudo apt install socat -y
#更新程序并查看版本,若成功,版本号应当与github的代码注释处版本一致
/etc/letsencrypt/acme.sh --upgrade 
/root/.acme.sh/acme.sh --version
#可选,renew获取新证书,webroot mode,以ghost为例
/root/.acme.sh/acme.sh --force --renew --home /etc/letsencrypt --domain yourdomain.com --webroot /var/www/ghost/system/nginx-root --reloadcmd "nginx -s reload" --accountemail yourmail@xxx.com
#加入定时任务
~/.acme.sh/acme.sh --install-cronjob

crontab -l
#检查定时任务,应当有类似以下的输出:
#41 0 * * * "/etc/letsencrypt"/acme.sh --cron --home "/etc/letsencrypt" > /dev/null

证书更新并重启Nginx服务就能打开网页了。
Screenshot-from-2019-12-14-16-21-35

反思

项目还是尽可能半个与左右在后台维护一下,保持更新。对于重要的邮件提醒应当检查,不能掉以轻心。最后的话,使用其他脚本大致弄清楚作用,主要文件的存储位置。之前设置重定向和配置ssl时对这些文件比较熟悉,解决起来还算比较轻松。

参考acme.sh的github页面:https://github.com/Neilpang/acme.sh