[TOC]
# HTTPS綜述
HTTPS是在HTTP上建立SSL加密層,對傳輸數據進行加密,是HTTP協議的安全版。主要作用是:
1、對數據進行加密,建立一個信息安全通道來保證傳輸過程中數據的安全
2、對網站服務器進行真實身份認證
# HTTP通信存在的問題
1、HTTP通信使用明文,內容可能被竊聽
2、無法證明報文的完整性,可能遭篡改
3、不驗證通信方的身份,可能遭遇偽裝
# HTTPS如何改進了HTTP存在的問題

HTTP直接和TCP通信,當使用SSL時,變成HTTP先和SSL通信,再由SSL和TTCP通信。也就是HTTPS就是身披SSL協議這層外殼的HTTP。

## 加密
HTTPS協議的主要功能依賴于TLS/SSL協議,TLS/SSL的功能實現主要依賴于三類基本算法:散列函數、對稱加密和非對稱加密,其中利用非對稱加密實現身份認證和密鑰協商,對稱加密算法采用協商后的密鑰對數據加密,基于散列函數驗證信息的完整性。

1、對稱加密
這種方式加密和解密使用同一個密鑰。
2、非對稱加密
公開密鑰和私有密鑰是配對的一套密鑰,發送密文的一方使用對方的公開密鑰進行加密處理,對方收到加密信息后,使用自己的私有密鑰進行解密。
這種方式不需要發送用來解密的私有密鑰,就不用擔心密鑰被竊聽而盜走。但使用非對稱加密在數據加密解密過程需要消耗一定時間,降低了數據傳輸效率。
3、對稱加密+非對稱加密(HTTPS采用的方式)
發送密文的一方使用對方的公開密鑰進行加密處理“對稱的密鑰”,然后對方用自己的私有密鑰拿到“對稱的密鑰”,在確保安全的前提下拿到“對稱的密鑰”,再使用對稱加密的方式進行通信交換報文等。
## 校驗數據完整性--數字簽名
數字簽名的兩個功能
1、確定消息是由發送方簽名并發送過來的,不是其他人假冒的
2、驗證消息的完整性,保證消息未被篡改
數字簽名的生成:

將一段文本先用Hash函數生成消息摘要,然后用發送者的私鑰加密生成數字簽名,與原文一起傳給接受者。
接收者校驗數字簽名:

接收者使用Hash函數對收到的文本生成摘要信息,再使用發送者的公鑰解密數字簽名得到信息摘要,對比兩個信息摘要是否完全一致。
當然接收者需要使用發送者的公鑰,公鑰不能在不安全網絡中直接發送,采用的是數字證書方案,后面詳細講解。
## 解放身份偽裝問題--數字證書
數字證書認證機構處于客戶端與服務器雙方都可信賴的第三方機構的立場上。

數字證書認證機構的業務流程:
* 服務器的運營人員向第三方機構CA提交公鑰、組織信息、個人信息(域名)等信息并申請認證;
* CA通過線上、線下等多種手段驗證申請者提供信息的真實性,如組織是否存在、企業是否合法,是否擁有域名的所有權等;
* 如信息審核通過,CA會向申請者簽發認證文件-證書。證書包含以下信息:申請者公鑰、申請者的組織信息和個人信息、簽發機構 CA的信息、有效時間、證書序列號等信息的明文,同時包含一個簽名。其中簽名的產生算法:首先,使用散列函數計算公開的明文信息的信息摘要,然后,采用 CA的私鑰對信息摘要進行加密,密文即簽名;
* 客戶端 Client 向服務器 Server 發出請求時,Server 返回證書文件;
* 客戶端 Client 讀取證書中的相關的明文信息,采用相同的散列函數計算得到信息摘要,然后,利用對應 CA的公鑰解密簽名數據,對比證書的信息摘要,如果一致,則可以確認證書的合法性,即服務器的公開密鑰是值得信賴的。
* 客戶端還會驗證證書相關的域名信息、有效時間等信息; 客戶端會內置信任CA的證書信息(包含公鑰),如果CA不被信任,則找不到對應 CA的證書,證書也會被判定非法。
# HTTPS工作流程

1.Client發起一個HTTPS(比如 `https://juejin.im/user`)的請求,根據RFC2818的規定,Client知道需要連接Server的443(默認)端口。
2.Server把事先配置好的公鑰證書(public key certificate)返回給客戶端。
3.Client驗證公鑰證書:比如是否在有效期內,證書的用途是不是匹配Client請求的站點,是不是在CRL吊銷列表里面,它的上一級證書是否有效,這是一個遞歸的過程,直到驗證到根證書(操作系統內置的Root證書或者Client內置的Root證書)。如果驗證通過則繼續,不通過則顯示警告信息。
4.Client使用偽隨機數生成器生成加密所使用的對稱密鑰,然后用證書的公鑰加密這個對稱密鑰,發給Server。
5.Server使用自己的私鑰(private key)解密這個消息,得到對稱密鑰。至此,Client和Server雙方都持有了相同的對稱密鑰。
6.Server使用對稱密鑰加密“明文內容A”,發送給Client。
7.Client使用對稱密鑰解密響應的密文,得到“明文內容A”。
8.Client再次發起HTTPS的請求,使用對稱密鑰加密請求的“明文內容B”,然后Server使用對稱密鑰解密密文,得到“明文內容B”。
# HTTPS工作流程簡單版:

