物联网系统安全离不开设备的身份认证和访问授权,我们现在已经在使用不同协议层上的身份认证技术,比如链路层的802.1x,传输层的TLS,应用层的OAuth2.0等。
802.1x协议是起源于802.11的访问控制和认证协议,基于C/S机构,可以限制未经授权的设备通过接入端口访问LAN/WLAN。在认证通过之前,802.1x只允许EAPOL(基于局域网的扩展认证协议)数据通过设备连接的交换机端口;认证通过以后,业务数据方可通过以太网端口。
OAuth协议其实不是一个认证协议,而是一个授权协议。OAuth开放授权标准允许用户授权第三方应用访问他们存储在另外的服务提供者上的部分信息,而不需要将用户名和密码提供给第三方应用。目前OAuth1.0协议已经不再使用,主要使用的是OAuth2.0协议。现在很多移动应用或网站上都是用微信授权登录,这里就是使用了OAuth2.0协议。
大部分物联网协议,如MQTT、HTTP等都是基于TCP的,从安全考虑,物联网系统通常都需要使用加密协议来进行数据传输,如MQTTS、HTTPS等。这些协议都是基于传输层安全协议TLS(Transport Layer Security)来实现的,因此TLS也是物联网系统最主要的安全认证手段,其他认证手段可以作为补充。本文将重点介绍TLS协议。
TLS协议前身是安全套接层(SSL: Secure Sockets Layer),SSL/TLS就是在TCP层上加了一层加密,这样就保证上层信息传输的安全。HTTP 协议是明文传输,加上 SSL 层之后,就变成了HTTPS。
SSL/TLS与HTTP/TCP的关系
SSL最初是由网景公司(Netscape)研发,后被IETF(互联网工程任务组)标准化后写入RFC(Request for Comment)中,改为TLS。我们现在用的都是TLS协议,但由于大家习惯了SSL这个称呼,所以一般还称为SSL。
TLS的认证过程依赖于握手完成。
TLS握手
1.Client Hello
握手第一步是客户端向服务端发送 Client Hello 消息。这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
2.Server Hello
第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。至此客户端和服务端都拥有了两个随机数(Random1+ Random2)。
3.Certificate
这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。
4.Server Hello Done
Server Hello Done 通知客户端 Server Hello 过程结束。
5.Client Key Exchange
客户端根据服务器传来的公钥生成了 PreMaster Key,这一步就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。
之所以要使用三个随机数,是因为整个握手过程的数据都是明文传输的,用多个随机数种子来生成秘钥不容易被暴力破解。
6.Change Cipher Spec(Client)
这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。
7.Client Finish
客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。
8.Change Cipher Spec(Server)
这一步是服务端通知客户端后面再发送的消息都会使用加密。
9.Server Finish
这一步服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
到这里,双方已安全地协商出了同一份秘钥,所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输。
TLS双向认证
客户端依赖于服务器的证书来完成对服务器的身份认证,基于安全性考虑,物联网场景中可能还会要求客户端向服务端上报证书,实现双向认证(如上图所示)。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用简单的语言描述复杂的技术,也会偶尔发表一下对IT产业的看法,欢迎大家关注,谢谢。