新年伊始,就解决了我内心的一大困惑,真好。
今天记录一下在更换ssl证书时遇到的问题。
先记录一下目前关于ssl的使用情况和遇到的问题,再说一下排查问题的过程和最终的解决方案。
目前我司是在godaddy上采买的ssl证书,并运用在web端和app端,用来做单向ssl加密。用来对传输的信息进行加密。但是2020-01-17,godaddy上的ssl证书即将到期,涉及到续费的问题。由于域名是在阿里云上采买的,为了保持一致,想将ssl证书也在阿里云上采买,统一管理嘛。采买很顺利,购买的dv类型的ssl证书,但是更换以后,web端可以正常访问https的,但手机app端就报异常,提示无法连接。于是排查问题的道路就在2019年底开始了!
起初,觉得问题也挺简单的,因为我记得2019年初的时候,在godaddy上采买完ssl证书后,是把一个证书的内容给了安卓app端,他们把证书内容替换到程序中后,就可以正常使用ssl了。本次也是这么打算的,可是安卓开发说,为啥2018年版本的app,到了2019年就不用替换,目前还可用,为啥本次就得替换?问的我确实有些懵逼了。我印象中,2019年初,确实是替换了一次ssl认证文件的内容,但是并不是全部替换的,一些已经卖出去并安装好的app中,就没有替换,但是也可以继续使用;替换了ssl认证文件的app,仍然可以继续使用。
有一个前提需要说一下,就是2018年所使用的ssl证书也是在godaddy上购买的。2019年是发现过期后,又重新购买了一次。按说重新购买了ssl证书,ssl认证文件都应该是全新的才对啊,怎么可能2018年的认证文件还可以使用呢?于是排查重点就落在了这上。
开始怀疑是不是app开发人员更换过认证文件的内容,只是发型版本是2018年版本的,忘了更换的事儿了。可是在2019年初备份的旧的ssl内容中,可以看到,确确实实内容除了服务器CA证书外(后续再解释服务器CA证书是啥),都是相同的。这就表明,2018年和2019年证书的部分内容是相同的,只有服务器CA证书不同。这又是为啥呢?于是给godaddy技术客服打电话,我的问题也不是上来就很明确,也是在不断的对话中才整理清晰的,比较有意思的是,打了好几次电话,明显可以感觉出男技术人员说起话来就比较自信一些,遇到了好几次都是女技术,咋说对方也听不明白啊。反复强调的就是每次购买或者续费了ssl证书,都是需要重新下载安装的。我问的是,为啥前后两年的认证文件内容是相同的,对方也跟我说的是重新下载和安装,后来根本也没法对话了,只能作罢了。自己查吧,也没查到啥有用的信息。就这样,2019年就过去了!!!
到了2020-01-02,再次跟同事聊到这个问题,同事提出了一些我没有概念的问题,比如根证书,服务器CA证书等概念,他还提出可以通过一个网站,查看一个ssl证书是否是根证书。于是我按照他的思路,验证了一下godaddy和阿里云的ssl证书,果然,godaddy中购买的ssl证书包括两个文件,一个服务器CA文件,一个中级证书文件。其中,中级证书文件中就包含根证书的内容。而在阿里云购买的ssl证书,只包含一个pem文件,内容为一个服务器CA证书,一个中间证书CA。不包括根证书!!!
注意了啊,阿里云购买的ssl证书中只包含中间证书CA,不包括根证书!
这里引入验证ssl内容是否是根文件的工具:
https://myssl.com/cert_decode.html
根证书:
于是产生疑问,问啥阿里云购买的ssl证书就不包含根证书,而godaddy上购买的ssl就包含根证书呢?既然询问godaddy技术解释不明白,那就询问阿里云的技术吧,上图:
如上可见,阿里云之所以没有提供根证书,是因为阿里云默认ssl证书是使用在浏览器端的,而主流的浏览器都内置了各大权威CA机构的根证书,所以阿里云默认无需提供;这也正是为啥使用阿里云的ssl证书,web浏览器端没有问题。只是除了浏览器端,还有一个app端也预埋了ssl认证文件内容,app端不像浏览器端内置了CA根证书,app端啥也没有,所以当app端发现服务端没有根证书时,认为证书链是不完整的,所以无法建立ssl单向加密连接,所以才会报错。这点已经在2019年初验证过一次了,刚买完ssl证书时,我只配置了服务器CA证书和秘钥,而没有添加中级证书部分的内容,这时app端即使替换了认证文件,也还是报连接错误。排查一圈发现,跟2018年的证书内容比,缺少了中级证书部分的内容,于是添加上以后,app端就正常了。其实原理上就是没有提供根证书所致!!!
同时,上图也验证了为啥中间证书CA的内容没有变化,是因为都是在godaddy上购买的ssl证书,证书的品牌类型是相同的,中级证书的内容也没有变化,所以才会出现2018年预埋的证书内容,在2019年已经过期并再次购买后还是有效的。其实无论是续费还是重新购买,都会重新生成服务器CA证书,如果品牌相同,则中级证书部分是不会改变的,只有服务器CA证书发生变化而已。经过查看发现,中级证书中的中间证书CA,有效期是20年,只有服务器CA证书的时长是购买ssl证书的时长,一年,二年,最长三年,目前,证书还有14天就到期了:
因为国内外的产品意识不同,godaddy与阿里云针对ssl产品提供的形式也不同。Godaddy更提倡还原技术本身,从手动创建csr和中级证书中包含根证书可以看出,godaddy要求技术人员参与的更多,同时回馈给技术人员的也越多,但是godaddy不提供私钥,即key,因为csr是客户手动生产的;而阿里云则是一键式的,无需用户手动创建csr,阿里云直接系统生成了,产品中包含key但不包含根证书,因为默认是在浏览器端使用的,浏览器内置了CA机构,可以识别并解析ssl请求。
这样,对ssl的使用场景就有了需求,如果浏览器端,没有问题,二者都可以。如果是app中预埋ssl证书内容,则阿里云默认是不提供的。需要额外提交工单,说明此情况,阿里云才会把根证书提供给你。但因为同时使用了godaddy和阿里云的ssl证书,才会混淆了产品。没有尽早意识到根证书这个重要的因素!
如果2020年还是在godaddy上采买ssl证书,那么针对app预埋内容,即将会出现的情况是,预埋了服务器CA证书的app(2019年版),将会因为服务器CA证书的到期,而失效;反而是预埋了中间证书内容的app(2018年版),将会继续正常使用。这就很奇葩了,预埋的是中间证书还是服务器CA证书,还有说道。不知道2018版本的app预埋中间证书的人,是早就知道了这其中的道理,还是瞎猫碰上死耗子了,正好埋对了。前者的可能性大一点!
而如果2020年是在阿里云上采买ssl证书,则所有的app预埋都将作废,因为购买厂商不同,证书品牌也不同。再或者就是干脆去掉app预埋ssl!
阿里云ssl证书品牌:
Godaddy ssl证书品牌:
同时,还发现了一个情况,就是阿里云针对不同的域名提供的根证书内容是一致的。这也表明,阿里云采用的CA认证机构是同一个。所以颁发的根证书才一样。
但是阿里云给出的回复中也可以看到,预埋其实是存在隐患的:
无论是预埋了服务器CA证书,还是中级证书,都存在隐患!
建议是:
不太明白系统信任库是啥。
目前是已经将阿里云的ssl证书申请了退款,计划是在godaddy上购买ssl证书。本次没有实现产品的统一。后续如果修改了预埋ssl证书的情况,需要重新发版,则可在阿里云采买ssl证书,实现统一管理。
不管后续怎样发展,本次对ssl证书的研究都是值得的。
补充:
根证书:由CA机构颁发的根证书;
中间证书CA:由指定CA机构颁发的子证书,非服务器CA证书,非根证书;可理解为根证书的子证书;
服务器CA证书:即针对指定域名的CA证书(*.com,*.net);