上个月中旬,接到一个做教育培训机构的客户电话,语气特别急:”网站打不开了,前台首页都显示不了,学员后台也进不去,电话都被家长打爆了。”
客户在河北保定市高碑店市白沟镇,做中小学课外辅导,平时招生和学员管理全靠这个网站。当天上午开始,陆续有家长反映网站打不开,一开始没太在意,以为是临时网络波动,到了中午发现还是不行,赶紧联系我们。
登录服务器一看,Nginx报错信息指向了SSL证书过期。查了一下证书有效期,果然,当天凌晨刚好到期。证书过期之后,浏览器会拦截HTTPS请求,直接显示”您的连接不是私密连接”,普通用户看到这个页面根本不知道怎么回事,只会觉得网站出问题了。
临时恢复访问
先把Nginx配置里的SSL相关配置临时注释掉,改走HTTP协议,网站立刻恢复访问。但这只能救急,不能一直裸奔,而且浏览器现在对HTTP网站会标记”不安全”,非常影响用户信任度。
申请一个新的SSL证书,用的是Let’s Encrypt免费证书,有效期90天。在宝塔面板里一键申请、自动部署,前后不到十分钟就搞定了。恢复HTTPS访问之后,在浏览器里确认了一遍,小绿锁回来了,没有问题。
客户问了个问题
客户在白沟镇的办公室里给我打电话,问了一句:”这个证书每年都要弄一次吗?”
我说是的,而且很多免费证书是90天有效期,一年要续四次,特别容易忘。很多站长都是到期那天网站打不开了才反应过来,我们每年都要处理不少这种”救火”的案例。
怎么解决
既然客户自己容易忘,那就做成自动化的。宝塔面板本身就支持Let’s Encrypt自动续期,只要在申请的时候勾选”自动续期”选项,面板里的定时任务会每天检查一次证书有效期,到期前自动续上,不需要人工干预。
但有个前提条件:申请证书的时候填的域名解析必须正确,而且续期的时候域名也要能正常解析到服务器IP。有的客户换了服务器之后忘了改DNS解析,续期失败了自己也不知道,等证书到期了才发现。
所以给这个客户设置好自动续期之后,额外做了两件事:
一是检查了域名的DNS解析记录,确认A记录、CNAME都配置正确,而且把DNS服务商换成了支持智能解析的,国内用户走国内节点,海外用户走海外节点——客户说有少量家长在国外出差时也要访问网站给孩子查课表。
二是在监控系统里加了一条规则:证书到期前30天、15天、7天分别发送提醒到客户的微信和邮箱。双重保险,就算自动续期万一失败了,也能提前知道,不至于当天才发现。
顺手检查了服务器上的其他证书
这个客户的服务器上不止跑了一个网站,还有两个子域名分别跑着不同的业务系统。进去看了一下,其中一个子域名的证书还有二十来天就到期了,另一个倒还早,但也是手动申请的,没有开自动续期。
一并处理了。把所有域名的证书都换成了Let’s Encrypt,全部开启自动续期。客户自己都不知道还有两个子域名也在用SSL证书,要是那两个也到期了,对应的业务系统照样打不开。这就体现出了定期巡检的重要性。
关于SSL证书的几个点
很多人觉得SSL证书装上了就完事了,其实不是。有几个常见的问题:
一是证书类型选不对。有的浏览器不信任某些冷门CA签发的证书,用户访问会报错。我们一般推荐Let’s Encrypt(免费、广泛信任)或者阿里云/腾讯云的付费证书(有售后支持)。
二是混合内容问题。网站装了HTTPS,但页面里引用了HTTP的资源(图片、JS、CSS),浏览器一样会报不安全。最典型的是WordPress后台的”站点地址”如果没改成HTTPS,前台页面全是半加密状态。给这个客户部署的时候,顺便把数据库里所有的HTTP链接批量替换成了HTTPS。
三是HSTS没开。HSTS的作用是告诉浏览器”这个网站只能用HTTPS访问”,之后用户在地址栏输入HTTP的时候,浏览器会自动替换成HTTPS,省了一次301跳转,速度更快也更安全。配置也很简单,在Nginx里加一行头部就行了:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
几个星期后客户反馈
前几天客户发来一条微信,说那个白沟镇的辅导班招生旺季快到了,最近网站访问量明显增加,但一直很稳。他在高碑店市的家里用手机打开网站,加载速度比以前快了不少,而且再也没出现过”不安全”的提示。
我说你以后不用再担心证书到期的问题了,全都自动续上了,监控也在跑着,到期前会有提醒,就算真有什么问题也有人管。
他还说之前找过一个网络公司,帮忙做了网站之后就再没管过,这次才知道SSL证书还要续期这回事。其实这种情况挺常见的,很多小公司或者个人站长的服务器都是”上线即不管”,不出问题就不动,一出问题就是大问题。
关于这篇
SSL证书看着事小,忘了续期事大。网站一天打不开,对教育培训机构来说可能就是几十个咨询电话接不到,对电商来说可能就是几万块钱的订单流失。设置自动续期加到期提醒,十分钟的事,能省掉后面一堆麻烦。
我们在处理这类问题的时候,一般不只是把当前的问题解决了,还会顺手把服务器上其他相关的隐患一并扫一遍。一个证书有问题,说明其他证书可能也没设自动续期;一个网站有混合内容问题,说明其他网站可能也一样。
做运维就是这样,看起来是在处理一个具体问题,实际上是在给整个服务器做一次体检。
