SSL/TLS协议

基本概念

SSL (secure sockets layer) 和 TLS (transport layer security) 都是传输层的安全协议(在协议栈中处于TCP协议和应用层协议中间), 对网络连接和数据传输进行加密.

  • 1994年, NetScape 公司设计了 SSL 1.0 版, 但是未发布.
  • 1995年, NetScape 公司发布 SSL 2.0 版, 很快发现有严重漏洞.
  • 1996年, SSL 3.0 版问世, 得到大规模应用.
  • 1999年, 互联网标准化组织 ISOC 接替 NetScape 公司, 发布了 SSL 的升级版 TLS 1.0.
  • 2006年和2008年, TLS 进行了两次升级, 分别为 TLS 1.1 和 TLS 1.2

TLS 1.0 通常被标示为 SSL 3.1, TLS 1.1 为 SSL 3.2, TLS 1.2 为 SSL 3.3.

SSL/TLS的目标

根据 rfc 5246 中的描述, TLS 的目标包括了:

  • Cryptographic security: 加密安全, 能为通信双方建立安全通道.
  • Interoperability: 互操作性, 指不需要对方的code, 就可以交换加密参数, 建立 TLS 安全通道.
  • Extensibility: 可扩展性, TLS 更像是一个加密层的框架, 仅提供了协议规范, 公钥和加密算法都是可扩展的.
  • Relative efficiency: 相对高效.

基本流程

  • 客户端向服务器端索要并验证公钥;
  • 双方协商生成"对话密钥";
  • 双方采用"对话密钥"进行加密通信;

前两步即 SSL 的握手过程, 最后的通信阶段用握手阶段生成的密钥做对称加密, 提高加解密效率. HTTPS 相比于 HTTP, 多了 SSL 的握手, 建立安全连接的速度会慢. 具体能慢多少, 可以使用 cURL 工具 -w 选项做测试.

RSA 握手过程

第一步 Client Hello:

  • 支持的 SSL 版本, 比如 TLS 1.0 版;
  • 随机数 client-random;
  • 支持的加密算法, 比如 RSA 加密, D-H 密钥交换;
  • 支持的压缩方法;

第二步 Sever Hello:

  • 确认使用的加密通信协议版本, 比如 TLS 1.0 版本;
  • 随机数 server-random;
  • 确认使用的加密方法, 这里的例子就是 RSA 算法;
  • 下发包含公钥的安全证书;

第三步 Client 验证证书之后回复 Certificate:

  • 随机数 premaster-key (公钥加密过的, 防止窃听);
  • 确认从此之后 Client 上行消息都加密;
  • 加密的密钥根据 client-random, server-random 和 premaster-key 计算得到;
  • Client 侧握手完成通知, 仅校验;

第四步 Server 以同样的方法计算得到密钥之后, 回复 Certificate:

  • 确认从此之后 Server 下行消息都加密;
  • Server 侧握手完成通知, 仅校验;

需要注意的是, 上述四步握手过程, 除了公钥加密的 premaster-key 之外, 都是明文传输. 理论上只要破解了 premaster-key, 就可以获得通信密钥. 所以为了足够的安全性, 可以将 RSA 算法替换为安全性更高的 DH 密钥交换算法.

  • 第一, 二步相同.
  • 第三步 Server 根据 client-random, server-random 以及公钥证书生成私钥, 并下发私钥签名, 以及 Server 生成的 DH 参数.
  • 第四步 Client 根据 公钥证书来验证 Server 私钥签名是否合法可信任, 如果可以信任, 则上报 Client 生成的 DH 参数.
  • Client 和 Server 双方通过两个 DH 参数计算得到 premaster-key, 再结合 client-random 以及 server-random, 生成一致的通信密钥.

数字证书

数字证书, 包含了公开密钥及其拥有者信息的文件, 由权威机构(Certificate Authority, CA)发行. 最简单的证书包含一个公开密钥, 名称以及证书授权中心的数字签名, 此外, 数字证书只在特定的时间段内有效. IE浏览器在验证数字证书的时候需要考察这几条, 只要一条不满足就给出警告:

  1. 证书的颁发者是否在"根受信任的证书颁发机构列表"中.
  2. 证书是否在有效期内.
  3. 证书持有者与网站是否一致.

CA 收费一般比较贵, 适合个人使用的有 Godaddy SSL (5.99\$每年) 和 StartSSL (注册之后可以申请一年的免费证书).

如果只是内网使用, 还可以使用 OpenSSL 建立 CA 并生成数字证书, 只是这样的证书因为不是大众认可的 CA 发行的, 如上文所说, 使用 HTTPS 服务时浏览器会给出安全告警.

参考文章

  1. 《SSL/TLS协议运行机制的概述》
  2. 《SSL延迟有多大?》
  3. 《图解SSL/TLS协议》
  4. 《rfc 5246》
  5. 《Public-key cryptography》
  6. 《基于 OpenSSL 的 CA 建立及证书签发》