话说,刚刚过去的周六下午(咱们是调休,可不是996哦),测试同窗忽然大叫,前端
网站、小程序,怎么全部的功能都不work了!nginx
当时,那但是真的慌呀 >_<!!chrome
还好强大的chrome第一时间提示,网站的SSL证书过时了。赶忙第一时间联系CTO,给证书绪个费。而后运维同窗依次给服务器、CDN服务更新了证书,看到网站和小程序又能够访问了,你们都松了一口气,吐槽了一番,就开心过周末去了。小程序
哪知道,周一刚回来,就听到运营的同窗说有的客户反应一些爬虫和客户端服务程序都不工做了。后端
几位后端的同窗赶忙查了一通日志,发现不少后台的长驻服务,以及客户端的程序都是在调用登陆接口的时候失败。浏览器
奇怪的是一样的https接口,浏览器中的前端程序调用就没问题,后端同窗用postman调用就是失败的。根据postman的提示,把ssl关了一切就又好了。服务器
一时间,你们都有些懵,虽然说直觉告诉我必定和证书过时有关系,可是该更新的地方都更新了,问题会出在哪了?是否是有地方忘记更新了?运维
整个上午,百度、bing、google,搜索了大量nginx+https的文章,却大同小异。post
话说该配置的都配置了,会不会是证书有问题呢?这个想法一闪而过的瞬间,下意识的 ll ,让我注意到了新的证书和备份的旧证书文件大小差了5kb。3kb VS 8kb,这个差距可不能忽略!区块链
赶忙找运维同窗从新下载了证书文件。
++咦?惊喜的发现第二个文件和第三个文件加起了不正好是8kb吗,这应该不是巧合。++
心想死马当活马医吧,把两文件一合并,扔到了服务上。nginx -s reload一敲,困扰了一上午的问题居然好了!
以前作过区块链项目,有些密码学的基本知识,让我知道,这个大小5kb的文件应该是中间证书。(背景知识:根证书和中间证书的区别)
用这个中间证书+nginx+https来搜索,让我很快的找到了缘由。
原来,若是在Apache中配置证书时,是有certificate chain这个属性来指定中间证书的。
Nginx没有Certificat Chain这个参数,若是有中间证书,须要把域名证书和中间证书合并,而后指定给ssl_certificate才行。
重要的事情再说一遍,
用Nginx配置https证书,若是有中间证书,必定要和域名证书合并, 再指定给ssl_certificate。
话说,我司的证书是在Go Daddy上买的,下载时没有nginx的选项,因此选择了Apache,中间证书是分开的,就踩了这个坑。若是证书厂商提供了nginx下载选项,那么下载的证书应是合并后的,就应该没有这个问题了.
虽然说,这个问题是有惊无险的解决了,但值得反思和总结的是: