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