问题描述
今天电子商城的市场接到一个故障,说更换了.lechange.com的https证书(原有的证书到期了,新买了一个依旧还是.lehcange.com域名证书)之后,订单在支付宝支付的时候提示支付失败。我把request id
提供给支付宝的客服请他们查看一下后台,支付宝客服说我们电商的https证书没有认证成功。于是我就登陆https://cryptoreport.websecurity.symantec.com/checker/ 去检查一下电商的域名,果不其然,赛门铁克的反馈是错误的,如图:
但是登陆网站,在浏览器里却显示https证书是OK的,如图:
然后我用symantec
的那个网站测试了一下电商平台开发环境的域名,发现也是OK的,如图:
这就郁闷了,到底哪里出问题了?
问题排查
首先跟研发确认,开发环境与线上环境在涉及到证书的代码是否一致,得到研发的确认之后。就检查服务器里的nginx
,发现服务器nginx
的配置文件里是没有涉及到ssl
,无论是开发环境和线上环境都是通过阿里云slb配置的https证书。而且两者的证书指纹一模一样,如图:
既然都是用的一样的证书,为啥一个检验通过,另一个检验不通过呢?这个时候我想到线上环境与开发环境唯一的不同就是线上环境多了一个cdn,于是就登陆到cdn的控制页面,找到对应的https证书,发现cdn的https证书指纹也是跟上面的指纹一样,如图:
既然指纹一样,那证书也应该是一样的,场面又进入了一个僵局。
于是我就到一台服务器里使用curl -vv https://www.lechange.com
,看到的结果如下:
提示未配置签发者根证书
,我这时候想起来了,首先证书指纹一致不能说明证书是完全一致的,只能说明key文件是一样的!其次这个https证书是中级机构证书,那么中级机构颁发的证书链规则是这样的:
1
2
3
4
5
6
7
8
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
那么我怀疑就是https证书链那部分可能在cdn配置错误了,或许在slb配置错误了,甚至两个都配置错误了!
于是干脆删除掉线上电商原有的https证书,重新导入cdn和slb的https证书,返回到symantec
刷新,这次的检验结果就OK了。
补充
虽然这个问题解决了,但是我还是不明白,为什么在网页端查看证书是绿色OK的呢?在sf.gg
上提问之后,一个叫Avro的朋友是这么回答我的:
以chrome为例,他信任了[所在平台的信任证书列表][1],而这些平台集成了一系列信任的根证书,如iOS 11 中可用的受信任根证书列表可以找到你的根证书“04 00 00 00 00 01 15 4B 5A C3 94 ”(序列号),因此验证过程中没有问题,而对于其他的工具,如果未使用这些平台根证书信任列表依然需要完整的证书链(这个证书链在ssl握手过程中被下发)进行校验。
参考资料
https://openclub.alipay.com/read.php?tid=3451&fid=57&page=1
https://www.jianshu.com/p/84af353f43c5
https://help.aliyun.com/knowledge_detail/39468.html?spm=a2c4g.11186631.2.2.w2qcWT