第1章 SSL、TLS和密码学1
1.1 传输层安全1
1.2 网络层2
1.3 协议历史3
1.4 密码学4
1.4.1 构建基块4
1.4.2 协议12
1.4.3 攻击密码13
1.4.4 衡量强度13
1.4.5 中间人攻击15
第2章 协议19
2.1 记录协议19
2.2 握手协议21
2.2.1 完整的握手21
2.2.2 客户端身份验证26
2.2.3 会话恢复28
2.3 密钥交换29
2.3.1 RSA密钥交换30
2.3.2 Diffie-Hellman密钥交换31
2.3.3 椭圆曲线Diffie-Hellman密钥交换33
2.4 身份验证34
2.5 加密34
2.5.1 序列加密34
2.5.2 分组加密35
2.5.3 已验证的加密36
2.6 重新协商37
2.7 应用数据协议38
2.8 警报协议38
2.9 关闭连接39
2.10 密码操作39
2.10.1 伪随机函数39
2.10.2 主密钥40
2.10.3 密钥生成40
2.11 密码套件41
2.12 扩展42
2.12.1 应用层协议协商43
2.12.2 证书透明度44
2.12.3 椭圆曲线功能44
2.12.4 心跳45
2.12.5 次协议协商46
2.12.6 安全重新协商47
2.12.7 服务器名称指示47
2.12.8 会话票证48
2.12.9 签名算法48
2.12.10 OCSP stapling49
2.13 协议限制49
2.14 协议版本间的差异50
2.14.1 SSL 350
2.14.2 TLS 1.050
2.14.3 TLS 1.150
2.14.4 TLS 1.251
第3章 公钥基础设施52
3.1 互联网公钥基础设施52
3.2 标准54
3.3 证书55
3.3.1 证书字段55
3.3.2 证书扩展57
3.4 证书链58
3.5 信赖方60
3.6 证书颁发机构61
3.7 证书生命周期62
3.8 吊销63
3.9 弱点63
3.10 根密钥泄露65
3.11 生态系统评估66
3.12 进步68
第4章 攻击PKI71
4.1 VeriSign签发的Microsoft代码签名证书71
4.2 Thawte签发的login.live.com72
4.3 StartCom违规(2008)72
4.4 CertStar(Comodo)签发的Mozilla证书73
4.5 伪造的RapidSSL CA证书73
4.5.1 前缀选择碰撞攻击75
4.5.2 创建碰撞证书75
4.5.3 预测前缀76
4.5.4 接下来发生的事78
4.6 Comodo代理商违规78
4.7 StartCom违规(2011)80
4.8 DigiNotar80
4.8.1 公众的发现80
4.8.2 一个证书颁发机构的倒下81
4.8.3 中间人攻击82
4.8.4 ComodoHacker宣布负责83
4.9 DigiCert Sdn. Bhd.85
4.10 火焰病毒85
4.10.1 火焰病毒对抗Windows更新86
4.10.2 火焰病毒对抗Windows终端服务87
4.10.3 火焰病毒对抗MD588
4.11 TURKTRUST89
4.12 ANSSI90
4.13 印度国家信息中心91
4.14 广泛存在的SSL窃听91
4.14.1 Gogo91
4.14.2 Superfish和它的朋友们92
4.15 CNNIC93
第5章 HTTP和浏览器问题95
5.1 sidejacking95
5.2 Cookie窃取97
5.3 Cookie篡改98
5.3.1 了解HTTP Cookie98
5.3.2 Cookie篡改攻击99
5.3.3 影响102
5.3.4 缓解方法103
5.4 SSL剥离103
5.5 中间人攻击证书104
5.6 证书警告105
5.6.1 为什么有这么多无效证书107
5.6.2 证书警告的效果108
5.6.3 点击—通过式警告与例外109
5.6.4 缓解方法110
5.7 安全指示标志110
5.8 混合内容112
5.8.1 根本原因112
5.8.2 影响114
5.8.3 浏览器处理114
5.8.4 混合内容的流行程度116
5.8.5 缓解方法117
5.9 扩展验证证书118
5.10 证书吊销119
5.10.1 客户端支持不足119
5.10.2 吊销检查标准的主要问题119
5.10.3 证书吊销列表120
5.10.4 在线证书状态协议122
第6章 实现问题127
6.1 证书校验缺陷127
6.1.1 在库和平台中的证书校验缺陷128
6.1.2 应用程序校验缺陷131
6.1.3 主机名校验问题132
6.2 随机数生成133
6.2.1 Netscape Navigator浏览器(1994)133
6.2.2 Debian(2006)134
6.2.3 嵌入式设备熵不足问题135
6.3 心脏出血137
6.3.1 影响137
6.3.2 缓解方法139
6.4 FREAK139
6.4.1 出口密码140
6.4.2 攻击140
6.4.3 影响和缓解方法143
6.5 Logjam144
6.5.1 针对不安全DHE密钥交换的主动攻击144
6.5.2 针对不安全DHE密钥交换的预先计算攻击145
6.5.3 针对弱DH密钥交换的状态—水平威胁146
6.5.4 影响147
6.5.5 缓解方法148
6.6 协议降级攻击148
6.6.1 SSL 3中的回退保护149
6.6.2 互操作性问题149
6.6.3 自愿协议降级152
6.6.4 TLS 1.0和之后协议的回退保护153
6.6.5 攻击自愿协议降级154
6.6.6 现代回退防御154
6.7 截断攻击156
6.7.1 截断攻击的历史157
6.7.2 Cookie截断157
6.8 部署上的弱点159
6.8.1 虚拟主机混淆159
6.8.2 TLS会话缓存共享160
第7章 协议攻击161
7.1 不安全重新协商161
7.1.1 为什么重新协商是不安全的162
7.1.2 触发弱点162
7.1.3 针对HTTP协议的攻击163
7.1.4 针对其他协议的攻击166
7.1.5 由架构引入的不安全重新协商问题167
7.1.6 影响167
7.1.7 缓解方法167
7.1.8 漏洞发现和补救时间表168
7.2 BEAST169
7.2.1 BEAST的原理170
7.2.2 客户端缓解方法173
7.2.3 服务器端缓解方法175
7.2.4 历史176
7.2.5 影响177
7.3 压缩旁路攻击178
7.3.1 压缩预示如何生效178
7.3.2 攻击的历史180
7.3.3 CRIME181
7.3.4 针对TLS和SPDY攻击的缓解方法187
7.3.5 针对HTTP压缩攻击的缓解方法188
7.4 Lucky 13189
7.4.1 什么是填充预示189
7.4.2 针对TLS的攻击190
7.4.3 影响191
7.4.4 缓解方法191
7.5 RC4缺陷192
7.5.1 密钥调度弱点192
7.5.2 单字节偏差193
7.5.3 前256字节偏差194
7.5.4 双字节偏差196
7.5.5 针对密码进行攻击的改进196
7.5.6 缓解方法:RC4与BEAST、Lucky 13和POODLE的比较197
7.6 三次握手攻击198
7.6.1 攻击198
7.6.2 影响202
7.6.3 先决条件203
7.6.4 缓解方法203
7.7 POODLE204
7.7.1 实际攻击207
7.7.2 影响208
7.7.3 缓解方法208
7.8 Bullrun209
第8章 部署212
8.1 密钥212
8.1.1 密钥算法212
8.1.2 密钥长度213
8.1.3 密钥管理213
8.2 证书215
8.2.1 证书类型215
8.2.2 证书主机名215
8.2.3 证书共享216
8.2.4 签名算法216
8.2.5 证书链217
8.2.6 证书吊销218
8.2.7 选择合适的CA218
8.3 协议配置219
8.4 密码套件配置220
8.4.1 服务器密码套件配置优先220
8.4.2 加密强度220
8.4.3 前向保密221
8.4.4 性能222
8.4.5 互操作性222
8.5 服务器配置和架构223
8.5.1 共享环境223
8.5.2 虚拟安全托管223
8.5.3 会话缓存223
8.5.4 复杂体系结构224
8.6 问题缓解方法225
8.6.1 重新协商225
8.6.2 BEAST(HTTP)225
8.6.3 CRIME(HTTP)225
8.6.4 Lucky 13226
8.6.5 RC4226
8.6.6 TIME和BREACH(HTTP)227
8.6.7 三次握手攻击227
8.6.8 心脏出血228
8.7 钉扎228
8.8 HTTP228
8.8.1 充分利用加密228
8.8.2 Cookie安全229
8.8.3 后端证书和域名验证229
8.8.4 HTTP严格传输安全229
8.8.5 内容安全策略230
8.8.6 协议降级保护230
第9章 性能优化231
9.1 延迟和连接管理232
9.1.1 TCP 优化232
9.1.2 长连接234
9.1.3 SPDY、HTTP 2.0以及其他235
9.1.4 内容分发网络235
9.2 TLS协议优化237
9.2.1 密钥交换237
9.2.2 证书240
9.2.3 吊销检查242
9.2.4 会话恢复243
9.2.5 传输开销243
9.2.6 对称加密244
9.2.7 TLS记录缓存延迟246
9.2.8 互操作性247
9.2.9 硬件加速247
9.3 拒绝服务攻击248
9.3.1 密钥交换和加密CPU开销249
9.3.2 客户端发起的重新协商250
9.3.3 优化过的TLS拒绝服务攻击250
第10章 HTTP严格传输安全、内容安全策略和钉扎251
10.1 HTTP严格传输安全251
10.1.1 配置HSTS252
10.1.2 确保主机名覆盖253
10.1.3 Cookie安全253
10.1.4 攻击向量254
10.1.5 浏览器支持255
10.1.6 强大的部署清单256
10.1.7 隐私问题257
10.2 内容安全策略257
10.2.1 防止混合内容问题258
10.2.2 策略测试259
10.2.3 报告259
10.2.4 浏览器支持259
10.3 钉扎260
10.3.1 钉扎的对象261
10.3.2 在哪里钉扎262
10.3.3 应该使用钉扎吗263
10.3.4 在本机应用程序中使用钉扎263
10.3.5 Chrome公钥钉扎264
10.3.6 Microsoft Enhanced Mitiga-tion Experience Toolkit265
10.3.7 HTTP公钥钉扎扩展265
10.3.8 DANE267
10.3.9 证书密钥可信保证270
10.3.10 证书颁发机构授权271
第11章 OpenSSL272
11.1 入门272
11.1.1 确定OpenSSL版本和配置273
11.1.2 构建OpenSSL274
11.1.3 查看可用命令275
11.1.4 创建可信证书库276
11.2 密钥和证书管理277
11.2.1 生成密钥277
11.2.2 创建证书签名申请280
11.2.3 用当前证书生成CSR文件282
11.2.4 非交互方式生成CSR282
11.2.5 自签名证书283
11.2.6 创建对多个主机名有效的证书283
11.2.7 检查证书284
11.2.8 密钥和证书格式转换286
11.3 配置288
11.3.1 选择密码套件288
11.3.2 性能298
11.4 创建私有证书颁发机构300
11.4.1 功能和限制301
11.4.2 创建根CA301
11.4.3 创建二级CA306
第12章 使用OpenSSL进行测试309
12.1 连接SSL服务309
12.2 测试升级到SSL的协议312
12.3 使用不同的握手格式313
12.4 提取远程证书313
12.5 测试支持的协议314
12.6 测试支持的密码套件314
12.7 测试要求包含SNI的服务器315
12.8 测试会话复用316
12.9 检查OCSP吊销状态316
12.10 测试OCSP stapling318
12.11 检查CRL吊销状态319
12.12 测试重新协商321
12.13 测试BEAST漏洞322
12.14 测试心脏出血323
12.15 确定Diffie-Hellman参数的强度325
第13章 配置Apache327
13.1 安装静态编译OpenSSL的Apache328
13.2 启用TLS329
13.3 配置TLS协议329
13.4 配置密钥和证书330
13.5 配置多个密钥331
13.6 通配符和多站点证书332
13.7 虚拟安全托管333
13.8 为错误消息保留默认站点334
13.9 前向保密335
13.10 OCSP stapling336
13.10.1 配置OCSP stapling336
13.10.2 处理错误337
13.10.3 使用自定义OCSP响应程序338
13.11 配置临时的DH密钥交换338
13.12 TLS会话管理338
13.12.1 独立会话缓存338
13.12.2 独立会话票证339
13.12.3 分布式会话缓存340
13.12.4 分布式会话票证341
13.12.5 禁用会话票证342
13.13 客户端身份验证343
13.14 缓解协议问题344
13.14.1 不安全的重新协商344
13.14.2 BEAST344
13.14.3 CRIME344
13.15 部署HTTP严格传输安全345
13.16 监视会话缓存状态346
13.17 记录协商的TLS参数346
13.18 使用mod_sslhaf的高级日志记录347
第14章 配置Java和Tomcat349
14.1 Java加密组件349
14.1.1 无限制的强加密350
14.1.2 Provider配置350
14.1.3 功能概述351
14.1.4 协议漏洞352
14.1.5 互操作性问题352
14.1.6 属性配置调优354
14.1.7 常见错误消息355
14.1.8 保护Java Web应用358
14.1.9 常见密钥库操作362
14.2 Tomcat366
14.2.1 TLS配置369
14.2.2 JSSE配置371
14.2.3 APR和OpenSSL配置373
第15章 配置Microsoft Windows和IIS375
15.1 Schannel375
15.1.1 功能概述375
15.1.2 协议漏洞377
15.1.3 互操作性问题377
15.2 Microsoft根证书计划379
15.2.1 管理系统可信证书库379
15.2.2 导入可信证书380
15.2.3 可信证书黑名单380
15.2.4 禁用根证书自动更新380
15.3 配置380
15.3.1 Schannel配置381
15.3.2 密码套件配置382
15.3.3 密钥和签名限制384
15.3.4 重新协商配置389
15.3.5 配置会话缓存390
15.3.6 监控会话缓存391
15.3.7 FIPS 140-2391
15.3.8 第三方工具393
15.4 保护ASP.NET网站应用的安全394
15.4.1 强制使用SSL394
15.4.2 Cookie的保护395
15.4.3 保护会话Cookie和Forms身份验证的安全395
15.4.4 部署HTTP严格传输安全396
15.5 Internet信息服务396
第16章 配置Nginx402
16.1 以静态链接OpenSSL方式安装Nginx402
16.2 启用TLS403
16.3 配置TLS协议403
16.4 配置密钥和证书404
16.5 配置多密钥405
16.6 通配符证书和多站点证书405
16.7 虚拟安全托管406
16.8 默认站点返回错误消息406
16.9 前向保密407
16.10 OCSP stapling407
16.10.1 配置OCSP stapling408
16.10.2 自定义OCSP响应409
16.10.3 手动配置OCSP响应409
16.11 配置临时DH密钥交换410
16.12 配置临时ECDH密钥交换410
16.13 TLS会话管理411
16.13.1 独立会话缓存411
16.13.2 独立会话票证411
16.13.3 分布式会话缓存412
16.13.4 分布式会话票证412
16.13.5 禁用会话票证413
16.14 客户端身份验证413
16.15 缓解协议问题414
16.15.1 不安全的重新协商414
16.15.2 BEAST415
16.15.3 CRIME415
16.16 部署HTTP严格传输安全415
16.17 TLS缓冲区调优416
16.18 日志记录416
第17章 总结418
评价“HTTPS权威指南”