|
眾所周知,WEB服務(wù)存在http和https兩種通信方式,http默認(rèn)采用80作為通訊端口,對(duì)于傳輸采用不加密的方式,https默認(rèn)采用443,對(duì)于傳輸?shù)臄?shù)據(jù)進(jìn)行加密傳輸 目前主流的網(wǎng)站基本上開始默認(rèn)采用HTTPS作為通信方式,一切的考慮都基于對(duì)安全的要求,那么如何對(duì)自己的網(wǎng)站配置HTTPS通信,是本文著重介紹的 本文的主要內(nèi)容包括:https加密傳輸?shù)脑怼⑷绾紊暾?qǐng)https所用的CA證書,如何配置WEB服務(wù)支持https 1、https原理通俗講解 https=http+ssl,顧名思義,https是在http的基礎(chǔ)上加上了SSL保護(hù)殼,信息的加密過程就是在SSL中完成的 首先我們先不談https,先從一個(gè)簡單的通訊原理圖講起: http通信原理 客戶端發(fā)送一句client hello給服務(wù)器端,服務(wù)器端返回一句serverhello給客戶端,鑒于本文討論是https的加密主題,我們只討論信息傳輸?shù)募用軉栴} 實(shí)現(xiàn)客戶端和服務(wù)端發(fā)送的信息client hello 和server hello,即使中間的包被竊取了,也無法解密傳輸?shù)膬?nèi)容 http:client hello和server hello在通訊的過程中,以明文的形式進(jìn)行傳輸,采用wireshark抓包的效果如下圖: 有沒有感覺這個(gè)的信息傳輸是完全暴露在互聯(lián)網(wǎng)上面,你請(qǐng)求的所有信息都可以被窺測到,是不是感覺心一涼,不過不用擔(dān)心,我們的安全信息現(xiàn)在都是采用https的傳輸,后面講到https的時(shí)候大家心里會(huì)頓時(shí)輕松。但這不是最關(guān)鍵的,http的傳輸最大的隱患是信息劫持和篡改,如下圖: 可以看到,http的信息傳輸中,信息很容易被×××給劫持,更有甚者,×××可以偽裝服務(wù)器將篡改后的信息返回給用戶,試想一下,如果×××劫持的是你的銀行信息,是不是很可怕。所以對(duì)于http傳出存在的問題可以總結(jié)如下: (1)信息篡改:修改通信的內(nèi)容 (2)信息劫持:攔截到信息通信的內(nèi)容 這些是http不安全的體現(xiàn),說完http,我們回到本文的主題https,看下人家是怎么保護(hù)信息的,所有的請(qǐng)求信息都采用了TLS加密,如果沒有秘鑰是無法解析傳輸?shù)氖鞘裁葱畔?br> 對(duì)于加密傳輸存在對(duì)稱加密和非對(duì)稱加密 對(duì)稱加密 對(duì)稱加密傳輸 當(dāng)客戶端發(fā)送Hello字符串的時(shí)候,在進(jìn)行信息傳輸前,采用加密算法(上圖中的秘鑰S)將hello加密程JDuEW8&*21!@#進(jìn)行傳輸,即使中間被×××劫持了,如果沒有對(duì)應(yīng)的秘鑰S也無法知道傳出的信息為何物,在上圖中信息的加密和解密都是通過同一個(gè)秘鑰進(jìn)行的,對(duì)于這種加密我們稱之為對(duì)稱加密,只要A和B之間知道加解密的秘鑰,任何第三方都無法獲取秘鑰S,則在一定條件下,基本上解決了信息通信的安全問題。但在現(xiàn)實(shí)的情況下(www),實(shí)際的通訊模型遠(yuǎn)比上圖復(fù)雜,下圖為實(shí)際的通信模型 server和所有的client都采用同一個(gè)秘鑰S進(jìn)行加解密,但大家思考下,如果這樣的話,無異于沒有加密,請(qǐng)做下思考 由于server和所有的client都采用同一個(gè)秘鑰S,則×××們作為一個(gè)client也可以獲取到秘鑰S,此地?zé)o銀三百兩。所以在實(shí)際的通訊中,一般不會(huì)采用同一個(gè)秘鑰,而是采用不同的秘鑰加解密,如下圖 通過協(xié)商的方式獲取不同的秘鑰 如上圖,A和server通信采用對(duì)稱加密A算法,B和server通信采用對(duì)稱秘鑰B算法,因此可以很好的解決了不同的客戶端采用相同的秘鑰進(jìn)行通訊的問題 那現(xiàn)在又存在問題了,A通過明文傳輸和server協(xié)商采用了加密算法A,但這條信息本身是沒有加密的,因此×××們還是可以竊取到秘鑰的,整個(gè)的通訊仍然存在風(fēng)險(xiǎn)。那該如何處理呢?有人說,把這條信息(協(xié)調(diào)秘鑰的過程)再次加密,那是不是還要協(xié)商加密秘鑰,如此反復(fù),永無止境。從根本上無法解決信息通訊的安全問題 如何對(duì)協(xié)商過程進(jìn)行加密 非對(duì)稱加密原理圖 在密碼學(xué)跟對(duì)稱加密一起出現(xiàn)的,應(yīng)用最廣的加密機(jī)制“非對(duì)稱加密”,如上圖,特點(diǎn)是私鑰加密后的密文,只要是公鑰,都可以解密,但是反過來公鑰加密后的密文,只有私鑰可以解密。私鑰只有一個(gè)人有,而公鑰可以發(fā)給所有的人。 基于上述的特點(diǎn),我們可以得出如下結(jié)論: (1)公鑰是開放給所有人的,但私鑰是需要保密的,存在于服務(wù)端 (2)服務(wù)器端server向client端(A、B.....)的信息傳輸是不安全的:因?yàn)樗腥硕伎梢垣@取公鑰 (3)但client端(A、B.....)向server端的信息傳輸確實(shí)安全的:因?yàn)樗借€只有server端存在 因此,如何協(xié)商加密算法的問題,我們解決了,非對(duì)稱加密算法進(jìn)行對(duì)稱加密算法協(xié)商過程。 在這里我們做個(gè)小結(jié): 安全的獲取公鑰 細(xì)心的人可能已經(jīng)注意到了如果使用非對(duì)稱加密算法,我們的客戶端A,B需要一開始就持有公鑰,要不沒法開展加密行為啊。 這下,我們又遇到新問題了,如何讓A、B客戶端安全地得到公鑰? client獲取公鑰最最直接的方法是服務(wù)器端server將公鑰發(fā)送給每一個(gè)client用戶,但這個(gè)時(shí)候就出現(xiàn)了公鑰被劫持的問題,如上圖,client請(qǐng)求公鑰,在請(qǐng)求返回的過程中被×××劫持,那么我們將采用劫持后的假秘鑰進(jìn)行通信,則后續(xù)的通訊過程都是采用假秘鑰進(jìn)行,數(shù)據(jù)庫的風(fēng)險(xiǎn)仍然存在。在獲取公鑰的過程中,我們又引出了一個(gè)新的話題:如何安全的獲取公鑰,并確保公鑰的獲取是安全的, 那就需要用到終極武器了:SSL 證書(需要購買)和CA機(jī)構(gòu)
如上圖所示,在第 ② 步時(shí)服務(wù)器發(fā)送了一個(gè)SSL證書給客戶端,SSL 證書中包含的具體內(nèi)容有證書的頒發(fā)機(jī)構(gòu)、有效期、公鑰、證書持有者、簽名,通過第三方的校驗(yàn)保證了身份的合法,解決了公鑰獲取的安全性 以瀏覽器為例說明如下整個(gè)的校驗(yàn)過程: (1)首先瀏覽器讀取證書中的證書所有者、有效期等信息進(jìn)行一一校驗(yàn) (2)瀏覽器開始查找操作系統(tǒng)中已內(nèi)置的受信任的證書發(fā)布機(jī)構(gòu)CA,與服務(wù)器發(fā)來的證書中的頒發(fā)者CA比對(duì),用于校驗(yàn)證書是否為合法機(jī)構(gòu)頒發(fā) (3)如果找不到,瀏覽器就會(huì)報(bào)錯(cuò),說明服務(wù)器發(fā)來的證書是不可信任的。 (4)如果找到,那么瀏覽器就會(huì)從操作系統(tǒng)中取出 頒發(fā)者CA 的公鑰,然后對(duì)服務(wù)器發(fā)來的證書里面的簽名進(jìn)行解密 (5)瀏覽器使用相同的hash算法計(jì)算出服務(wù)器發(fā)來的證書的hash值,將這個(gè)計(jì)算的hash值與證書中簽名做對(duì)比 (6)對(duì)比結(jié)果一致,則證明服務(wù)器發(fā)來的證書合法,沒有被冒充 (7)此時(shí)瀏覽器就可以讀取證書中的公鑰,用于后續(xù)加密了 至此第一部分關(guān)于HTTPS的原理介紹已經(jīng)結(jié)束了,總結(jié)一下: HTTPS要使客戶端與服務(wù)器端的通信過程得到安全保證,必須使用的對(duì)稱加密算法,但是協(xié)商對(duì)稱加密算法的過程,需要使用非對(duì)稱加密算法來保證安全,然而直接使用非對(duì)稱加密的過程本身也不安全,會(huì)有中間人篡改公鑰的可能性,所以客戶端與服務(wù)器不直接使用公鑰,而是使用數(shù)字證書簽發(fā)機(jī)構(gòu)頒發(fā)的證書來保證非對(duì)稱加密過程本身的安全。這樣通過這些機(jī)制協(xié)商出一個(gè)對(duì)稱加密算法,就此雙方使用該算法進(jìn)行加密解密。從而解決了客戶端與服務(wù)器端之間的通信安全問題。 2、證書獲取的方式 由于HTTPS涉及到中間機(jī)構(gòu)的校驗(yàn),且這個(gè)校驗(yàn)的過程不是無償?shù)?,需要收費(fèi),因?yàn)樾枰竦谌綑C(jī)構(gòu)申請(qǐng)CA證書,用來完成身份的驗(yàn)證過程,這個(gè)過程也就是證書申請(qǐng)的過程,本章節(jié)為實(shí)戰(zhàn),具有實(shí)際的指導(dǎo)意義。 CA證書獲取的渠道 現(xiàn)如今不比以前了,云服務(wù)的概念不僅從理論上深入到了互聯(lián)網(wǎng)應(yīng)用,而且變成了一個(gè)社會(huì)的基礎(chǔ)設(shè)施工作,世界云服務(wù)3A:亞馬遜AWS、微軟Azure、阿里云,阿里云作為國人的驕傲躋身世界三大云服務(wù)廠商,且在國內(nèi),阿里云的市場份過半,且阿里云的操作系統(tǒng)“飛天系統(tǒng)”為自主研發(fā),而不是采用開源的OpenStack。因此這些云服務(wù)廠商都提供了友好的CA證書申請(qǐng)流程,本文只以阿里云、騰訊云、AlphaSSL進(jìn)行說明申請(qǐng)的流程 (1)、阿里云 登錄阿里云控制臺(tái)(https://www.aliyun.com/)在安全找到SSL證書,如下圖:
找到購買證書,進(jìn)入如下流程:
阿里云現(xiàn)提供4家主流的國際認(rèn)證機(jī)構(gòu),其實(shí)通過阿里云進(jìn)行證書的申請(qǐng),可以理解為由阿里云代理,幫你申請(qǐng)證書。對(duì)于證書有單一域名和通配符域名證書,顧名思義,單一域名的證書,獲取的證書只能驗(yàn)證指定的一個(gè)域名的安全性,但通配符域名(如*.aa.com)所有的以*.aa.com開始的域名都可以識(shí)別,當(dāng)然這里面涉及到DV SSL 、 OV SSL 、EV SSL的概念,因?yàn)樵谫I之前一定要知道這個(gè)概念的意義,否則錢花的會(huì)不知所然。 DV SSLDV SSL證書是只驗(yàn)證網(wǎng)站域名所有權(quán)的簡易型(Class 1級(jí))SSL證書,可10分鐘快速頒發(fā),能起到加密傳輸?shù)淖饔?,但無法向用戶證明網(wǎng)站的真實(shí)身份。 目前市面上的免費(fèi)證書都是這個(gè)類型的,只是提供了對(duì)數(shù)據(jù)的加密,但是對(duì)提供證書的個(gè)人和機(jī)構(gòu)的身份不做驗(yàn)證。 OV SSLOV SSL,提供加密功能,對(duì)申請(qǐng)者做嚴(yán)格的身份審核驗(yàn)證,提供可信×××明。 和DV SSL的區(qū)別在于,OV SSL 提供了對(duì)個(gè)人或者機(jī)構(gòu)的審核,能確認(rèn)對(duì)方的身份,安全性更高。 所以這部分的證書申請(qǐng)是收費(fèi)的~ EV SSL超安=EV=最安全、最嚴(yán)格 超安EV SSL證書遵循全球統(tǒng)一的嚴(yán)格身份驗(yàn)證標(biāo)準(zhǔn),是目前業(yè)界安全級(jí)別最高的頂級(jí) (Class 4級(jí))SSL證書。 金融證券、銀行、第三方支付、網(wǎng)上商城等,重點(diǎn)強(qiáng)調(diào)網(wǎng)站安全、企業(yè)可信形象的網(wǎng)站,涉及交易支付、客戶隱私信息和賬號(hào)密碼的傳輸。 這部分的驗(yàn)證要求最高,申請(qǐng)費(fèi)用也是最貴的。
根據(jù)保護(hù)域名的數(shù)量需求,SSL證書又分為: 單域名版:只保護(hù)一個(gè)域名,例如 www. 或者 login. 之類的單個(gè)域名 多域名版:一張證書可以保護(hù)多個(gè)域名,例如同時(shí)保護(hù) www. , www., pay.efg.com 等 通配符版:一張證書保護(hù)同一個(gè)主域名下同一級(jí)的所有子域名,不限個(gè)數(shù),形如 *. 。注意,通配符版只有 DVSSL 和 OVSSL 具有, EVSSL 不具有通配符版本。 阿里云目前已經(jīng)不提供免費(fèi)的SSL證書,即DV SSL,但目前國內(nèi)可以提供免費(fèi)的SSL證書的云廠商有騰訊云,至于什么時(shí)候收費(fèi),筆者暫時(shí)不太清楚,但至少這個(gè)時(shí)期是OK的 騰訊云 登錄騰訊云控制臺(tái)(https://cloud.tencent.com),找到SSL證書,如下圖:
進(jìn)入購買頁面,找到域名型免費(fèi)性(DV),點(diǎn)擊“免費(fèi)申請(qǐng)”
進(jìn)入域名驗(yàn)證環(huán)節(jié),需要注意:通用域名必須是指定的一個(gè)明確的域名地址,不能是通配域名,其次私鑰密碼在申請(qǐng)的過程中是選填,但在國外網(wǎng)站申請(qǐng)的時(shí)候確實(shí)必填
選在驗(yàn)證方式,筆者一般會(huì)通過文件的方式,直接通過nginx創(chuàng)建一個(gè)文件目錄,進(jìn)行通信就可以完成身份的驗(yàn)證,具體的驗(yàn)證過程可以參考騰訊云的詳細(xì)說明。
等待審核通過,一般在1-3小時(shí)的時(shí)間 筆者在申請(qǐng)的過程中是采用的國外的網(wǎng)站,說起來就是一把辛酸淚,因?yàn)閲獾牟僮髁?xí)慣和國人的習(xí)慣有很大的差異,且直接走國外申請(qǐng)需要填寫的信息很多,但也有好處,便宜。具筆者計(jì)算,一個(gè)統(tǒng)配域名在國外買在1800人民幣的樣子,但在國內(nèi)購買需要2500以上。接下來重點(diǎn)介紹AlphaSSL購買流程 AlphaSSL申請(qǐng)網(wǎng)址:https://www./ssl-certificates/select-region/ (1):選擇所在區(qū)域,此處選擇other(國外沒有將Asia作為一個(gè)明確的區(qū)域標(biāo)識(shí)氣憤,但誰讓我們技不如人呢)
(2)產(chǎn)品詳情:此處注意購買統(tǒng)配的域名,這個(gè)買起來更劃算。
(3)基本信息的填寫,沒有什么需要注意的
(4)CSR這個(gè)步驟是最容易出錯(cuò),且不太能讓人理解的地方,筆者在這里做個(gè)簡單的普及。
CSR(證書請(qǐng)求文件) 包含申請(qǐng)證書所需要的相關(guān)信息,其中最重要的是域名,填寫的域名必須是你要https方式訪問的那個(gè)域名。如 或 web.,其中CSR生成的方式很多,筆者直接用了網(wǎng)上的一個(gè)生成網(wǎng)站:https:///csr_create.html 填寫好相關(guān)的信息,尤其是域名信息一定要正確,可以根據(jù)生成的方式進(jìn)行生成,生成之后產(chǎn)生了2個(gè)文件,一個(gè)為CSR文件,用來向CA機(jī)構(gòu)申請(qǐng)的文件,一般以CSR結(jié)尾,一個(gè)是KEY文件,這個(gè)文件一定要保存好,這個(gè)文件就是對(duì)應(yīng)第一章節(jié)將的server端的私鑰,這個(gè)信息首先是重要,如果這個(gè)KEY文件沒有保存好,是無法找回的,因?yàn)镵EY生成的過程不可逆,即使填寫的過程都一樣,生成的KEY是不通的,具有隨機(jī)性 https://support./customer/portal/articles/1223116 將生成的CRS粘貼進(jìn)入第四步點(diǎn)擊下一步就進(jìn)入了付款環(huán)節(jié),由于是國外購買,所以必須使用VISA的信用卡。一般付款之后,6小時(shí)左右證書就可以下來。當(dāng)然筆者在申請(qǐng)的過程中就把KEY文件給丟了,導(dǎo)致找客服(英文對(duì)話,核實(shí)身份),其實(shí)如果申請(qǐng)存在問題,7天內(nèi)是可以申請(qǐng)退款,其次如果你把KEY文件丟失了,可以通過找客服進(jìn)行更新,詳細(xì)可以參考:https://support./customer/portal/articles/1223116 至此,對(duì)于第二章節(jié)的SSL申請(qǐng)過程就講解 完畢,是不是很詳細(xì),筆者可是走了很多的坑,但對(duì)于SSL的申請(qǐng)是深入了解 3、配置WEB服務(wù)支持https 通過第一章節(jié)HTTPS的原理講解和第二章節(jié)對(duì)申請(qǐng)的介紹,到了我們?cè)赪EB服務(wù)器端配置支持HTTPS,由于筆者是采用的nginx+tomcat的架構(gòu)方式,因此配置的方式以nginx+tomcat的方式進(jìn)行講解 在nginx的配置文件中,新增如下配置項(xiàng),在這個(gè)地方有一個(gè)參數(shù):ssl on,如果這個(gè)參數(shù)開啟,http和https將不能共存。里面對(duì)應(yīng)的信息都可以通過CA機(jī)構(gòu)獲取到 這里給出了阿里云SSL在主流apache、nginx的配置文檔:https://help.aliyun.com/video_detail/54216.html?spm=a2c4g.11186623.4.1.WbwjQN 騰訊云SSL配置文檔:https://cloud.tencent.com/document/product/400/4143 但配置nginx之后,對(duì)于tomcat需要在配置文件conf/server.xml文件中新增如下內(nèi)容
至此關(guān)于HTTPS的所有內(nèi)容已經(jīng)結(jié)束。 |
|
|