我是这样理解HTTP和HTTPS区别的
為何要用https?
http協議的缺點
- 通信使用明文,內容可能被竊聽(重要密碼泄露)
- 不驗證通信方身份,有可能遭遇偽裝(跨站點請求偽造)
- 無法證明報文的完整性,有可能已遭篡改(運營商劫持)
用https能解決這些問題么?
https是在http協議基礎上加入加密處理和認證機制以及完整性保護,即http+加密+認證+完整性保護=https
https并非應用層的一種新協議,只是http通信接口部分用ssl/tls協議代替而已。通常http直接和tcp通信,當使用ssl時則演變成先和ssl通信,再由ssl和tcp通信。
所謂https,其實就是身披ssl協議這層外殼的http
SSL/TLS是什么?
SSL 是“Secure Sockets Layer”的縮寫,中文叫做“安全套接層”。它是在上世紀90年代中期,由網景公司設計的。
為啥要發明 SSL 這個協議?因為原先互聯網上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為了解決這些問題。
到了1999年,SSL 因為應用廣泛,已經成為互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化之后的名稱改為 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協議”。
所以這兩者其實就是同一種協議,只不過是在不同階段的不同稱呼。
SSL協議位于TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:
SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。
SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用于在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。
對稱秘鑰加密和非對稱秘鑰加密
對稱密鑰加密,又稱私鑰加密,即信息的發送方和接收方用同一個密鑰去加密和解密數據。它的最大優勢是加/解密速度快,適合于對大數據量進行加密,但密鑰管理困難。
非對稱密鑰加密,又稱公鑰加密,它需要使用一對密鑰來分別完成加密和解密操作,一個公開發布,即公開密鑰,另一個由用戶自己秘密保存,即私用密鑰。信息發送者用公開密鑰去加密,而信息接收者則用私用密鑰去解密。
從功能角度而言非對稱加密比對稱加密功能強大,但加密和解密速度卻比對稱密鑰加密慢得多。
非對稱密鑰通信過程
SSL/TLS協議基本原理
SSL/TLS協議的基本思路是采用公鑰加密法,也就是說,客戶端先向服務器端索要公鑰,然后用公鑰加密信息,服務器收到密文后,用自己的私鑰解密,但是這里有兩個問題:
(1)、如何保證公鑰不被篡改?
解決方法:將公鑰放在數字證書中,只要證書是可信的,公鑰就是可信的。
(2)、公鑰加密計算量太大,如何減少耗用的時間?
解決方法:每一次對話(session),客戶端和服務器端都生成一個"對話密鑰"(session key),用它來加密信息。由于"對話密鑰"是對稱加密,所以運算速度非常快,而服務器公鑰只用于加密"對話密鑰"本身,這樣就減少了加密運算的消耗時間。
因此,SSL/TLS協議的基本過程是這樣的:
具體過程可參考下面的栗子
假定客戶端叫做愛麗絲,服務器叫做鮑勃,整個握手過程可以用下圖說明
第一步,愛麗絲給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支持的加密方法,具體的加密方法可參考SSL證書背后的加密算法。
第二步,鮑勃確認雙方使用的加密方法,并給出數字證書、以及一個服務器生成的隨機數(Server random)。
第三步,愛麗絲確認數字證書有效,然后生成一個新的隨機數(Premaster secret),并使用數字證書中的公鑰,加密這個隨機數,發給鮑勃。
第四步,鮑勃使用自己的私鑰,獲取愛麗絲發來的隨機數(即Premaster secret)。
第五步,愛麗絲和鮑勃根據約定的加密方法,使用前面的三個隨機數,生成"對話密鑰"(session key),用來加密接下來的整個對話過程。
HTTPS工作原理
1、客戶端發起HTTPS請求
用戶在瀏覽器里輸入一個https網址,然后連接到server的443端口。
2、服務端的配置
采用HTTPS協議的服務器必須要有一套數字證書,可以自己制作,也可以向組織申請,區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面。
3、傳送證書
這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。
4、客戶端解析證書
這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。
(1)首先瀏覽器讀取證書中的證書所有者、有效期等信息進行一一校驗
(2)瀏覽器開始查找操作系統中已內置的受信任的證書發布機構CA,與服務器發來的證書中的頒發者CA比對,用于校驗證書是否為合法機構頒發
(3)如果找不到,瀏覽器就會報錯,說明服務器發來的證書是不可信任的。
(4)如果找到,那么瀏覽器就會從操作系統中取出頒發者CA 的公鑰(多數瀏覽器開發商發布
版本時,會事先在內部植入常用認證機關的公開密鑰),然后對服務器發來的證書里面的簽名進行解密
(5)瀏覽器使用相同的hash算法計算出服務器發來的證書的hash值,將這個計算的hash值與證書中簽名做對比
(6)對比結果一致,則證明服務器發來的證書合法,沒有被冒充
(7)此時瀏覽器就可以讀取證書中的公鑰,用于后續加密了
5、傳送加密信息
這部分傳送的是用證書加密后的隨機值(私鑰),目的就是讓服務端得到這個隨機值,以后客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。
6、服務端解密信息
服務端用私鑰解密后,得到了客戶端傳過來的隨機值(私鑰),然后把內容通過該值進行對稱加密
7、傳輸加密后的信息
這部分信息是服務端用私鑰加密后的信息,可以在客戶端被還原。
8、客戶端解密信息
客戶端用之前生成的私鑰解密服務端傳過來的信息,于是獲取了解密后的內容,整個過程第三方即使監聽到了數據,也束手無策。
原理如下圖
總結HTTP和HTTPS區別如下
如何配置https
配置https最重要的是配置ssl證書,配置SSL證書可以參考SSL證書部署指南
這里我們以自簽證書來演示
生成自簽證書
生成私鑰文件
sudo openssl genrsa -out server.key 2048
生成自簽證書文件
sudo openssl req -new -x509 -days 1826 -key server.key -out server.crt
修改apache配置
apache2.4
需開啟的模塊
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
sudo vim httpd-ssl.conf
<VirtualHost *:443>DocumentRoot "/var/www/html"ServerName www.domain.com:443SSLEngine on SSLCertificateFile /usr/local/apache/conf/server.crt #添加證書文件 SSLCertificateKeyFile /usr/local/apache/conf/server.key #添加私鑰文件 </VirtualHost>檢測配置文件是否有錯誤
sudo apachectl configtest
重啟apache
sudo apachectl restart
Fiddler/Charles是如何監聽HTTPS?
第一步,Fiddler截獲客戶端發送給服務器的HTTPS請求,Fiddler偽裝成客戶端向服務器發送請求進行握手 。
第二步,服務器發回相應,Fiddler獲取到服務器的CA證書, 用根證書(這里的根證書是CA認證中心給自己頒發的證書)公鑰進行解密, 驗證服務器數據簽名, 獲取到服務器CA證書公鑰。然后Fiddler偽造自己的CA證書(這里的CA證書,也是根證書,只不過是Fiddler偽造的根證書), 冒充服務器證書傳遞給客戶端瀏覽器。
第三步,與普通過程中客戶端的操作相同,客戶端根據返回的數據進行證書校驗、生成密碼Pre_master、用Fiddler偽造的證書公鑰加密,并生成HTTPS通信用的對稱密鑰enc_key。
第四步,客戶端將重要信息傳遞給服務器, 又被Fiddler截獲。Fiddler將截獲的密文用自己偽造證書的私鑰解開, 獲得并計算得到HTTPS通信用的對稱密鑰enc_key。Fiddler將對稱密鑰用服務器證書公鑰加密傳遞給服務器。
第五步,與普通過程中服務器端的操作相同,服務器用私鑰解開后建立信任,然后再發送加密的握手消息給客戶端。
第六步,Fiddler截獲服務器發送的密文, 用對稱密鑰解開, 再用自己偽造證書的私鑰加密傳給客戶端。
第七步,客戶端拿到加密信息后,用公鑰解開,驗證HASH。握手過程正式完成,客戶端與服務器端就這樣建立了”信任“。
在之后的正常加密通信過程中,Fiddler如何在服務器與客戶端之間充當第三者呢?
服務器—>客戶端:Fiddler接收到服務器發送的密文, 用對稱密鑰解開, 獲得服務器發送的明文。再次加密, 發送給客戶端。
客戶端—>服務端:客戶端用對稱密鑰加密,被Fiddler截獲后,解密獲得明文。再次加密,發送給服務器端。由于Fiddler一直擁有通信用對稱密鑰enc_key, 所以在整個HTTPS通信過程中信息對其透明。
轉載于:https://www.cnblogs.com/wmm123/p/11103421.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的我是这样理解HTTP和HTTPS区别的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点的形状
- 下一篇: 函数类型:有参函数、无参函数、匿名函数、