新年伊始,就解決了我內心的一大困惑,真好。
今天記錄一下在更換ssl證書時遇到的問題。
先記錄一下目前關于ssl的使用情況和遇到的問題,再說一下排查問題的過程和最終的解決方案。
目前我司是在godaddy上采買的ssl證書,并運用在web端和app端,用來做單向ssl加密。用來對傳輸的信息進行加密。但是2020-01-17,godaddy上的ssl證書即將到期,涉及到續(xù)費的問題。由于域名是在阿里云上采買的,為了保持一致,想將ssl證書也在阿里云上采買,統(tǒng)一管理嘛。采買很順利,購買的dv類型的ssl證書,但是更換以后,web端可以正常訪問https的,但手機app端就報異常,提示無法連接。于是排查問題的道路就在2019年底開始了!
起初,覺得問題也挺簡單的,因為我記得2019年初的時候,在godaddy上采買完ssl證書后,是把一個證書的內容給了安卓app端,他們把證書內容替換到程序中后,就可以正常使用ssl了。本次也是這么打算的,可是安卓開發(fā)說,為啥2018年版本的app,到了2019年就不用替換,目前還可用,為啥本次就得替換?問的我確實有些懵逼了。我印象中,2019年初,確實是替換了一次ssl認證文件的內容,但是并不是全部替換的,一些已經賣出去并安裝好的app中,就沒有替換,但是也可以繼續(xù)使用;替換了ssl認證文件的app,仍然可以繼續(xù)使用。
有一個前提需要說一下,就是2018年所使用的ssl證書也是在godaddy上購買的。2019年是發(fā)現過期后,又重新購買了一次。按說重新購買了ssl證書,ssl認證文件都應該是全新的才對啊,怎么可能2018年的認證文件還可以使用呢?于是排查重點就落在了這上。
開始懷疑是不是app開發(fā)人員更換過認證文件的內容,只是發(fā)型版本是2018年版本的,忘了更換的事兒了。可是在2019年初備份的舊的ssl內容中,可以看到,確確實實內容除了服務器CA證書外(后續(xù)再解釋服務器CA證書是啥),都是相同的。這就表明,2018年和2019年證書的部分內容是相同的,只有服務器CA證書不同。這又是為啥呢?于是給godaddy技術客服打電話,我的問題也不是上來就很明確,也是在不斷的對話中才整理清晰的,比較有意思的是,打了好幾次電話,明顯可以感覺出男技術人員說起話來就比較自信一些,遇到了好幾次都是女技術,咋說對方也聽不明白啊。反復強調的就是每次購買或者續(xù)費了ssl證書,都是需要重新下載安裝的。我問的是,為啥前后兩年的認證文件內容是相同的,對方也跟我說的是重新下載和安裝,后來根本也沒法對話了,只能作罷了。自己查吧,也沒查到啥有用的信息。就這樣,2019年就過去了?。。?/p>
到了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端發(fā)現服務端沒有根證書時,認為證書鏈是不完整的,所以無法建立ssl單向加密連接,所以才會報錯。這點已經在2019年初驗證過一次了,剛買完ssl證書時,我只配置了服務器CA證書和秘鑰,而沒有添加中級證書部分的內容,這時app端即使替換了認證文件,也還是報連接錯誤。排查一圈發(fā)現,跟2018年的證書內容比,缺少了中級證書部分的內容,于是添加上以后,app端就正常了。其實原理上就是沒有提供根證書所致?。?!
同時,上圖也驗證了為啥中間證書CA的內容沒有變化,是因為都是在godaddy上購買的ssl證書,證書的品牌類型是相同的,中級證書的內容也沒有變化,所以才會出現2018年預埋的證書內容,在2019年已經過期并再次購買后還是有效的。其實無論是續(xù)費還是重新購買,都會重新生成服務器CA證書,如果品牌相同,則中級證書部分是不會改變的,只有服務器CA證書發(fā)生變化而已。經過查看發(fā)現,中級證書中的中間證書CA,有效期是20年,只有服務器CA證書的時長是購買ssl證書的時長,一年,二年,最長三年,目前,證書還有14天就到期了:

因為國內外的產品意識不同,godaddy與阿里云針對ssl產品提供的形式也不同。Godaddy更提倡還原技術本身,從手動創(chuàng)建csr和中級證書中包含根證書可以看出,godaddy要求技術人員參與的更多,同時回饋給技術人員的也越多,但是godaddy不提供私鑰,即key,因為csr是客戶手動生產的;而阿里云則是一鍵式的,無需用戶手動創(chuàng)建csr,阿里云直接系統(tǒng)生成了,產品中包含key但不包含根證書,因為默認是在瀏覽器端使用的,瀏覽器內置了CA機構,可以識別并解析ssl請求。
這樣,對ssl的使用場景就有了需求,如果瀏覽器端,沒有問題,二者都可以。如果是app中預埋ssl證書內容,則阿里云默認是不提供的。需要額外提交工單,說明此情況,阿里云才會把根證書提供給你。但因為同時使用了godaddy和阿里云的ssl證書,才會混淆了產品。沒有盡早意識到根證書這個重要的因素!
如果2020年還是在godaddy上采買ssl證書,那么針對app預埋內容,即將會出現的情況是,預埋了服務器CA證書的app(2019年版),將會因為服務器CA證書的到期,而失效;反而是預埋了中間證書內容的app(2018年版),將會繼續(xù)正常使用。這就很奇葩了,預埋的是中間證書還是服務器CA證書,還有說道。不知道2018版本的app預埋中間證書的人,是早就知道了這其中的道理,還是瞎貓碰上死耗子了,正好埋對了。前者的可能性大一點!
而如果2020年是在阿里云上采買ssl證書,則所有的app預埋都將作廢,因為購買廠商不同,證書品牌也不同。再或者就是干脆去掉app預埋ssl!
阿里云ssl證書品牌:

Godaddy ssl證書品牌:

同時,還發(fā)現了一個情況,就是阿里云針對不同的域名提供的根證書內容是一致的。這也表明,阿里云采用的CA認證機構是同一個。所以頒發(fā)的根證書才一樣。
但是阿里云給出的回復中也可以看到,預埋其實是存在隱患的:


無論是預埋了服務器CA證書,還是中級證書,都存在隱患!
建議是:

不太明白系統(tǒng)信任庫是啥。
目前是已經將阿里云的ssl證書申請了退款,計劃是在godaddy上購買ssl證書。本次沒有實現產品的統(tǒng)一。后續(xù)如果修改了預埋ssl證書的情況,需要重新發(fā)版,則可在阿里云采買ssl證書,實現統(tǒng)一管理。
不管后續(xù)怎樣發(fā)展,本次對ssl證書的研究都是值得的。
補充:
根證書:由CA機構頒發(fā)的根證書;
中間證書CA:由指定CA機構頒發(fā)的子證書,非服務器CA證書,非根證書;可理解為根證書的子證書;
服務器CA證書:即針對指定域名的CA證書(*.com,*.net);