注意本文中的环境为:LNMP1.3 一键安装包环境下
前面写过一篇网站部署 Let's Encript SSL Certificate 并启用 https 的教程:WordPress 建站:Linode VPS 上部署 SSL 启用 HTTPS 全攻略
有料友反映,之前跟着教程做一切 OK,但昨天发现网站 SSL 证书到期了(3 个月前部署的 SSL 证书),打开网站的时候显示不安全,并且 https 上有个红色的失效划线,如下图所示:
之前跟大家介绍过 Let's Encript 这个证书,优点是免费、部署快,但每次有效期只有 90 天,90 天到期后证书需要续期。
检查看了一下,应该是当时没有正确执行证书自动续期的命令。首先,看看 cron 的状态:
service crond status
提示:crond: unrecognized service
应该是当初没有安装 cron 服务,所以之前执行自动续期的 cron 命令并未生效。
处理办法:先手动把 SSL 证书续期,再安装 cron 服务,执行自动续期命令。
一、手动 SSL 证书续期
首先先手动续期一下,SSH 工具(如 Xshell )连接 VPS,并依次输入或复制粘贴以下命令回车执行:
停止 Nginx 服务(使用续期命令中的 --standalone 方法之前必须关闭 web 对 443 端口的占用,而 https 正用着 443,所以直接关闭 nginx )
service nginx stop
cd /opt/letsencrypt
sudo -H ./letsencrypt-auto certonly --standalone --renew-by-default -d yourdomain.com -d www.yourdomain.com (yourdomain.com 换成你的域名)
执行完之后,等待执行。如果出现下面截图中的 Important Notes:Congratulations! 字样,表示证书已重新更新续期。
此时再重启 nginx:
service nginx restart
经过这简单的 4 步复制,回车,替换域名 的操作,只需要 1 分钟,你的网站立即一切回归正常,https 变成绿色,小绿锁又回来了!
恭喜,你的网站证书又重新延期了 90 天!
二、SSL 证书利用 cron 服务自动续期
1)安装 cron 服务
依次输入以下 2 条命令并回车执行
yum -y install vixie-cron yum -y install crontabs
成功安装 Cron 之后,启动 cron 服务。
2)启动 Cron 服务
service crond start
执行后会出现:Starting crond: [ OK ] 的提示,表明启动成功。
继续执行开机启动服务命令,把 Cron 加入开机启动的服务列表中:
chkconfig --level 345 crond on
3)检查 Cron 服务状态
service crond status
执行后会提示:crond (pid xxxxx) is running... 代表正常运行中
4)执行 Cron 自动续期命令
把下面命令复制到记事本或文本编辑器中,然后把命令中的域名 example.com 替换成你的域名。替换完成后,复制。
10 1 1 * * /etc/init.d/nginx stop 11 1 1 * * /opt/letsencrypt/letsencrypt-auto certonly --quiet --standalone --renew-by-default -d www.example.com -d example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log 18 1 1 * * /etc/init.d/nginx restart
以上代码含义是:每个月的 1 号夜里凌晨 1 点 10 分开始关闭 web 服务,1 点 11 分开始执行证书自动续期的命令,1 点 18 分重新启动 web 服务。
第 1 个数字是 minute,第二个数字是 hour, 第三个数字是 date。其他的不用管。
复制完后,先别动(切勿粘贴执行)。输入以下命令:
crontab -e
输入此命令后,提示如下:
no crontab for root - using an empty one
此时相当于准备创建一个 root 用户的空白 crontab 文件,同时已经进入 vi 编辑状态。
在 vi 编辑状态下,请严格跟着操作步骤来!
按键盘 Ins[Insert] 键,进入 INSERT 模式,此时点击鼠标右键,粘贴上面从文本中复制的命令行(不支持 ctrl+v 快捷键粘贴)那 3 行命令,然后按 ESC 退出 INSERT 模式。
接着按组合键:shift + ;(冒号),会在当前窗口最下面一行出现一个冒号,此时输入 wq 然后回车,会保存文件并退出 vi 编辑模式。
退出 vi 编辑界面之后,此时会提示: crontab: installing new crontab
这时会生成 root cron 文件。如果你想修改 root cron 文件,可以通过 /var/spool/cron
这个路径下载下来修改。
说明 1)具体命令中的日期时间,你可以根据你的具体情况来修改。比如我的网站 3 月 30 日证书就要到期了,那么截图中我就设置 每个月 29 号 16 点 55 分 开始执行命令。
如果你想设置成每个月 5 号的 12 点 20 分开始自动续期更新证书,
那么如下图,你可以设置分钟为 20,时钟为 12,日期为 5。
这样在 5 号的 12 点 20 分,服务器会自动停止 web 访问服务,并在 22 分开始自动更新证书有效期,在 30 分重新启动 web 访问服务。
说明 2)关于这一步 vi 直接编辑 crontab 文件的操作,如果你实在不会操作,被弄的晕头转向,那么也可以执行 crontab -e 命令进入 VI 界面后,直接按 shift+; 出现冒号后输入 wq,回车。即先生成一个空白的 root cron 文件。
然后再通过 Xftp(mac 下可用 transmit)通过 /var/spool/cron
这个路径找到 root 文件,用文本编辑器打开,粘贴那三行命令,保存上传覆盖原 root 文件。再执行下面的重启命令,也可以。
5)重启 Cron 服务使得命令立即执行
service crond restart
重启之后,一切搞定!
本文完!
本站所有文章除注明“转载”的文章之外,均为原创。未经本站允许,请勿随意转载或用作任何商业用途,否则依法追究侵权者法律责任的权利。
Starting nginx... nginx: [emerg] duplicate location "/wp-content/uploads/" in /usr/local/nginx/conf/vhost/www.abc.com.conf:62
failed
请问在手动 SSL 证书续期时,重启 nginx 的时候失败。是怎么回事呢?
该评论为私密评论
Sam 老师,我的网站显示证书有效期从 2017 年 12 月 8 号 2018 年 3 月 8 号,马上要到期了。Xshell 中输入 service crond status 命令,提示:crond (pid xxxxx) is running… 代表正常运行中,请问到期会自动续期吗 需要我做什么吗 谢谢老师 米课学员
@Liaosam 谢谢 sam 老师 坐等周末更新 老师辛苦了
@Liaosam 该评论为私密评论
该评论为私密评论
拿你就用 LNMP1.4 的即可。依次执行一下这两天命令:
service crond restart 和 chkconfig --level 345 crond on 重启试试。
Sam 哥,在 VI 状态下输入三行代码,按 ESC 退出,在接着按 shift+;就出现如图的状况了。
“search hit TOP, continuing at BOTTOM”
一步一步按着料神大大的方法设置成功,谢谢料神的无私分享。
sam 老师,我的 ssl 还有十多天到期,现在可以操作吧。是不是不需要操作第一步,直接从第二步开始。 米课学员
你好,Sam 哥,右下角小图片这个效果怎么实现的?
SAM 哥, 谢谢,很实用,正好用上。有个小问题需要你确认一下:
所有的都操作完后,也重启了 Cron (输入 service crond restart 命令实现),现在想着更换自动续期时间
10 1 1 * * /etc/init.d/nginx stop
11 1 1 * * /opt/letsencrypt/letsencrypt-auto certonly --quiet --standalone --renew-by-default -d http://www.example.com -d example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log
18 1 1 * * /etc/init.d/nginx restart
是不是得先输入命令 service crond stop 先关闭 Cron, 然后下载 root 文件并更改, 上传,再输入命令 service crond restart 即可? 还是不用先 Cron,直接下载 root 文件,更改并上传, 然后重启 Cron?
那种方法正确?
@Liaosam 好的, 谢谢 sam 哥
10 1 1 * * /etc/init.d/nginx stop
11 1 1 * * /opt/letsencrypt/letsencrypt-auto certonly --quiet --standalone --renew-by-default -d http://www.example.com -d example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log
18 1 1 * * /etc/init.d/nginx restart
你要说明你的 Linux 系统是什么, 因为很多时候 certauto 不在 /opt/letsencrypt 目录下,换做 centos 找个 cron 就无效.
11 1 1 * * /opt/letsencrypt/letsencrypt-auto certonly --quiet --standalone --renew-by-default -d http://www.example.com -d example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log
谢谢料神,请问如果给更多的网站(同一个 VPS 下)的 SSL 证书续期,请问怎么操作呢?
续期搞定!
老大你的教程真是细致到手把手了,哈哈。
/var/spool/cron 这个路径下为啥没有 root 文件呢
no crontab for root - using an empty one
此时相当于准备创建一个空的。同时已经进入 vi 编辑状态。按 insert[插入] 键进入 INSERT 模式,然后鼠标右键粘贴(不支持 ctrl+v 快捷键粘贴)那 3 行命令,然后按 ESC 键再按 shift+;(冒号) 会在最下面一行出现一个冒号,此时输入 wq 然后回车即可。
此时会提示:
crontab: installing new crontab
这时才会生成 root cron 文件。如果你想修改 root cron 文件,可以通过 /var/spool/cron 这个路径下来修改。
料大,我按照这个教程,做到 Insert 那步的时候,我按 ESC 退出 Insert 模式,但是按不出来冒号,输入不到 wq,试了几次,才发现冒号的输入是‘shift+;’,不是‘ctrl+;’,这个可能是电脑不一样输入不一样?不过,最后是成功了,谢谢料大,不过要三个月后才能验证是否成功。
学习使人进步,到此拜读!
Sam 现在是又当爹又当妈呀!!!
这个好,Let’s Encript 要是一年期限就好了
liaosam 为了学员真是操碎了心
上面这个 crontab 中的命令自己写出来的也测试 OK,挺有成就感。
@Liaosam Sam 哥,你好,请问如何给更多的网站(同一个 VPS 下)的 SSL 证书续期,请问怎么操作呢?
@LiaoSam 该评论为私密评论
@LiaoSam Sam, 怎么给同一个 VPS 下更多的网站 SSL 自动续期?已经部署好 SSL,想知道给更多网站自动续期的话怎么操作命令。