本書是一本專業的HTTPS書籍,全面講解了HTTPS領域的相關知識,內容包括密碼學、OpenSSL命令行、證書、TLS協議、HTTPS網站性能優化、HTTPS網站優秀實踐、大型網站HTTPS架構設計等。本書有幾個特點:(1)內容全面而新穎,基于RFC文檔、國外書籍、社區等一手資料,總結了大部分最新的HTTPS知識;(2)由淺入深,從基礎到進階全面掌握HTTPS,讀者能夠輕松構建一個HTTPS網站,并使網站安全性和性能最大化,對于大型網站的HTTPS系統架構和應用架構設計也有指導意義;(3)內容通俗易懂,用語描述精準,充分考慮到讀者的閱讀和思考習慣,只要具備基礎的HTTPS知識和Linux知識就能無障礙閱讀;(4)理論結合實踐,本書除了讓讀者掌握HTTPS的交互細節,更注重實踐,介紹了很多工具,讓讀者更好地掌握HTTPS;(5)具有啟發性,讀者可以通過本書開啟密碼學和HTTPS學習之門,真正做到“深入”。HTTPS(TLS協議)重點在于密碼學,互聯網安全是第一位的,所以任何技術領域(比如目前火爆的區塊鏈)都需要密碼學和HTTPS(TLS協議)知識,架構人員、開發人員、運維人員都適合閱讀本書。
虞大膽,本名虞衛東,新浪網高級技術經理,負責新浪郵箱后端開發工作。曾先后供職過新浪博客產品部和趕集網移動事業部,在新浪博客工作多年,擔任過開發工程師、技術經理、應用架構師等職位,負責新浪博客的開發、運維、設計、性能優化等工作。在趕集網擔任技術總監職位,負責趕集網客戶端后端開發工作。十余年來一直致力于 Web 后端開發,積累了豐富的架構設計、開發、運維經驗,擅長 PHP、Python 等開發語言。本書對 HTTPS 各方面的知識進行總結歸納,通過通俗的語言進行描述,真正做到深入淺出,從理論到實踐的結合,并分享給讀者。
目錄
第1章 HTTP介紹 1
1.1 什么是Web 1
1.1.1 廣義理解Web 1
1.1.2 Web的組成 2
1.2 理解HTTP 4
1.2.1 HTTP的定義 4
1.2.2 HTTP語義 5
1.2.3 HTTP的特點 8
1.3 網絡模型 9
1.3.1 TCP/IP概述 9
1.3.2 Socket和TCP 12
1.4 協議安全分析 13
1.4.1 安全問題舉例 13
1.4.2 協議不安全的根本原因 14
1.5 Web應用安全 15
1.5.1 瀏覽器、HTML和JavaScript 16
1.5.2 W3C 17
第2章 密碼學 19
2.1 對于密碼學的認知 19
2.1.1 基本認知 19
2.1.2 密碼學的四個目標 21
2.1.3 OpenSSL 22
2.2 隨機數 25
2.2.1 隨機數的類型 25
2.2.2 隨機數的工作原理 26
2.2.3 常見的隨機數生成器 26
2.2.4 密碼學算法中的隨機數 27
2.3 Hash算法 27
2.3.1 加密基元 28
2.3.2 Hash算法和密碼學Hash算法 28
2.3.3 密碼學Hash算法的特性 29
2.3.4 Hash算法的用途 29
2.3.5 什么是安全的密碼學Hash算法 30
2.3.6 密碼學Hash算法的分類 31
2.4 對稱加密算法 33
2.4.1 流密碼算法 34
2.4.2 塊密碼算法 36
2.4.3 填充標準 41
2.4.4 對稱加密算法實踐 42
2.5 消息驗證碼 47
2.5.1 什么是消息驗證碼 47
2.5.2 MAC算法的種類 49
2.5.3 消息驗證碼算法實踐 49
2.5.4 加密算法不能提供完整性 50
2.5.5 AD加密模式 52
2.5.6 AEAD加密模式 53
2.6 公開密鑰算法 54
2.6.1 理解RSA的內部結構 55
2.6.2 PKCS標準 56
2.6.3 RSA加密算法的應用場景 58
2.6.4 RSA加密算法實踐 59
2.7 密鑰 62
2.7.1 生成密鑰 63
2.7.2 口令和PEB算法 63
2.7.3 密鑰存儲和傳輸 66
2.8 密鑰協商算法 67
2.8.1 RSA密鑰協商算法 68
2.8.2 DH密鑰協商算法 69
2.8.3 DH算法分類 71
2.8.4 DH密鑰協商算法實踐 71
2.9 橢圓曲線密碼學 73
2.9.1 ECC算法的基本模型 74
2.9.2 使用OpenSSL了解命名曲線 75
2.9.3 ECDH協商算法 76
2.9.4 命名曲線 77
2.10 數字簽名 79
2.10.1 數字簽名的用途 79
2.10.2 數字簽名的流程 80
2.10.3 RSA數字簽名算法 81
2.10.4 RSA數字簽名實踐 81
2.11 DSA數字簽名算法 83
2.11.1 內部結構 84
2.11.2 DSA算法實踐 85
2.11.3 ECDSA算法 87
2.11.4 ECDSA算法實踐 88
2.12 算法安全性和性能 90
2.12.1 密鑰長度與算法安全性 90
2.12.2 密碼學性能 91
第3章 宏觀理解TLS 101
3.1 TLS/SSL協議綜述 101
3.1.1 TLS/SSL協議的歷史 101
3.1.2 正確認知TLS/SSL協議 102
3.1.3 TLS/SSL協議的目標 103
3.1.4 OpenSSL和TLS/SSL的關系 104
3.1.5 HTTPS和TLS/SSL的關系 105
3.1.6 TLS/SSL協議的一些實現 106
3.2 TLS/SSL協議背后的算法 107
3.2.1 加密算法和MAC算法 107
3.2.2 密鑰協商算法 108
3.2.3 前向安全性 110
3.2.4 密鑰衍生算法 111
3.2.5 中間人攻擊 112
3.2.6 PKI 114
3.3 HTTPS總結 117
3.3.1 握手 119
3.3.2 加密 125
3.4 實施HTTPS網站的必備條件 125
3.4.1 證書和密鑰對 126
3.4.2 部署和配置HTTPS網站 126
3.4.3 全站HTTPS策略 127
3.5 從用戶的角度看HTTPS 128
3.5.1 綠色小鎖圖標 128
3.5.2 TLS/SSL握手失敗 129
3.5.3 混合內容 131
第4章 選擇HTTPS的必要性和疑惑 134
4.1 部署HTTPS的疑惑 134
4.1.1 網站好像沒有隱私數據 134
4.1.2 復雜性 135
4.1.3 成本 137
4.1.4 性能 137
4.1.5 外部資源不支持HTTPS 138
4.1.6 收益和時間對比 139
4.2 部署HTTPS的必要性 140
4.2.1 HTTP/2帶來的性能提升 140
4.2.2 趨勢 140
4.2.3 企業形象 142
4.2.4 HTML5的特性 142
4.2.5 iOS ATS的安全要求 143
4.2.6 Chrome和Firefox所做的努力 143
4.2.7 SEO排名和谷歌Analytics 144
第5章 快速搭建一個HTTPS網站 145
5.1 HTTPS網站構建分析 145
5.2 獲取證書和密鑰對 146
5.2.1 自簽名證書 147
5.2.2 向CA機構申請證書 148
5.2.3 使用Let’s Encrypt證書 149
5.3 部署證書和密鑰對 150
5.3.1 Nginx配置 150
5.3.2 Apache配置 151
5.4 測試HTTPS 152
5.5 301重定向 154
5.6 HSTS 155
5.6.1 什么是HSTS 155
5.6.2 HSTS實踐 158
5.6.3 瀏覽器支持 158
5.6.4 HSTS Preloading 159
5.7 CSP 159
5.7.1 如何消除混合內容 159
5.7.2 什么是CSP 160
5.7.3 瀏覽器的兼容性 161
5.7.4 CSP實踐 161
第6章 證書 165
6.1 X.509標準和PKI 165
6.1.1 X.509標準 166
6.1.2 PKI的組成 166
6.1.3 X.509標準的內容 167
6.2 證書 167
6.2.1 ASN.1 167
6.2.2 證書結構 168
6.2.3 CSR 172
6.2.4 證書擴展 174
6.2.5 證書分類 177
6.3 證書鏈 180
6.3.1 證書類型 180
6.3.2 信任原理 182
6.3.3 信任鏈校驗 183
6.3.4 信任錨 184
6.3.5 委派和交叉認證 186
6.3.6 證書完整校驗 189
6.4 CRL 190
6.4.1 證書過期和吊銷 190
6.4.2 證書被吊銷的原因 191
6.4.3 CRL是什么 191
6.4.4 CRL校驗 192
6.4.5 CRL的結構 193
6.4.6 CRL存在的問題 195
6.5 OCSP 196
6.5.1 OCSP是什么 196
6.5.2 OCSP模型概述 197
6.5.3 OCSP詳解 200
6.6 OCSP封套 204
6.6.1 OCSP的優缺點 204
6.6.2 OCSP封套的工作原理 205
6.6.3 OCSP封套的優點 206
6.6.4 OCSP封套的兼容性 207
6.7 OpenSSL命令行管理證書 207
6.7.1 證書格式 207
6.7.2 證書的其他格式 208
6.7.3 獲取線上證書 209
6.7.4 導入證書到根證書庫 213
6.7.5 OpenSSL管理CSR 216
6.7.6 OpenSSL生成證書 218
6.7.7 OpenSSL查看證書 218
6.7.8 校驗CRL 224
6.7.9 校驗OCSP 227
6.7.10 校驗OCSP封套 232
6.8 其他 233
6.8.1 如何選擇一個CA機構 233
6.8.2 證書的透明度 236
第7章 Let’s Encrypt免費證書 244
7.1 Let’s Encrypt 244
7.1.1 Let’s Encrypt CA機構的特點 244
7.1.2 Let’s Encrypt證書的特點 245
7.2 Let’s Encrypt工作原理 248
7.2.1 域名校驗過程 248
7.2.2 請求、更新、續期、撤銷證書流程 249
7.3 Certbot客戶端 249
7.3.1 安裝Certbot客戶端 250
7.3.2 用戶注冊 250
7.3.3 獲取和安裝證書 251
7.3.4 Certbot Nginx插件 252
7.3.5 Certbot Apache插件 255
7.3.6 Certbot Webroot插件 257
7.3.7 Certbot Standalone插件 259
7.3.8 Certbot Manual插件 259
7.3.9 Certbot管理證書 260
7.3.10 Certbot查看證書 261
7.3.11 Certbot撤銷證書 262
7.3.12 Certbot Revoking證書 262
7.3.13 Certbot高級操作 263
7.4 Let’s Encrypt的其他信息 264
第8章 TLS協議分析 267
8.1 如何理解RFC文檔 267
8.2 描述語言 270
8.3 TLS/SSL協議概述 273
8.4 TLS記錄層協議 278
8.4.1 連接狀態 278
8.4.2 TLS記錄層協議的處理步驟 281
8.5 TLS/SSL握手協議 288
8.5.1 Client Hello子消息 291
8.5.2 Server Hello子消息 292
8.5.3 Server Certificate子消息 293
8.5.4 Server Key Exchange子消息 295
8.5.5 Server Hello Done子消息 299
8.5.6 Client Key Exchange子消息 299
8.5.7 計算主密鑰和密鑰塊 301
8.5.8 Change Cipher Spec協議 304
8.5.9 Finished子消息 304
8.6 擴展 306
8.6.1 ECC橢圓曲線擴展 308
8.6.2 signed_certificate_timestamp 309
8.6.3 Status Request擴展 310
8.6.4 renegotiation_info重協商擴展 312
8.6.5 ALPN擴展 312
8.6.6 Maximum Fragment Length擴展 313
8.6.7 SNI擴展 313
8.6.8 Signature Algorithms擴展 314
8.7 基于Session ID的會話恢復 316
8.7.1 什么是會話 316
8.7.2 Session ID的工作原理 317
8.7.3 Session ID的優缺點 319
8.8 SessionTicket 319
8.8.1 SessionTicket的應用場景 320
8.8.2 SessionTicket的交互流程 320
8.8.3 SessionTicket TLS擴展 322
8.8.4 NewSessionTicket握手子消息 323
8.8.5 兩種會話恢復方式如何共存 325
8.9 使用Wireshark學習TLS/SSL協議 325
8.9.1 Wireshark的幾個使用技巧 326
8.9.2 使用Wireshark分析TLS/SSL協議 329
第9章 HTTPS性能和安全 347
9.1 密碼套件 347
9.1.1 密碼套件編號 349
9.1.2 關鍵字和關鍵字修飾符 349
9.1.3 密碼套件一覽 360
9.2 安全性 364
9.2.1 已知的安全漏洞 366
9.2.2 常規建議 371
9.2.3 密碼套件 373
9.2.4 前向安全性 377
9.2.5 證書 378
9.2.6 從客戶端審視安全性 381
9.2.7 應用層安全建議 383
9.3 性能 385
9.3.1 網絡層優化 386
9.3.2 應用層優化 389
9.3.3 HTTP/2優化 391
9.3.4 TLS/SSL優化 399
9.3.5 TLS/SSL優化方案 402
第10章 HTTPS網站實戰 414
10.1 工具化配置HTTPS 414
10.1.1 SSL Configuration Generator 415
10.1.2 Cloudflare推薦的配置 421
10.2 自動化測試HTTPS網站 426
10.2.1 SSL Server Test 426
10.2.2 SSL Client Test 433
10.2.3 SSL Pulse 436
10.3 OpenSSL命令行工具 439
10.3.1 s_client工具 440
10.3.2 s_server工具 447
10.3.3 其他工具 451
10.4 實戰HTTPS網站部署 454
10.4.1 使用Nginx+OpenSSL部署HTTPS網站 455
10.4.2 使用Nginx+BoringSSL部署HTTPS網站 470
10.5 大型網站部署HTTPS 471
10.5.1 系統架構 472
10.5.2 HTTPS網站的部署方式 476
10.5.3 其他部署問題 484