0%

《计算机网络》TLS 协议

介绍

TLS 协议是 SSL 协议的进化版

TLS 协议是一种介于传输层与应用层之间的协议

从下图的数据包可以看出,TLS 的握手数据位于 TCP 协议体中

密钥产生后传输数据下图所示,HTTP 协议的数据被加密后存放在 TLS 协议体中

简单来讲,TLS 协议就是用来商讨加密密钥的,加密密钥用来对其他应用层协议数据进行加密,从而保证数据的安全

原理

前面讲了 TLS 协议就是用来商讨密钥的,那么怎么商讨的?

拿客户端 A 访问服务器 B 举例:

  1. A 使用 tcp 三次握手连接到 B,然后发送给 B 第一个数据包。给出了协议版本号、一个 A 生成的随机数(Client random),以及 A 支持的加密方法
  2. B 确认双方使用的加密方法,并给出 B 自己的数字证书、以及一个 B 生成的随机数(Server random)
  3. A 确认收到的数字证书有效(查看扩展阅读),然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给 B
  4. B 使用自己的私钥,解密出 A 发来的随机数(即 Premaster secret)
  5. 现在 A 和 B 都可以根据约定的加密方法,使用前面的三个随机数,生成一个一样的”对话密钥”(session key),用来加密接下来的整个对话过程(http 协议、websocket 协议或者其他应用程协议)

上述过程就是 TLS 协议的整个过程,密钥商讨出来后,双方就可以开始交互了

可以看到,最终密钥是双方使用相同的 3 个随机数通过一个算法生成的,只有 3 个随机数会在网络上传播,而且最后一个随机数是通过 B 的公钥加密的,除了 B 没有人可以解密,而最终密钥也不会在网络中传输。所以最终密钥是无法被嗅探到的。

每次 TCP 连接都会经过 TLS 的密钥商讨,然后进行数据传输

可以看下面的图,更加易懂

报文格式

  1. Content Type:一个字节,表示内容的类型
  2. Version:两个字节,表示 TLS 协议的版本
  3. Length:加密数据的长度
  4. Data:加密数据的内容

攻击手段

虽然 TLS 已经很安全了,但是魔高一尺道高一丈,业界依然有两种针对于 TLS 的知名攻击方式

SslStrip(降级攻击)

SslStrip 攻击的前提是中间人攻击,就是 A 的流量经过中间人转发给 B

现在大部分服务器都使用了 TLS 协议加密自己的网站,以保证客户端的安全。

但是如果客户端是通过 http 协议访问的,通常做法是服务端返回重定向,重定向到 https 页面,客户端就会跳转到 https 页面

  1. A 通过 http 协议访问 B,例如 “http://www.pefish.club/login”,正常情况下 B 会返回一个重定向到 “https://www.pefish.club/login”
  2. 中间人不将 A 的请求正常转发给 B,而是自己使用 A 的数据正常通过 https 请求 B,然后中间人将 B 回复给自己的数据中的所有 https 替换成 http,然后回复给 A
  3. 这样的话,A 将能收到正常的数据,感觉不到自己的请求被拦截
  4. 因为 A 收到的数据中的 https 都变成了 http,所以A发出的请求依然是 http 请求,中间又进行步骤 2 的操作

整个过程,A 与中间人之间是 http 协议传输,中间人与 B 之间是 https 传输

中间人可以很清楚的知道 A 都传了什么数据

所以,请不要通过 http 访问 https 网站

证书伪造攻击

证书伪造攻击的前提也是中间人攻击

  1. A 通过 https 访问 B,A 和 B 会进行密钥协商,也就是 TLS 握手
  2. 中间人截获 A 的握手信息,自己充当 B,使用自己的证书与 A 进行协商,协商过程中,A 要对证书进行合法性检查,会发现这个证书关联的不是你要访问的域名(一般中间人都会伪造成访问的域名,创建证书的时候,CN填入对应域名即可),或者不是自己信任的CA机构颁发的(中间人如果有办法将自己的证书颁发机构CA的证书安装到A上的话,中间人就会得到信任),这时浏览器会提示风险
  3. 此时如果 A 忽略风险继续访问的话,中间人将能解密所有的 A 传输的信息,包括敏感信息。
  4. 中间人收到请求后,自己会与 B 建立 https 连接,然后将 B 的回复又转发给 A。A 可以正常收到数据

所以如果你发现你访问的 https 网站提示了证书问题,请不要继续访问

在第二步中,如果中间人的伪造证书是向正常的权威 CA 机构申请的呢,那么 A 将会信任中间人,这样的话 A 将被窃听。但是

中间人的伪造证书向正常的权威 CA 机构申请是很难做到的,权威 CA 机构在你申请证书时需要你填写这个证书关联到的域名,并且需要进行 DNS 验证,如果你没有域名的所有权,你是无法完成 DNS 验证的。

当然,如果你是权威 CA 机构内部人员的话就另当别论了

扩展阅读

CA (Certificate Authority)

被称为证书授权中心,是数字证书发放和管理的机构。

根证书

是 CA 认证中心给自己颁发的证书。安装根证书意味着对这个 CA 认证中心的信任。默认操作系统中安装了多个权威的根证书

通过 CA 生成数字证书

  1. 用户首先产生自己的密钥对,并将公钥及部分个人身份信息传送给认证中心。
  2. 认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息以及公钥信息,同时还附有认证中心的签名信息(使用 CA 机构的私钥签名的,CA 的公钥可以用来证实这个证书确实是这个 CA 颁发的)。

假设 B 向 CA 机构 CA 申请了数字证书,并且用于自己的服务器,而且 A 客户端机器上信任了 CA 机构的证书(也就是机器上安装了 CA 的根证书,跟 CA 颁发给别人的证书一样,包含了自己的公钥),那么 B 发送给 A 的数字证书将会被验证通过

证书的各种名词

  1. X.509。通用的证书格式,包含证书持有人的公钥、加密算法等信息
  2. pkcs1 - pkcs12。一种加密标准,一般存储为 .pN,.p12 是包含证书和密钥的封装格式
  3. *.der。证书的二进制存储格式
  4. *.pem。证书或密钥的Base64文本存储格式,可以单独存放证书或密钥,也可以同时存放证书和密钥
  5. *.key。单独存放 pem 格式的证书或密钥的,一般保存为 *.key
  6. *.cer *.crt。两个指的都是证书,Linux下叫 crt,Windows下叫 cer;存储格式可以是 pem,也可以是 der
  7. *.csr。证书签名请求,包含证书持有人的信息,如:国家、邮件、域名等信息
  8. *.pfx。微软 IIS 的实现
  9. *.jks。Java 的 keytool 工具实现的证书格式

各种格式的证书都可以通过 openssl 命令进行生成或转换




微信关注我,及时接收最新技术文章