新年伊始瘫辩,就解決了我內心的一大困惑伏嗜,真好。
今天記錄一下在更換ssl證書時遇到的問題伐厌。
先記錄一下目前關于ssl的使用情況和遇到的問題承绸,再說一下排查問題的過程和最終的解決方案。
目前我司是在godaddy上采買的ssl證書弧械,并運用在web端和app端八酒,用來做單向ssl加密。用來對傳輸?shù)男畔⑦M行加密刃唐。但是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認證文件的內容问畅,但是并不是全部替換的,一些已經(jīng)賣出去并安裝好的app中六荒,就沒有替換护姆,但是也可以繼續(xù)使用;替換了ssl認證文件的app掏击,仍然可以繼續(xù)使用卵皂。
有一個前提需要說一下,就是2018年所使用的ssl證書也是在godaddy上購買的砚亭。2019年是發(fā)現(xiàn)過期后灯变,又重新購買了一次。按說重新購買了ssl證書捅膘,ssl認證文件都應該是全新的才對啊添祸,怎么可能2018年的認證文件還可以使用呢?于是排查重點就落在了這上寻仗。
開始懷疑是不是app開發(fā)人員更換過認證文件的內容刃泌,只是發(fā)型版本是2018年版本的,忘了更換的事兒了署尤“姨妫可是在2019年初備份的舊的ssl內容中,可以看到曹体,確確實實內容除了服務器CA證書外(后續(xù)再解釋服務器CA證書是啥)俗扇,都是相同的。這就表明混坞,2018年和2019年證書的部分內容是相同的狐援,只有服務器CA證書不同。這又是為啥呢究孕?于是給godaddy技術客服打電話啥酱,我的問題也不是上來就很明確,也是在不斷的對話中才整理清晰的厨诸,比較有意思的是镶殷,打了好幾次電話,明顯可以感覺出男技術人員說起話來就比較自信一些微酬,遇到了好幾次都是女技術绘趋,咋說對方也聽不明白啊颤陶。反復強調的就是每次購買或者續(xù)費了ssl證書,都是需要重新下載安裝的陷遮。我問的是滓走,為啥前后兩年的認證文件內容是相同的,對方也跟我說的是重新下載和安裝帽馋,后來根本也沒法對話了搅方,只能作罷了。自己查吧绽族,也沒查到啥有用的信息姨涡。就這樣,2019年就過去了0陕L纹!
到了2020-01-02检诗,再次跟同事聊到這個問題匈仗,同事提出了一些我沒有概念的問題,比如根證書岁诉,服務器CA證書等概念锚沸,他還提出可以通過一個網(wǎng)站,查看一個ssl證書是否是根證書涕癣。于是我按照他的思路哗蜈,驗證了一下godaddy和阿里云的ssl證書,果然坠韩,godaddy中購買的ssl證書包括兩個文件距潘,一個服務器CA文件,一個中級證書文件只搁。其中音比,中級證書文件中就包含根證書的內容。而在阿里云購買的ssl證書氢惋,只包含一個pem文件洞翩,內容為一個服務器CA證書,一個中間證書CA焰望。不包括根證書Iб凇!熊赖!
注意了啊来屠,阿里云購買的ssl證書中只包含中間證書CA,不包括根證書!
這里引入驗證ssl內容是否是根文件的工具:
https://myssl.com/cert_decode.html
根證書:
于是產(chǎn)生疑問,問啥阿里云購買的ssl證書就不包含根證書,而godaddy上購買的ssl就包含根證書呢指攒?既然詢問godaddy技術解釋不明白,那就詢問阿里云的技術吧酥郭,上圖:
如上可見,阿里云之所以沒有提供根證書,是因為阿里云默認ssl證書是使用在瀏覽器端的,而主流的瀏覽器都內置了各大權威CA機構的根證書零抬,所以阿里云默認無需提供;這也正是為啥使用阿里云的ssl證書宽涌,web瀏覽器端沒有問題。只是除了瀏覽器端蝶棋,還有一個app端也預埋了ssl認證文件內容卸亮,app端不像瀏覽器端內置了CA根證書,app端啥也沒有玩裙,所以當app端發(fā)現(xiàn)服務端沒有根證書時兼贸,認為證書鏈是不完整的,所以無法建立ssl單向加密連接吃溅,所以才會報錯溶诞。這點已經(jīng)在2019年初驗證過一次了,剛買完ssl證書時决侈,我只配置了服務器CA證書和秘鑰螺垢,而沒有添加中級證書部分的內容,這時app端即使替換了認證文件赖歌,也還是報連接錯誤枉圃。排查一圈發(fā)現(xiàn),跟2018年的證書內容比庐冯,缺少了中級證書部分的內容孽亲,于是添加上以后,app端就正常了展父。其實原理上就是沒有提供根證書所致7稻ⅰ!栖茉!
同時篮绿,上圖也驗證了為啥中間證書CA的內容沒有變化,是因為都是在godaddy上購買的ssl證書衡载,證書的品牌類型是相同的搔耕,中級證書的內容也沒有變化,所以才會出現(xiàn)2018年預埋的證書內容,在2019年已經(jīng)過期并再次購買后還是有效的弃榨。其實無論是續(xù)費還是重新購買菩收,都會重新生成服務器CA證書,如果品牌相同鲸睛,則中級證書部分是不會改變的娜饵,只有服務器CA證書發(fā)生變化而已。經(jīng)過查看發(fā)現(xiàn)官辈,中級證書中的中間證書CA箱舞,有效期是20年,只有服務器CA證書的時長是購買ssl證書的時長拳亿,一年晴股,二年,最長三年肺魁,目前电湘,證書還有14天就到期了:
因為國內外的產(chǎn)品意識不同,godaddy與阿里云針對ssl產(chǎn)品提供的形式也不同鹅经。Godaddy更提倡還原技術本身寂呛,從手動創(chuàng)建csr和中級證書中包含根證書可以看出,godaddy要求技術人員參與的更多瘾晃,同時回饋給技術人員的也越多贷痪,但是godaddy不提供私鑰,即key蹦误,因為csr是客戶手動生產(chǎn)的劫拢;而阿里云則是一鍵式的,無需用戶手動創(chuàng)建csr胖缤,阿里云直接系統(tǒng)生成了尚镰,產(chǎn)品中包含key但不包含根證書,因為默認是在瀏覽器端使用的哪廓,瀏覽器內置了CA機構狗唉,可以識別并解析ssl請求。
這樣涡真,對ssl的使用場景就有了需求分俯,如果瀏覽器端,沒有問題哆料,二者都可以缸剪。如果是app中預埋ssl證書內容,則阿里云默認是不提供的东亦。需要額外提交工單杏节,說明此情況唬渗,阿里云才會把根證書提供給你。但因為同時使用了godaddy和阿里云的ssl證書奋渔,才會混淆了產(chǎn)品镊逝。沒有盡早意識到根證書這個重要的因素!
如果2020年還是在godaddy上采買ssl證書嫉鲸,那么針對app預埋內容撑蒜,即將會出現(xiàn)的情況是,預埋了服務器CA證書的app(2019年版)玄渗,將會因為服務器CA證書的到期座菠,而失效;反而是預埋了中間證書內容的app(2018年版)藤树,將會繼續(xù)正常使用浴滴。這就很奇葩了,預埋的是中間證書還是服務器CA證書岁钓,還有說道巡莹。不知道2018版本的app預埋中間證書的人,是早就知道了這其中的道理甜紫,還是瞎貓碰上死耗子了,正好埋對了骂远。前者的可能性大一點囚霸!
而如果2020年是在阿里云上采買ssl證書,則所有的app預埋都將作廢激才,因為購買廠商不同拓型,證書品牌也不同。再或者就是干脆去掉app預埋ssl瘸恼!
阿里云ssl證書品牌:
Godaddy ssl證書品牌:
同時劣挫,還發(fā)現(xiàn)了一個情況,就是阿里云針對不同的域名提供的根證書內容是一致的东帅。這也表明压固,阿里云采用的CA認證機構是同一個。所以頒發(fā)的根證書才一樣靠闭。
但是阿里云給出的回復中也可以看到帐我,預埋其實是存在隱患的:
無論是預埋了服務器CA證書,還是中級證書愧膀,都存在隱患拦键!
建議是:
不太明白系統(tǒng)信任庫是啥。
目前是已經(jīng)將阿里云的ssl證書申請了退款檩淋,計劃是在godaddy上購買ssl證書芬为。本次沒有實現(xiàn)產(chǎn)品的統(tǒng)一。后續(xù)如果修改了預埋ssl證書的情況,需要重新發(fā)版媚朦,則可在阿里云采買ssl證書氧敢,實現(xiàn)統(tǒng)一管理。
不管后續(xù)怎樣發(fā)展莲镣,本次對ssl證書的研究都是值得的福稳。
補充:
根證書:由CA機構頒發(fā)的根證書;
中間證書CA:由指定CA機構頒發(fā)的子證書瑞侮,非服務器CA證書的圆,非根證書;可理解為根證書的子證書半火;
服務器CA證書:即針對指定域名的CA證書(*.com越妈,*.net);