Cron自动续期命令失效导致网站SSL证书到期的解决方案

2017-03-29发布在 WordPress建站12369 次访问

注意本文中的环境为: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

重启之后,一切搞定!

本文完!

 

分享到微信朋友圈

LiaoSam
LiaoSam
外贸综合症患者

相关文章

    暂无

36条评论

发表我的评论

取消评论

邮箱白名单说明:最近料网自动提醒邮件经常会被一些邮件服务商拦截。为了您顺利并及时地收取留言被回复的提醒邮件,请在您邮箱中把料网 liaosam.com 加入白名单域名。

已读说明
设为私密评论
添加表情

Hi,您需要填写昵称和邮箱!

您的邮箱地址不会公开,仅仅用于收取回复。建议填写QQ邮箱,不宜填写工作邮箱。
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址 (没有就留空)
呃,评论有点多呢... 料网小秘书为您玩命加载中...
  1. #19
    harry

    Starting nginx… nginx: [emerg] duplicate location “/wp-content/uploads/” in /usr/local/nginx/conf/vhost/www.abc.com.conf:62
    failed
    请问在手动 SSL 证书续期时,重启nginx的时候失败。是怎么回事呢?

    6个月前 (05-22)回复
  2. #18
    yuyu

    该评论为私密评论

    8个月前 (03-27)回复
  3. #17
    yuyu

    该评论为私密评论

    8个月前 (03-17)回复
  4. #16
    Yuan

    Sam老师,我的网站显示证书有效期从2017年12月8号2018年3月8号,马上要到期了。Xshell中输入service crond status命令,提示:crond (pid xxxxx) is running… 代表正常运行中,请问到期会自动续期吗 需要我做什么吗 谢谢老师 米课学员

    9个月前 (02-28)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @Yuan letsencrypt 脚本变成 certbot 了,以前的续期命令应该是失效了。周末会更新一下证书续期的文章。
      9个月前 (02-28)回复
      • Yuan

        @Liaosam 谢谢sam老师 坐等周末更新 老师辛苦了

        9个月前 (02-28)回复
      • Yuan

        @Liaosam 该评论为私密评论

        9个月前 (03-06)回复
  5. #15
    似水年华

    该评论为私密评论

    9个月前 (02-22)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @似水年华 letsencrypt 脚本变成 certbot 了,所以以前的续期命令应该是实效了。
      拿你就用 LNMP1.4的即可。依次执行一下这两天命令:
      service crond restart 和 chkconfig –level 345 crond on 重启试试。
      9个月前 (02-28)回复
  6. #14
    Tim

    Sam哥,在VI状态下输入三行代码,按ESC退出,在接着按shift+;就出现如图的状况了。
    “search hit TOP, continuing at BOTTOM”

    1年前 (2017-10-15)回复
  7. #13
    哈瓦那的早晨

    一步一步按着料神大大的方法设置成功,谢谢料神的无私分享。

    1年前 (2017-08-28)回复
  8. #12

    sam老师,我的ssl还有十多天到期,现在可以操作吧。是不是不需要操作第一步,直接从第二步开始。 米课学员

    1年前 (2017-06-22)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @yuki 是的。直接执行第二步。
      1年前 (2017-08-28)回复
  9. #11
    Brooks

    你好,Sam哥,右下角小图片这个效果怎么实现的?

    1年前 (2017-06-14)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @Brooks 这个是我儿子满月时拍的几张照片,是用 Jquery+CSS 实现的。判断页面垂直滚动的距离,分距离区间来切换样式,7个小图片图片作为7个样式 x1,..x7 的背景。
      1年前 (2017-06-14)回复
  10. #10
    Brooks

    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 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?

    那种方法正确?

    1年前 (2017-06-14)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @Brooks 不用 stop,直接下载,修改上传覆盖,然后重启。
      1年前 (2017-06-14)回复
      • Brooks

        @Liaosam 好的, 谢谢sam哥

        1年前 (2017-06-14)回复
  11. #9

    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

    你要说明你的Linux系统是什么, 因为很多时候certauto 不在 /opt/letsencrypt 目录下,换做centos找个cron 就无效.

    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

    1年前 (2017-06-05)回复
  12. #8
    嗨森

    谢谢料神,请问如果给更多的网站(同一个VPS下)的SSL证书续期,请问怎么操作呢?

    2年前 (2017-04-24)回复
  13. #7
    木脚人

    续期搞定!
    老大你的教程真是细致到手把手了,哈哈。

    2年前 (2017-04-06)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @木脚人 感受到动手的乐趣了吧?:) 技术教程尽量细致,帮大家节省时间。
      2年前 (2017-04-06)回复
  14. #6
    fyfy

    /var/spool/cron 这个路径下为啥没有 root文件呢

    2年前 (2017-04-05)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @fyfy 抱歉,文章中没说清楚,执行过 “crontab -e” 命令后会出来一条提示:
      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 这个路径下来修改。
      2年前 (2017-04-05)回复
  15. #5
    leslie

    料大,我按照这个教程,做到Insert那步的时候,我按ESC退出Insert模式,但是按不出来冒号,输入不到wq,试了几次,才发现冒号的输入是‘shift+;’,不是‘ctrl+;’,这个可能是电脑不一样输入不一样?不过,最后是成功了,谢谢料大,不过要三个月后才能验证是否成功。

    2年前 (2017-04-02)回复
    • LiaoSam
      LiaoSam,外贸综合症患者。
      @leslie 是的,明显是笔误了,冒号的输入是shift+分号。文章中已修正。
      2年前 (2017-04-03)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @leslie 已测试过了。我写的三行代码是生效的,成功自动续期了。
      2年前 (2017-04-05)回复
  16. #4

    学习使人进步,到此拜读!

    2年前 (2017-03-31)回复
  17. #3
    小璞叔叔

    Sam 现在是又当爹又当妈呀!!! :!: :wink: :mrgreen:

    2年前 (2017-03-30)回复
  18. #2

    这个好,Let’s Encript要是一年期限就好了

    2年前 (2017-03-30)回复
  19. #1
    Keen Cheng

    liaosam为了学员真是操碎了心 :!:

    2年前 (2017-03-29)回复
    • LiaoSam
      Liaosam,外贸综合症患者。
      @Keen Cheng 是的,操心不说,还要先排坑。cron 定时执行的命令来回测试了几个小时才发现 /etc/下的 crontab 不起作用,真正起作用是 /var/spool/cron/root 这个文件。
      上面这个 crontab 中的命令自己写出来的也测试OK,挺有成就感。
      2年前 (2017-03-30)回复
      • 谷子

        @Liaosam Sam哥,你好,请问如何给更多的网站(同一个VPS下)的SSL证书续期,请问怎么操作呢?

        1年前 (2017-08-20)回复
        • LiaoSam
          LiaoSam,外贸综合症患者。
          @谷子 看这篇文章的第十一点:https://www.liaosam.com/wordpress-on-linode-vps-setup-ssl-https-guide.html
          1年前 (2017-08-21)回复
          • 谷子

            @LiaoSam 该评论为私密评论

            1年前 (2017-08-21)回复
          • Kevin

            @LiaoSam Sam, 怎么给同一个VPS下更多的网站SSL自动续期?已经部署好SSL,想知道给更多网站自动续期的话怎么操作命令。

            1年前 (2017-09-21)回复