SSL(Security Socbo Lart加密套接字协议层是世界上部署最为广泛的安全协议,每种商业流览器和服务器都在其内部使用SSL来支持安全的Web交易,TLS(Transport Layer Security)是SSL的后继。\r\n\r\n 本书的前半部分主要讲述SSL和TLS工作的技术细节,分别讨论了它们的安全与性能属性。后半部分讲述了如何使用SSL/TLS来安全地应用协议和系统实现。首先讲述使用SSL/TLS的一般性指导,然后又介绍几种已经使用SSL/TLS来保障安全的协议。\r\n\r\n 本书适用于那些对TCP/IP协议有一定了解,且对网络传输安全感兴趣的读者阅读。\r\n\r\n\r\n
\r\n
第1章 与安全有关的概念 \r\n\r\n 1. 1 介绍 \r\n\r\n 1. 2 因特网威胁模型 \r\n\r\n 1. 3 角色 \r\n\r\n 1. 4 安全目标 \r\n\r\n 1. 5 必要的装备 \r\n\r\n 1. 6 组合起来使用 \r\n\r\n 1. 7 简单的安全消息系统 \r\n\r\n 1. 8 简单的安全通道 \r\n\r\n 1. 9 出口形式 \r\n\r\n l. 10 实际的加密算法 \r\n\r\n 1. 11 对称加密:序列密码 \r\n\r\n 1. 12 对称加密:分组密码 \r\n\r\n 1. 13 摘要算法 \r\n\r\n 1. 14 密钥的确立 \r\n\r\n 1. 15 数字签名 \r\n\r\n 1. 16 MAC \r\n\r\n 1. 17 密钥长度 \r\n\r\n 1. 18 总结 \r\n\r\n 第2章 SSL介绍 \r\n\r\n 2. l 简介 \r\n\r\n 2. 2 标准与标准化组织 \r\n\r\n 2. 3 SSL概述 \r\n\r\n 2. 4 SSL/TLS的设计目标 \r\n\r\n 2. 5 SSL与TCP/IP族 \r\n\r\n 2. 6 SSL的历史 \r\n\r\n 2. 7 用于Web的SSL \r\n\r\n 2. 8 在SSL上构建一切 \r\n\r\n 2. 9 获得SSL \r\n\r\n 2. 10 总结 \r\n\r\n 第3章 SSL基础 \r\n\r\n 3. 1 介绍 \r\n\r\n 3. 2 SSL概述 \r\n\r\n 3. 3 握手 \r\n\r\n 3. 4 SSL记录协议 \r\n\r\n 3. 5 各种消息协同工作 \r\n\r\n 3. 6 一次真实的连接 \r\n\r\n 3. 7 其他的连接细节 \r\n\r\n 3. 8 SSL规范语言 \r\n\r\n 3. 9 握手消息结构 \r\n\r\n 3. 10 握手消息 \r\n\r\n 3. 11 密钥导出 \r\n\r\n 3. 12 记录协议 \r\n\r\n 3. 13 警示与关闭 \r\n\r\n 3. 14 总结 \r\n\r\n 第4章 高级SSL \r\n\r\n 4. l 介绍 \r\n\r\n 4. 2 会话恢复 \r\n\r\n 4. 3 客户端认证 \r\n\r\n 4. 4 临时RSA \r\n\r\n 4. 5 再握手 \r\n\r\n 4. 6 服务器网关加密 \r\n\r\n 4. 7 DSS与DH \r\n\r\n 4. 8 椭圆曲线加密套件 \r\n\r\n 4. 9 Kerberos \r\n\r\n 4. 10 FORTEZA \r\n\r\n 4. 11 小结 \r\n\r\n 4. 12 会话恢复细节 \r\n\r\n 4. 13 客户端认证细节 \r\n\r\n 4. 14 临时RSA的细节 \r\n\r\n 4. 15 SGC的细节 \r\n\r\n 4. 16 DH/DSS的细节 \r\n\r\n 4. 17 FORTEZZA的细节 \r\n\r\n 4. 18 错误警示(Error Alert) \r\n\r\n 4. 19 SSLv2的向后兼容性 \r\n\r\n 4. 20 总结 \r\n\r\n 第5章 SSL的安全 \r\n\r\n 5. l 介绍 \r\n\r\n 5. 2 SSL都提供了什么 \r\n\r\n 5. 3 保护master_secret \r\n\r\n 5. 4 保护服务器的私用密钥 \r\n\r\n 5. 5 使用良好的随机性 \r\n\r\n 5. 6 检查证书链 \r\n\r\n 5. 7 算法的选择 \r\n\r\n 5. 8 小结 \r\n\r\n 5. 9 攻破master_secret \r\n\r\n 5. 10 在内存中保护秘密 \r\n\r\n 5. 11 保证服务器私用密钥的安全 \r\n\r\n 5. 12 随机数生成 \r\n\r\n 5. 13 证书链的验证 \r\n\r\n 5. 14 部分攻破 \r\n\r\n 5. 15 已知的攻击 \r\n\r\n 5. 16 计时密码分析 \r\n\r\n 5. 17 百万消息攻击 \r\n\r\n 5. 18 小-子组攻击(SmallsubgroopAttack) \r\n\r\n 5. 19 降级使用出口模式 \r\n\r\n 5. 20 总结 \r\n\r\n 第6章 SSL的性能 \r\n\r\n 6. l 介绍 \r\n\r\n 6. 2 SSL速度慢 \r\n\r\n 6. 3 性能法则 \r\n\r\n 6. 4 加密的开销昂贵 \r\n\r\n 6. 5 会话恢复 \r\n\r\n 6. 6 握手算法与密钥选择 \r\n\r\n 6. 7 批量数据传输 \r\n\r\n 6. 8 基本的SSL性能法则 \r\n\r\n 6. 9 小结 \r\n\r\n 6. 10 握手的时间分配 \r\n\r\n 6. 11 普通RSA模式 \r\n\r\n 6. 12 带有客户端认证的RSA \r\n\r\n 6. 13 临时RSA \r\n\r\n 6. 14 DSS/DHE \r\n\r\n 6. 15 具有客户端认证的DSS/DHE \r\n\r\n 6. 16 DH性能的改进 \r\n\r\n 6. 17 记录处理 \r\n\r\n 6. 18 Java \r\n\r\n 6. 19 重负下的SSL服务器 \r\n\r\n 6. 20 硬件加速 \r\n\r\n 6. 21 串联硬件加速器 \r\n\r\n 6. 22 网络延迟 \r\n\r\n 6. 23 Nagle算法 \r\n\r\n 6. 24 握手缓冲 \r\n\r\n 6. 25 高级SSL性能法则 \r\n\r\n 6. 26 总结 \r\n\r\n 第7章 使用SSL进行设计 \r\n\r\n 7. l 介绍 \r\n\r\n 7. 2 了解要保证什么的安全 \r\n\r\n 7. 3 客户端认证选项 \r\n\r\n 7. 4 引用完整性 \r\n\r\n 7. 5 不适合的任务 \r\n\r\n 7. 6 协议的选择 \r\n\r\n 7. 7 减少握手的开销 \r\n\r\n 7. 8 设计策略 \r\n\r\n 7. 9 小结 \r\n\r\n 7. 10 独立端口 \r\n\r\n 7. 11 磋商升级 \r\n\r\n 7. 12 降级攻击 \r\n\r\n 7. 13 引用完整性 \r\n\r\n 7. 14 用户名/口令认证 \r\n\r\n 7. 15 SSL客户端认证 \r\n\r\n 7. 16 相互用户名/口令认证 \r\n\r\n 7. 17 再握手 \r\n\r\n 7. 18 二级通道 \r\n\r\n 7. 19 关闭 \r\n\r\n 7. 20 总结 \r\n\r\n 第8章 SSL编程 \r\n\r\n 8. 1 介绍 \r\n\r\n 8. 2 SSL的实现 \r\n\r\n 8. 3 范例程序 \r\n\r\n 8. 4 上下文环境的初始化 \r\n\r\n 8. 5 客户端连接 \r\n\r\n 8. 6 服务器接受请求 \r\n\r\n 8. 7 简单的I/O处理 \r\n\r\n 8. 8 使用线程实现多路I/O \r\n\r\n 8. 9 使用select()实现多路I/O \r\n\r\n 8. 10 关闭 \r\n\r\n 8. 11 会话恢复 \r\n\r\n 8. 12 缺少什么? \r\n\r\n 8. 13 总结 \r\n\r\n 第9章 SSL上的HTTP \r\n\r\n 9. l 介绍 \r\n\r\n 9. 2 保护Web的安全 \r\n\r\n 9. 3 HTTP \r\n\r\n 9. 4 HTML \r\n\r\n 9. 5 URL \r\n\r\n 9. 6 HTTP的连接行为 \r\n\r\n 9. 7 代理 \r\n\r\n 9. 8 虚拟主机 \r\n\r\n 9. 9 协议选择 \r\n\r\n 9. 10 客户端认证 \r\n\r\n 9. 11 引用完整性 \r\n\r\n 9. 12 HTTPS \r\n\r\n 9. 13 HTTPS概述 \r\n\r\n 9. 14 URL与引用完整性 \r\n\r\n 9. 15 连接关闭 \r\n\r\n 9. 16 代理 \r\n\r\n 9. 17 虚拟主机 \r\n\r\n 9. 18 客户端认证 \r\n\r\n 9. 19 Referrer \r\n\r\n 9. 20 替换攻击 \r\n\r\n 9. 21 升级 \r\n\r\n 9. 22 编程问题 \r\n\r\n 9. 23 代理CONNECT \r\n\r\n 9. 24 处理多个客户端 \r\n\r\n 9. 25 总结 \r\n\r\n 第10章 TLS上的SMTP \r\n\r\n 10. l 介绍 \r\n\r\n 10. 2 因特网邮件的安全 \r\n\r\n 10. 3 因特阿消息传递概述 \r\n\r\n 10. 4 SMTP \r\n\r\n 10. 5 RFC822和 MIME \r\n\r\n 10. 6 E-mail地址 \r\n\r\n 10. 7 邮件中继 \r\n\r\n 10. 8 虚拟主机 \r\n\r\n 10. 9 MX记录 \r\n\r\n 10. 10 客户端邮件存取 \r\n\r\n 10. 11 协议的选择 \r\n\r\n 10. 12 客户端认证 \r\n\r\n 10. 13 引用完整性 \r\n\r\n 10. 14 连接语义 \r\n\r\n 10. 15 STARTTLS \r\n\r\n 10. 16 STARTTLS M概述 \r\n\r\n 10. 17 连接关闭 \r\n\r\n 10. 18 要求使用TLS \r\n\r\n 10. 19 虚拟主机 \r\n\r\n 10. 20 安全指示器 \r\n\r\n 10. 21 经过认证的中继 \r\n\r\n 10. 22 源发者认证 \r\n\r\n 10. 23 引用完整性的细节 \r\n\r\n 10. 24 为什么不使用CONNECT \r\n\r\n 10. 25 STARTTLS有什么好处 \r\n\r\n 10. 26 编程问题 \r\n\r\n 10. 27 实现STARTTLS \r\n\r\n 10. 28 服务器的启动 \r\n\r\n 10. 29 总结 \r\n\r\n 第11章 各种方案的对比 \r\n\r\n 11. l 介绍 \r\n\r\n 11. 2 端到端的论述 \r\n\r\n 11. 3 端到端的论述与 SMTP \r\n\r\n 11. 4 其他协议 \r\n\r\n 11. 5 IPsec \r\n\r\n 11. 6 安全关联 \r\n\r\n 11. 7 ISAKMP和 IKE \r\n\r\n 11. 8 AH和ESP \r\n\r\n 11. 9 协同工作:IPsec \r\n\r\n 11. 10 IPsec与SSL的对比 \r\n\r\n 11. 11 安全HTTP \r\n\r\n 11. 12 CMS \r\n\r\n 11. 13 消息格式 \r\n\r\n 11. 14 加密选项 \r\n\r\n 11. 15 协调工作:S-HTTP \r\n\r\n 11. 16 S-HTTP与 HTTPS的对比 \r\n\r\n 11. 17 SMIME \r\n\r\n 11. 18 S/MIME的基本格式 \r\n\r\n 11. 19 只进行签名 \r\n\r\n 11. 20 算法的选择 \r\n\r\n 11. 21 协调工作:SMIME \r\n\r\n 11. 22 实现障碍 \r\n\r\n 11. 23 S/MIME与SMTP/TLS的对比 \r\n\r\n 11. 24 选择合适的解决方案 \r\n\r\n 11. 25 总结 \r\n\r\n 附录A 范例代码 \r\n\r\n A. l 第8章 \r\n\r\n A. 2 第9章 \r\n\r\n 附录B SSLv2 \r\n\r\n B. l 介绍 \r\n\r\n B. 2 SSLv2概述 \r\n\r\n B. 3 缺少的功能 \r\n\r\n B. 4 安全问题 \r\n\r\n B. 5 PCT \r\n\r\n B. 6 有关SSLv1的情况 \r\n\r\n 参考文献 \r\n\r\n \r\n\r\n \r\n
\r\n
安全套接层协议SSL(Secure Socket Layer)是世界上部署最为广泛的安全协议. 每一种商业浏览器和服务器都在其内部使用SSL来支持安全的Web交易. 当你使用"安全的" Web页面进行联机采购(2000年此类交易的价值大概有200亿美圆)时, 几乎可以肯定, 你是在使用SSL.
尽管SSL最常见的用途是保证Web通信的安全, 但实际上它也是一种相当通用的协议, 适用于保护种类繁多的各种通信数据的安全. 其中的一些, 如文件传输(FTP). 远程对象存取(RMI. CORBA. IIOP). E-mail传输(SMTP). 远程终端服务(Telne)以及目录存取(LDAP)业已成为使用SSL或其后继TLS(Transport Lnyer Security)来保障安全的一部分应用.
保证所有这些协议安全所耗费的精力使我们吸取了许多重要的教训. 首先, 要想很好地使用SSL/TLS保证一种协议的安全, 就要求对SSUTLS的工作原理有着相当扎实的理解. 我们不可能简单的将SSL/TLS当作黑箱对待, 指望它能够在使用时神奇地提供所需要的安全.
其次, 尽管每种应用稍有不同, 但似乎对每种想保证其安全的应用来说都有一组共同的安全问题. 例如, 我们通常要设法找出某种让一种应用协议中不安全与安全版本和平共处的方法. 尽管对这些问题来说没有一致的解决方案, 但是专门研究安全的团体还是正在着手开发一组使用SSL/TLS来解决此类问题的公共技术.
我们常常可以稍加修改就能将这些技术应用于一种新的应用协议中. 从本质上讲, 我们已开发了一套用于保证协议安全的设计模式(design pattern). 保证系统安全的很大一部分工作就是识别出与正在使用的系统最为匹配的模式, 然后再采用相应的技术.
本书的意图就是针对这两方面的需求进行讲解. 在读完这本书之后, 你应当了解即便不是所有也是绝大多数使用SSL/TLS设计安全系统所需的知识. 你将会了解足以理解SSL/TLS所能提供以及所不能提供的各种安全特性的知识. 此外, 还会熟悉使用SSL/TLS的常见设计模式, 并随时可以在新的情况下应用这些模式.
本书所提供的内容
本书适用于任何想要理解和使用SSL/TLS的读者.
对设计者来说, 本书不但提供了己经付诸使用的技术库, 还提供了使用SSL/TLS来设计系统的有关信息.
对于使用SSL/TLS编程的程序员来说, 本书提供了有关函数库底层的工作机理, 以及你所调用的函数实际完成的工作内容. 理解这些细节对于获得可接受及可预料的应用性能非常关键.
对于SSL/TLS的实现者来说, 本书可以作为标准之外的辅助资料, 起到解疑释惑的作用.
面向的读者群
本书假定你对TCP/IP协议的工作原理有着基本的了解. 那些对TCP/IP不熟的读者最好还是能够参考一本讲解TCP/IP的好书. TCP/IP Illustrated, 第一卷[Stevens 1994]是一本不错的选择. RFC791[Posted99la]. RFC792[Posted99lb], 以及11FC 793Rostell99lc]提供了有关TCP/IP的终极参考. 尽管无须深刻理解TCP/IP也能理解本书中的一些内容, 但是不理解TCP的行为就很难明白大量与性能有关的讨论.
由于SSL/TLS是一种密码协议(Cryptographic protocol), 所以要想正确地理解有关内容则需要熟悉密码学算法(Cryptographic algorithm), 其中包括公用密钥加密算法(public keyCryptography). 对称加密算法(synuntric cryptography)以及摘要(digest)算法. 第一章将介绍密码学与通信, 但由于篇幅的限制, 无法提供完整的描述. 我们试图合盖理解SSL/TLS所必需的所有加密算法细节. 不过, 有兴趣从更广的层面上理解加密算法知识的读者应当参阅一本有关密码学的教程, 如[Schneierl996a]或[Kaufinan1995].
本书的结构
本书是分成两个部分来写的, 这与我们前面所描述的两个目标:理解协议以及如何使用是一致的. 前半部分, 从第1到第6章主要讲述SSL和TLS. 我们主要关心的是SSL和TIS工作的技术细节, 并分开讨论它们的安全与性能属性.
而在本书的后半部分, 从第7章到第11章, 讲述了如何使用 SSL/TLS来保证安全地应用协议和系统实现. 首先讲述使用SSL/TLS的一般性指导, 然后讨论几种已经使用SSL/TLS来保障安全的协议.
第1章--与安全有关的概念, 提供了对密码学与通信安全的介绍, 并着眼于它在SSL/TLS中的应用. 如果你已经熟悉通信安全的相关知识, 那么就可以跳过这一章. 反之, 就应当仔细阅读本章, 以免到后边不知所云.
第2章--SSL介绍, 粗略概括了SSL/TLS的历史以及它所提供的各种安全特性. 此外, 还提供了在编写本书时使用SSL/TLS来保证安全的各种协议的现况.
第3章--SSL基础, 讲述了最常用的SSL/TLS操作模式(Operational mode). 我们从头到尾描述了整个SSL/TLS的连接过程. 本章可以让你很好地理解SSL/TLS的实际工作原理. 一旦理解了本章的内容, 你就能够轻而易举地理解其他操作模式.
第4章--高级SSL, 讲述了其余主要的操作模式. 讲解了会话恢复(session resutwon). 客户端认证(client authenhcation), 以及几种当即只在SSL/TLS中才被采用的算法, 如DH/DSS和Kerberos.
第5章--SSL的安全, 描述了SSL所提供的安全稗益, 以及所不能提供的一些个好处(这些内容甚至更为重要). 前面的章节主要将重点放在工作原理上, 而本章则将重点放在为保证使用SSL/TLS的系统安全所要完成的工作上.
第6章--SSL的性能, 描述了基于TLS系统的性能剖析. 众所周知, 安全措施对系统提出了很高的性能要求, 但是理解这种影响仅限于协议特定部分的人却不多. 我们将讨论这些问题, 并着眼于在获得更高性能的同时维持良好的安全性.
第7章--使用SSL进行设计, 是有关使用SSL/TLS来保证应用协议安全的指南. 我们将重点放在识别所需的安全属性上, 并深刻理解满足这些属性的设计技术.
第8章--进行SSL编程, 讨论了编写使用SSL/TLS的软件所需的常见编程套路(programming idiom). 我们提供了完整的采用OpenSSL和PureTLS具箱, 用C和Java语言编写了的范例程序.
第9章--SSL上的HTTP, 讲述了开创SSL的应用. SSL起先是由Nescape设计用来与HTTP一起工作的, 我们在这里讲述了完成此类工作的传统方式, 同时也讲解了当前建议的替代方式.
第10章--TLS上的SMTP, 讲述了使用TIS来保证简单邮件传输协议(SMTP)安全的内容, SMTP是用来传输E-mall的协议. SMTP与TLS并不相称, 而本章举例说明了SSL与TIS的一些限制.
第11章--各种方案的对比, 描述了其他保证应用安全的方案. SSL/TLS并不总是最好的解决方案, 了解何时不去使用它也是了解如何使用某种协议所需的. 本章试图带你领略一下其他的选择. 我们讨论了除SSL/TLS之外的其他方案:IPSEC. S-HTTP和S/MIME.
如何阅读本书
本书适合各种具有不同技术能力和需求的读者. 你可以阅读任何自己感兴趣的章节, 也可以根据自己的需要, 将重点放在特定的章节上. 协议设计人员
如果你是在设计一种新的应用层协议或是使用SSL/TLS来保证一种现有协议的安全, 就应当阅读头一部分第l-6章的内容, 以便对SSL/TLS的工作原理有个大致了解. 然后再仔细阅读第7章有关SSL/TLS设计原则的指南. 如果你不打算实现自己的设计, 就可以跳过第8章, 但是一定要阅读第9章和第10章. 从中你能看到现实世界中的一些例子, 了解在实际运用中应当怎样和不应当怎样使用SSL/TLS. 在开始设计之前, 还应该阅读第 11章的内容以确信SSL/TLS适合你的设计, 以及有没有其他更好的安全协议可供使用.
应用程序员
如果你使用现有的SSL/TLS工具箱编写应用, 就可以放心读完第一部分1至6章的内容. 你还应当阅读每章之后的总结, 这些章节概括性地讨论了SSL/TLS及其实现技术. 这些内容将会提供理解SSL/TLS完成各项工作的足够信息. 你应当仔细阅读第7章和第8章, 要特别注意第8章所讨论的编程技术. 如果你是在SSL上实现HTTP或SMTP的话, 还应当阅读与这些协议有关的章节.
SSL/TLS实现者
如果你是在从头实现SSL/TLS, 就应当阅读整本书的内容. 如果你已经熟悉密码学的话, 就可以跳过第1章. 然而, 如果对密码学没有具体的了解, 则应当通读整章的内容. 你应当特别注意第2到第6章的内容, 这些章节提供了对SSL/TLS的具体描述, 以及创建快速而安全的实现所需要的各种实现技术. 仅仅出于好奇
如果你只是想对SSL/TLS有所了解, 则可以随意挑选书中的章节阅读. 但如果事先不了解有关密码学的知识, 就应该阅读第1章的全部内容. 然后再阅读第2到第6章以了解SSL/TLS的工作原理. 接着就可以或多或少地阅读其余自己感兴趣的章节. 要想了解SSL/TLS与其他安全协议之间的比较的话, 第11章或许值得一读.
SSL/TLS的版本
至此, 你可能已经厌倦了看到SSL/TLS这个字眼. 我们一直使用它来避免谈及我们所意指的确切版本. 当前有两个版本的SSL被广泛部署:SSL版本2(SSLv2)和SSL版本3(SSLv3).
TLS是SSLv3的一种变体, 由因特网工程任务组(IETF)在1999年加以标准化. 除了从名字可以想到的内容之外, SSLv2与SSLv3是两种截然不同的协议, 而TLS与SSLv3极其相似.
SSLv2实质上已经过时, 而在编写这本书的当刻, 还没有真正地广泛部署TLS. 总而言之, 我们将使用SSL这个字眼来互换的指代SSLv3/TLS. 当意指某种协议时, 我们会具体指明. 在个别谈论SSL版本2的实例中, 我们将会使用SSLv2.
排版约定
本书包含许多真实SSL或TLS会话的网络跟踪信息. 在展示此类跟踪信息时, 我们使用等竞字体来显示程序输出(CONSTRUCTD), 使用斜体表示之后插入的注释(Connnen). 在网络跟踪信息中显示以十六进制表达协议数据的地方, 我们使用等竞粗体(of 02 03)来显示. 在以明文来显示加密数据的地方, 我们将使用等宽斜体来显示(data).
正文中, 从各项标准(如, 因特网RFC)和协议结构定义节选的内容以sans serif字体来显示(helvetica), 而图示中使用可读性好的Times字体. 代码片段以等竞字体(int)来显示. 在个别特殊情况下, 需要折行显示较长的行, 这种情况下, 我们将在折行的行尾使用符号来表示下面是该行的接续文本.
历史文献注解和旁白将会用这种较小的字体缩进来显示.
网络跟踪信息
本书中的网络跟踪信息全都源于真实的会话(session), 大部分都是在作者家里的以太网上捕获的. 使用了各种各样的客户端和服务器程序, 其中包括OpenSSL. NetscapeNavigator. Internet Explorer和qmail. 这些跟踪信息是用tcpdump程序捕获, 并存储在磁盘上的. 文中显示的跟踪信息是用作者编写的SSL解码软件包ssldump产生的. 你可以从http://www.tcpdump. org/获得tcpdump, 从http://www.rtfm.com/ssldump处获得ssldump.