話說,剛剛過去的週六下午(咱們是調休,可不是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下載選項,那麼下載的證書應是合併後的,就應該沒有這個問題了.
雖然說,這個問題是有驚無險的解決了,但值得反思和總結的是: