其實,我對https以前只有一個大概的了解,最近工作中遇到一個問題從而將https協議做了一個徹底的學習和認知,下邊介紹一下我的個人認識,我不一定按照很官方的語句去表達,本人喜歡用通俗易懂的語言描述問題,目的是讓人理解 那么,首先,https協議是什么,一句話,https=http+ssl安全傳輸協議+ca身份認證;https是http的安全版,它不僅涵蓋http協議,而且加入了ssl安全加密傳輸協議保證數據傳輸的安全性,ca身份認證則驗證服務器域名是否是真實可靠的?
1,下面,用一幅圖展示一下https建立連接的整個過程
①客戶端的瀏覽器向服務器傳送客戶端SSL 協議的版本號,加密算法的種類,產生的隨機數,以及其他服務器和客戶端之間通訊所需要的各種信息。
②服務器向客戶端傳送SSL 協議的版本號,加密算法的種類,隨機數以及其他相關信息,同時服務器還將向客戶端傳送自己的證書。
③客戶利用服務器傳過來的信息驗證服務器的合法性,服務器的合法性包括:證書是否過期,發行服務器證書的CA 是否可靠,發行者證書的公鑰能否正確解開服務器證書的“發行者的數字簽名”,服務器證書上的域名是否和服務器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續進行第四步。
④用戶端隨機產生一個用于后面通訊的“對稱密碼”,然后用服務器的公鑰(服務器的公鑰從步驟②中的服務器的證書中獲得)對其加密,然后傳給服務器。
⑤服務器用私鑰解密“對稱密碼”(此處的公鑰和私鑰是相互關聯的,公鑰加密的數據只能用私鑰解密,私鑰只在服務器端保留。然后用其作為服務器和客戶端的“通話密碼”加解密通訊。同時在SSL 通訊過程中還要完成數據通訊的完整性,防止數據通訊中的任何變化。
⑥客戶端向服務器端發出信息,指明后面的數據通訊將使用的步驟⑤中的主密碼為對稱密鑰,同時通知服務器客戶端的握手過程結束。
⑦服務器向客戶端發出信息,指明后面的數據通訊將使用的步驟⑤中的主密碼為對稱密鑰,同時通知客戶端服務器端的握手過程結束。
⑧SSL 的握手部分結束,SSL 安全通道的數據通訊開始,客戶和服務器開始使用相同的對稱密鑰進行數據通訊,同時進行通訊完整性的檢驗。
這里有幾個問題:?(1)請注意第2步時,當服務器給客戶端返回自己的證書時,證書包含三部分內容,公鑰、名稱、數字簽名等信息;注意數字簽名是加密的,數字簽名是用頒發機構的私鑰對本證書的公鑰,名稱以及其他信息做hash散列加密而成的,所以客戶端需要解密數字簽名來驗證該證書是否是合法可靠的,那怎么解密呢,客戶端瀏覽器會找到該證書的根證書頒發機構,然后在本機上的證書管理器里尋找?那些受信任的根證書頒發機構列表是否有該證書的根證書頒發機構,如果有,則用該根證書的公鑰解密服務器下發的證書?a,如果不能正常解密,則服務器下發的證書則被認為是偽造的,瀏覽器彈出提示框?b,如果能正常解密,則獲取到公鑰,名稱,數字簽名信息跟本身的公鑰等其他信息比對一下,確認公鑰沒有被篡改,如果公鑰不一致,則依然被認為是不可信的?因此客戶端驗證服務器的合法性取決于公鑰,而公鑰的合法性取決于ca證書頒發機構的合法性,這里會形成一個信任鏈,而終點則是CA根證書,根證書是CA機構自己辦法給自己的,根證書是一個特殊的數字證書,公鑰是公開的,而私鑰是被CA機構保存在硬件中的,所以證書的安全性取決于你對該CA機構的信任,反過來說,加入CA機構的密鑰被竊取,那么該CA機構頒發的所有證書將會存在災難性安全問題;?就像你驗證身份證是否真實,肯定去公安局驗證,那么誰來保證公安局是合法可靠的呢,沒人能保證,公安局自己生命自己是合法可靠的,就這么簡單?(2)ok,上邊扯了那么多,無為就為了一個目的,客戶端根據服務器下發的證書驗證了服務器是真實可靠的,然后進入第3步,客戶端生成一個密鑰,就是對稱加密算法的密鑰用于加密后續的數據傳輸?
總結一下,https傳輸在建立連接時使用的是非對稱加密算法,一旦連接建立完成,有后續的通訊則使用了對稱加密算法,這樣做的好處是有利于數據傳輸效率,眾所周知非對稱加密算法的性能很差勁,你懂得。?
2,好了,上邊我們介紹了https的通信流程,那么對于https通信是否就真的很安全呢,這種協議是否有問題呢,例如服務器證書是否可以被偽造呢,客戶端是否有可能被欺騙呢,答案是肯定的,我們接下來介紹幾種常見的攻擊手段。
1)一個合法有效的SSL證書誤簽發給了假冒者
這是一種由于證書認證機構工作出現疏忽、流程不完善而出現的證書被錯誤簽發的情形。其主要原因是證書認證機構在簽發SSL服務器證書前,沒有認真鑒別證書申請者提交的身份信息的真偽,或者沒有通過安全可靠的方式驗證、確認申請者就是他提供的身份材料中所聲稱的那個人。比如,假冒者提供了虛假的營業執照、組織機構代碼證書、域名注冊文件等, ? ? ? 而證書認證機構沒有或沒能夠鑒別出假冒者提供的身份信息的真偽,把一個合法有效的證書簽發給了假冒者;再比如,假冒者向證書認證機構提交了其他網站擁有者的有效身份資料,如營業執照、組織機構代碼證、域名注冊文件(這些資料,假冒者有時可通過合法的途徑獲得),而證書認證機構沒有通過安全、可靠的途徑驗證、確認證書申請者確實是其聲稱的人 ? ? ? ? 本人(或聲稱的機構本身),把本屬于另一個合法有效的網站的服務器證書簽發給了假冒網站。無論何種情形,假冒者都可以利用用戶對服務器證書的信任進行網絡欺詐活動。
2)破解SSL證書簽發CA的私鑰
如果SSL證書簽發CA的密鑰對的安全強度不夠(密鑰長度太短),或者是一個弱密鑰對,或者其產生方式有規律可循(不是完全隨機產生的),那么,就可能造成CA私鑰被破解,假冒者就可以用被破解的CA的私鑰生成、簽發合法、有效的SSL服務器證書。
但在實際中,只要CA的密鑰對有足夠的長度、按完全隨機的方式產生、且避開弱密鑰對,則CA的私鑰是根本無法破解的,或者破解的成本極高,完全超過了破解可能帶來的好處。
3)SSL證書簽發CA的私鑰泄露
證書認證機構由于管理不善,或者使用了不安全的密碼設備,導致簽發SSL證書的CA私鑰被泄露,從而使得假冒者可以利用它簽發合法有效的SSL證書。
這種情況可以通過加強認證機構的安全管理,使用安全可靠的密碼設備來避免。
4)破解SSL證書的私鑰
目前的SSL證書主要是基于RSA公開密鑰算法,對這個算法的攻擊目前除了蠻力攻擊外,還沒有有效的方法。但是,如果SSL證書密鑰對的安全強度不夠(密鑰長度不夠),或者是一個弱密鑰對,或者其產生方式不是完全隨機的,那么,就可能造成SSL證書的私鑰被破解,假冒者就可以將該SSL證書及其被破解的私鑰安裝在假冒網站上進行欺詐活動(SSL證書本身是公開的,可以很容易地得到)。
在實際應用中,只要SSL證書密鑰對有足夠的長度、按完全隨機的方式產生、且避開弱密鑰對,則SSL證書的私鑰是根本無法破解的,或者破解的成本極高,完全超過了破解可能帶來的好處。
在討論、分析SSL證書私鑰破解的風險時,我們需要提到一個人們常常關心的問題。我們知道,出于管理的規范性、品牌、知名度等原因,目前國內 的SSL證書主要由國外的認證機構簽發,對此,人們會有這種疑問和擔心,“如果SSL證書由國外認證機構簽發,那么,是否會導致SSL證書的密鑰 對容易被國外敵對機構破解、或竊取”?要回答這個問題,我們必須先了解SSL證書的密鑰對是怎樣產生的,以及私鑰是怎樣保存的。
實際上,SSL證書的密鑰對是由網站擁有者通過Web服務器軟件自己產生并保存在Web服務器軟件的密鑰庫中,或者在Web服務器軟件使用的SSL加速卡(加密硬件)中產生并保存在加密硬件中;客戶申請簽發SSL證書時,證書請求中只包含有公鑰,不包含私鑰,私鑰是不會傳送到證書認證機構的。因此,SSL證書的密鑰對是否會被破解完全取決于密鑰對的長度是否足夠長、產生的密鑰對是否是弱密鑰對、以及密鑰對的產生是否有規律可循(即是否是完全隨機產生的),與SSL證書是由國內還是國外認證機構簽發的沒有關系;私鑰是否會被竊取、泄露,完全取決于SSL證書客戶采取的私鑰保護安全措施。當然,從陰謀論的角度,由于目前的Web服務器軟件大多來自國外,它們留有后門,從而產生弱密鑰對,或者留有后門,使得密鑰對的產生有規律可循,這也是可能的,但這與SSL證書是由國內還是國外認證機構簽發的沒有關系。
5)SSL證書的私鑰泄露
SSL證書的私鑰通常是安裝在Web服務器上的,如果沒有采取足夠的安全措施對私鑰進行安全保護,則有可能導致私鑰被泄露,比如,從Web服務器中導出。
在實際中,只要通過適當的安全管理措施和技術手段,就能有效地防止SSL證書的私鑰被泄露。比如,只允許安全可信的人員訪問Web服務器并采取雙人(或多人)控制的訪問方式,并禁止SSL證書私鑰導出,或者給SSL證書私鑰加上口令保護且對口令進行分割保存(將口令分割給多個可信人員,每個人僅擁有分割后口令的一部分),又或者將SSL證書私鑰存放在加密硬件中(如SSL硬件加速器),且對私鑰采取安全保護措施(如不允許私鑰導出,或不允許私鑰明文導出)。
6)偽造一個合法有效的SSL證書
即假冒者通過一定的技術手段,利用證書技術本身存在漏洞,偽造一個由某個認證機構簽發的、有效的SSL證書。這個偽造SSL證書的格式符合X509規范,它的簽發者指向該認證機構(的某個CA證書),且該SSL證書的數字簽名可由該認證機構(對應CA證書)的公鑰驗證。
雖然,有研究者聲稱可以偽造一個X509數字證書,但真實的情況是,到目前為止,并沒有人能夠偽造一個實際可用的、有效的數字證書。
7)認證機構主動為假冒網站簽發合法有效的服務器證書
這種情況在兩個國家處于敵對狀態時有可能發生。假設A國家的某個認證機構簽發的證書被B國家的用戶信任(由于該認證機構的根證書預埋在B國家用戶使用的操作系統、應用軟件中),而這時,A國和B處于敵對、甚至戰爭狀態,A國家政府為了擾亂B國的金融秩序,要求該國的認證機構簽發假冒B國銀行網站的SSL證書,而A國的認證機構從國家利益考慮,遵從本國政府的要求,為該國政府建立的假冒網站簽發“合法、有效的”假冒SSL證書。這里說它“合法、有效”,是因為當B國用戶使用瀏覽器訪問該假冒網站時,瀏覽器對該SSL證書的信任驗證是獲得通過的。
這時,假冒網站的域名有兩種可能情形:第一種是,該網站域名與被假冒網站的域名相似但不同,用戶沒有注意到這些細小的差異,從而訪問了假冒網站。對于這種情況,由于域名不同,因此,細心的用戶有可能識破假冒行為。第二種是,假冒網站的域名同被假冒網站的域名完全相同。在這種情況下,如果A國控制了域名服務體系的“根”域名服務器,那么,A國是可以通過修改域名解析記錄,將B國用戶引導到A國建立的假冒網站上的,而且B國用戶絲毫察覺不到這種改變。這種假冒,比第一種情況要難識破、難防范得多。目前全球共13臺根域名服務器,分布情況是:主根服務器(A)1個,設置在美國弗吉尼亞州的杜勒,輔根服務器(B至M)美國9個,瑞典、荷蘭、日本各1個。考慮到目前的根域名服務器,都部署在西方國家,且主要在美國,而且“主根”域名服務器也在美國,因此,這是一個我們需要重視的問題和風險。
需要特別指出的是,出現這種假冒,與B國銀行網站本身安裝的服務器證書由誰簽發無關。因為對SSL服務器證書的信任是由瀏覽器根據其信任的根CA證書自動做出判斷的,在這個過程中用戶并不介入;只要瀏覽器驗證該SSL證書的信任路徑鏈接到一個可信任根CA證書,瀏覽器就不提出警告信息,用戶就會認為這個SSL證書是可信的。因此,只要B國用戶的主機操作系統(如Windows)、應用程序(如Firefox)中預置A國認證機構的可信根CA證書,那么,即使B國的銀行網站的服務器證書是由該國自身的認證機構簽發,A國仍然可通過A國的認證機構簽發針對B國網站的“合法、有效”的假冒SSL證書,安裝在假冒網站上。當B國用戶訪問假冒網站時,騙過B國用戶的瀏覽器對該SSL證書的可信性、有效性驗證,由于普通用戶通常是不會關心所訪問網站的SSL證書是由哪個認證機構簽發的(普通用戶不會也不知道 在瀏覽器完成SSL證書驗證后,可查看要訪問網站的SSL證書的詳情),從而騙得B國用戶對假冒網站的信任。
我國目前的主機操作系統、瀏覽器絕大部分是國外的,其中預埋了大量的根CA證書,且絕大部分是國外認證機構的,而且考慮到域名系統的“根”也在國外,因此,這一問題需要引起我們的高度重視。但是,我們也可以看到,要徹底解決這個問題,必須從操作系統、應用軟件、域名體系整個一起來考慮、解決,僅靠限定國內認證機構簽發SSL證書是無法解決這個問題的。
8)利用可信的SSL服務器證書進行中間人攻擊
假設攻擊者通過某種途徑獲得了一個與某網站域名完全相同的SSL證書,且該SSL證書(的根CA證書)被用戶的瀏覽器信任,即從證書驗證的角度它是一個“合法、有效”的證書,則該攻擊者就有可能在位于用戶與網站之間的網絡通路上,進行中間人攻擊,竊取用戶的私密信息(如圖2所示)。這種攻擊的具體實施方法如下:
(1)?攻擊者通過在網絡通路上安裝特殊的設備,或者攻破、控制網絡通信設備(如路由器、交換機等),在其上面安裝的特殊的處理代碼;
(2)?然后,攻擊者攔截所有連接到該網站的網絡連接請求,利用他得到的SSL服務器證書,假冒網絡站點與客戶端瀏覽器進行身份鑒別和建立SSL安全通道的操作;
(3)?同時,攻擊者又假冒用戶同安裝了一個SSL服務器證書的網站建立SSL連接;
(4)?之后,攻擊者作為用戶和網站之間的中間人,攔截、轉發二者之間傳送的數據,并同時竊取用戶的敏感信息。
由于攻擊者使用的SSL證書是被用戶瀏覽器信任的,因此,用戶不會察覺到這中間人的活動。
圖2利用可信的SSL服務器證書進行中間人攻擊
這里,攻擊者可通過前面1)至7)所列的方式獲得一個與被竊聽網站域名相同的SSL證書;或者,攻擊者也可以由于8)中所述的國家與國家之間網絡戰爭的原因,從某個被用戶信任的證書認證機構獲得用于中間人攻擊的“合法、有效的”SSL證書。
與8)中所述的情形類似,要進行這樣的攻擊,只需要這個用于中間人攻擊的SSL證書是被用戶瀏覽器信任的即可,不需要該SSL證書與被竊聽的網站本身安裝的SSL證書由同一個認證機構簽發。這意味著,即使我們限定國內網站的SSL證書必須由國內證書認證機構簽發,其他國家仍然可以利用他們自己國家證書認證機構簽發的、用于假冒國內網站的SSL證書,對國內網站進行中間人攻擊。因為,我國用戶使用的操作系統、瀏覽器都預埋了大量的國外證書認證機構的根CA證書,這些根CA證書被瀏覽器認為是可信的。因此,在它們之下簽發的SSL證書都被瀏覽器認為是“合法的、有效的、可信的”。
9)在用戶主機中植入偽造的根CA證書(或一個完整的CA證書鏈)
從前面的介紹我們知道,SSL服務器證書是否可信,是由瀏覽器通過調用本地的加密服務接口(如CryptoAPI、PKCS#11),檢驗、確認服務器證書的信任鏈(證書路徑)是否鏈接到本地證書庫中的一個信任的CA根證書。因此,網站假冒者、中間人攻擊者只要設法將一個偽造的根CA證書 (或一個完整的、偽造的CA證書鏈)植入到用戶計算機的操作系統、瀏覽器證書庫中,則在這個偽造的根CA證書下,網站假冒者、中間人攻擊者可簽發任何他想簽發的、并被瀏覽器信任的假冒SSL證書。而且,假冒者、中間人攻擊者甚至可以將這個偽造的根CA證書以及它的下級CA證書中的CA認證機構的名稱,取的與一個合法認證機構的名稱相同,這將更有欺騙性,用戶更難識破。
植入偽造的根CA證書(及其下級CA證書)的方式有兩種,一是,通過掛馬、病毒傳播,這是普通的假冒者、攻擊者就可以做到的;二是,在操作系統、應用軟件(如瀏覽器)中預置。第二種方式之所以有可能成立,是因為目前國內的操作系統、應用軟件絕大多數來自國外,在特殊情況下,國外的操作系統、應用軟件的廠家是有可能根據本國政府的要求,將偽造其他國家證書認證機構的根CA證書預置到操作系統、應用軟件的可信根CA證書庫中的,甚至可以做到,通過通常的人機接口(如IE瀏覽器)無法查看到該偽造的根CA證書,而當應用程序(如瀏覽器)通過加密接口(如CryptoAPI、PKCS#11)驗證SSL證書的信任鏈時,該偽造的根CA證書又起作用、被信任。
10)旁路證書可信性的驗證
當操作系統、瀏覽器本身存在后門時,是完全可以做到旁路對某些特定的SSL證書(如某個特定的、偽造的CA簽發的SSL證書)的可信性檢驗,使得這些SSL證書總是作為可信的證書被瀏覽器接受。這樣,假冒者、中間人攻擊者可以利用這個后們,簽發假冒的、被客戶端瀏覽器信任的SSL證書,達到竊取用戶信息的目的。
對SSL證書可信性驗證的旁路既可以在操作系統層面(如密碼模塊層)發生,也可以在瀏覽器層面發生。這個后門既可能是操作系統、瀏覽器廠家自己故意留下的(比如根據本國政府的要求),也可能是由于感染了木馬、病毒,使得操作系統、瀏覽器的程序代碼被修改而造成的。
我想到了cnnic的證書風波,被chrome和firefox聲明,將不信任該機構頒發的所有證書,唉,真悲劇,所以我覺得根證書頒發機構應該是一個非盈利組織,他不應該跟任何盈利性企業有利益關系,這種組織才有資格去頒發證書,否則有利益關系就容易合作去做壞事,但這個問題怎么說好呢,由于申請一個證書或者一堆證書,往往也需要不少錢,所以國內很多公司,例如中國移動,電信,銀行以及支付寶,他會在你安裝軟件的時候,給你系統里安裝他自己頒發的根證書,這樣他就可以給自己服務器上按自己辦法給自己的證書,而你的客戶端將信任他,包括很多內網的https也都是自己給自己頒發證書的