0、CA機構使用其私鑰對Server證書(包含Server公鑰)信息概要進行加密生成數字簽名,將公鑰證書部署到Server
1、Client發起Https請求,Server將加密數據返回給Client
2、Client使用CA機構的公鑰對加密數據進行解密,得到Server的證書和公鑰
3、Client隨機生成一個對稱加密的密鑰,使用Server的公鑰對其進行非對稱加密
4、Server收到加密后的信息后使用私鑰解密,得到對稱加密的密鑰
5、接下來Client和Server直接就可以使用對稱加密的方式進行通信了
# 為何不所有的網站都使用HTTPS
1、首先,很多人還是會覺得HTTPS實施有門檻,這個門檻在于需要權威CA頒發的SSL證書。從證書的選擇、購買到部署,傳統的模式下都會比較耗時耗力。
2、其次,HTTPS普遍認為性能消耗要大于HTTP,因為與純文本通信相比,加密通信會消耗更多的CPU及內存資源。如果每次通信都加密,會消耗相當多的資源,平攤到一臺計算機上時,能夠處理的請求數量必定也會隨之減少。
3、購買證書需要額外的開銷
4、國內安全意識相對薄弱
參考:[深入理解https工作原理]([https://mp.weixin.qq.com/s/G-mw8oJHWgcSOAV8Vp6bPw](https://mp.weixin.qq.com/s/G-mw8oJHWgcSOAV8Vp6bPw))
- 導讀
- Java知識
- Java基本程序設計結構
- 【基礎知識】Java基礎
- 【源碼分析】Okio
- 【源碼分析】深入理解i++和++i
- 【專題分析】JVM與GC
- 【面試清單】Java基本程序設計結構
- 對象與類
- 【基礎知識】對象與類
- 【專題分析】Java類加載過程
- 【面試清單】對象與類
- 泛型
- 【基礎知識】泛型
- 【面試清單】泛型
- 集合
- 【基礎知識】集合
- 【源碼分析】SparseArray
- 【面試清單】集合
- 多線程
- 【基礎知識】多線程
- 【源碼分析】ThreadPoolExecutor源碼分析
- 【專題分析】volatile關鍵字
- 【面試清單】多線程
- Java新特性
- 【專題分析】Lambda表達式
- 【專題分析】注解
- 【面試清單】Java新特性
- Effective Java筆記
- Android知識
- Activity
- 【基礎知識】Activity
- 【專題分析】運行時權限
- 【專題分析】使用Intent打開三方應用
- 【源碼分析】Activity的工作過程
- 【面試清單】Activity
- 架構組件
- 【專題分析】MVC、MVP與MVVM
- 【專題分析】數據綁定
- 【面試清單】架構組件
- 界面
- 【專題分析】自定義View
- 【專題分析】ImageView的ScaleType屬性
- 【專題分析】ConstraintLayout 使用
- 【專題分析】搞懂點九圖
- 【專題分析】Adapter
- 【源碼分析】LayoutInflater
- 【源碼分析】ViewStub
- 【源碼分析】View三大流程
- 【源碼分析】觸摸事件分發機制
- 【源碼分析】按鍵事件分發機制
- 【源碼分析】Android窗口機制
- 【面試清單】界面
- 動畫和過渡
- 【基礎知識】動畫和過渡
- 【面試清單】動畫和過渡
- 圖片和圖形
- 【專題分析】圖片加載
- 【面試清單】圖片和圖形
- 后臺任務
- 應用數據和文件
- 基于網絡的內容
- 多線程與多進程
- 【基礎知識】多線程與多進程
- 【源碼分析】Handler
- 【源碼分析】AsyncTask
- 【專題分析】Service
- 【源碼分析】Parcelable
- 【專題分析】Binder
- 【源碼分析】Messenger
- 【面試清單】多線程與多進程
- 應用優化
- 【專題分析】布局優化
- 【專題分析】繪制優化
- 【專題分析】內存優化
- 【專題分析】啟動優化
- 【專題分析】電池優化
- 【專題分析】包大小優化
- 【面試清單】應用優化
- Android新特性
- 【專題分析】狀態欄、ActionBar和導航欄
- 【專題分析】應用圖標、通知欄適配
- 【專題分析】Android新版本重要變更
- 【專題分析】唯一標識符的最佳做法
- 開源庫源碼分析
- 【源碼分析】BaseRecyclerViewAdapterHelper
- 【源碼分析】ButterKnife
- 【源碼分析】Dagger2
- 【源碼分析】EventBus3(一)
- 【源碼分析】EventBus3(二)
- 【源碼分析】Glide
- 【源碼分析】OkHttp
- 【源碼分析】Retrofit
- 其他知識
- Flutter
- 原生開發與跨平臺開發
- 整體歸納
- 狀態及狀態管理
- 零碎知識點
- 添加Flutter到現有應用
- Git知識
- Git命令
- .gitignore文件
- 設計模式
- 創建型模式
- 結構型模式
- 行為型模式
- RxJava
- 基礎
- Linux知識
- 環境變量
- Linux命令
- ADB命令
- 算法
- 常見數據結構及實現
- 數組
- 排序算法
- 鏈表
- 二叉樹
- 棧和隊列
- 算法時間復雜度
- 常見算法思想
- 其他技術
- 正則表達式
- 編碼格式
- HTTP與HTTPS
- 【面試清單】其他知識
- 開發歸納
- Android零碎問題
- 其他零碎問題
- 開發思路