Stay Hungry.Stay Foolish.
802.1X中EAP-TLS双向认证过程详解

简介

EAP-TLS是802.1X的一种认证协议,采用TLS双向认证(客户端需要验证服务端的证书,服务端也需要验证客户端的证书来识别身份)

交互过程

我们配合Wireshark抓包来查看整个过程

  1. 客户端发出EAP-start消息请求认证
  2. AP发出请求帧,要求客户端输入用户名
  3. 客户机响应请求,将用户名信息通过数据帧发送至AP; OuzyQK.jpg
  4. AP将客户端传来的信息重新封装成RADIUSAccessRequest包发送给服务器;
  5. 服务端会发送Server Hello,Certificate(服务端证书),Server Key Exchange(服务端DH),Certificate Request(请求客户端发送证书),Server Hello Done(ServerHelloDone这个消息,这个消息并没有什么实际的内容,它存在的主要原因就是因为前面的消息CertificateRequest是可选的,所以需要明确地告诉客户端服务端这边的消息发完了,否则客户端无从知道是否该等待CertificateRequest消息),RADIUS服务器验证用户名合法后向客户端发送数字证书, 服务端发送证书(Radius证书及其证书链)给客户端,客服端验证证书有效性(是否在信任列表,证书有效期,证书状态,根据证书链鉴定证书信任关系),故客户端需要提前导入Radius证书的Ca证书或者信任Radius证书 OKpVHg.png OurzF0.jpg OursJK.jpg
  6. 客户端会发送Certificate(客户端证书),Client Key Exchange(客户端DH),Certificate Verify(是客户端在发送证书后,为了表明自己是证书的拥有者,用自己的私钥对之前收到、发送的握手信息进行签名。),Change Cipher Spec(ChangeCipherSpec作为单独的一类消息只是表明握手协议已经完成,后续使用协商的加密参数进行通信),客户端发送客户端证书及其证书链,私钥需要对证书签名,以便证明自己拥有该证书)给服务端,服务端验证证书有效性(是否在信任列表,证书有效期,证书状态,根据证书链鉴定证书信任关系) Ou2Cqg.jpg Oug2VJ.jpg
  7. 客户端和服务器利用DH算法的两个临时密钥各自计算出密钥+Client Hello随机数+Server Hello随机数获得主会话密钥;
  8. 认证成功,RADIUS服务器向AP发送RADIUSACCEPT消息,其中包含密钥信息;
  9. AP向客户端转发EAPSuccess消息,认证成功

总结

  1. 客户端导入的Ca证书是服务端Radius的Ca,设置为信任之后,在服务端证书验证阶段被使用到
  2. 客户端导入的Ca证书同时也是个人证书的Ca,在客户端证书验证阶段需要随个人证书将整个证书信任链一起发送到服务端
  3. 客户端导入的个人证书私钥在客户端证书验证阶段需要对个人证书进行签名,在Certificate消息中将证书和CA证书链发送给服务端,另外还需要用自己的私钥做一个签名,以证明自己拥有证书对应的私钥
  4. 密钥交换的方法可以分成两大类:一类是基于加密、一类是基于DH。前者有RSA算法、GM的ECC算法;后者则有ECDHE、GM的ECDHE;

说明

EAP-TLS 目前使用的是下面的方式进行密钥交换

DH类算法的原理可以用下图来形象地解释: 首先双方协商一个相同的底色(算法参数),然后各自生成自己私有的颜色(相当于私钥),并通过混合得到对应的公有颜色(相当于公钥)。随后双方交换各自的公有颜色,并与自己的私钥颜色混合,最终协商出一个相同的颜色(即交换的密钥)。窃听者就算得到了双方交换的这些信息,也无法生成相同的密钥,求解离散对象问题的困难度保证了DH算法的安全性。

TLS ECDHE密钥交换 这个情况的典型算法套件如ECDHE-RSA-AES256-GCM-SHA384、ECDHE-ECDSA-AES256-GCM-SHA384。这里的EC表示椭圆曲线,DH表示基于DH算法,最后一个E则表示使用临时密钥进行密钥交换,而不是证书相关的非临时密钥。

我们来比较下跟前一种情况的区别,首先ClientHello和ServerHello消息是一样的,都带了一个随机数。区别在于服务端是通过ServerKeyExchange消息发送了一个临时DH参数给对方(也就是前面将DH原理时的公有颜色),类似地客户端也通过ClientKeyExchange消息把它的临时DH参数发送给服务端。这样双方就交换了彼此的临时DH公钥,然后他们各自利用自己的临时私钥和对方的临时公钥计算出预主密钥。与前一种情况的最大区别就在于此,前者是客户端加密预主密钥发送给服务端,后者是双方交换临时DH公钥,然后各自计算出预主密钥。

得到预主密钥后,后续的流程就一样了。结合两个随机数派生出主密钥,然后再派生出会话密钥。

参考

https://baijiahao.baidu.com/s?id=1730003428306584544&wfr=spider&for=pc

自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
评论

暂无评论~~