前言
物联网(IoT, Internet of Things)就是连接到互联网,而其中更重要的是安全性,没有安全性,没有加密通信,每个人都可以看到我发送或接收的内容。如果密码或用户名以未加密的方式发送,这尤其糟糕。因此加密和安全通信是关键。解决方案是使用使用TLS(Transport Layer Security,传输层安全性)协议的连接。
这篇文章可以学习到数据通信安全的东西:网络堆栈架构,对称和非对称加密和证书。
概览
本文介绍了使用TLS(传输层安全性)协议进行安全通信的基本原则,并结合了MQTT。TLS是SSL(安全套接字层,Secure Sockets Layer)的后继者,通常一起使用(TLS / SSL)。TLS(如名称所示)是传输层上的加密:这意味着应用层本身不必实现加密:相反,它将传输层配置为使用加密协议。
网络堆栈架构
对于与互联网通信的应用(例如,在微控制器上运行),它需要通信栈(TCP / IP,例如lwip)以及与物理层(例如FRDM-K64F开发板)通信所需的硬件。TCP / IP本身是应用程序与另一方通信的常见“语言”:
同样的原则适用于在我自己主机上运行的MQTT Mosquitto代理(或任何服务器)。
MQTT是一种使用TCP(传输控制协议,Transmission Control Protocol)的特殊“语言” ,基本上位于应用程序和TCP / IP堆栈之间:应用程序使用MQTT层来交谈和理解“MQTT语言”:
TCP / IP使用“套接字”和/或“端口”。默认情况下,Mosquitto正在使用未使用加密协议的端口1883。这意味着可能每个人都可以看到MQTT代理和客户端之间的数据交换。使用MQTT进行未加密的连接非常有用,因为这很简单,并且提供了一种简单的方法来开始探索MQTT。在另一端配置加密和使用加密连接要复杂得多。但是,一旦我以未加密的方式工作以进行测试成功,我肯定还想使用加密方式通信。
而是在应用程序本身中进行“端到端”加密,更好的方法是在通信堆栈之上放置加密层:
这样,应用程序(或MQTT语言部分)不需要实现加密协议本身,它只是与加密层对话,并且将完成所有工作。
对称和非对称加密
加密很大程度上依赖于数学,涉及到随机数生成器和加密算法。加密时需要“密钥”:一系列位和字节,用于“锁定”(加密)和“解锁”(解密)数据。
使用对称加密, 相同的密钥
用于加密和解密消息:
这意味着拥有该(蓝色)密钥的每个人都能够解密该消息。因此,安全性取决于我可以分发和保留该密钥的安全性。
使用非对称加密,我有一对数学连接的密钥:共享绿色和私有红色密钥。我将红色密钥保密,不要透露和分发。绿色钥匙是公开的:每个人都可以拥有它。每个人都可以使用绿色公钥加密消息,但只有具有红色私钥的消息才能解密它:
? 公钥和私钥构建一对密钥,它们不同,但在数学上是相关的。这样,只有私钥才能解密用公钥才能加密消息!
证书
但我怎么知道我收到的公钥真的来自我认为它来自的人?也许我认为我已经从我认为的那个人那里收到了公钥,但事实上它是一个“中间人”拦截所有信息而我拥有的确是那些中间人的公钥呢?
这时这里的“证书”进入了剧中。证书是一种护照,由“认证机构”(CA)提供,证明该人确实是那个人。
证书本身可用于加密和验证密钥,类似于将密钥打包到证书中
然后,Sue可以使用可信证书来提取密钥。如果失败,Sue知道带密钥的证书不是来自Joe。
如何分发密钥和证书有不同的方法和协议。通常,密钥/证书是预先分发的(例如,预先安装在设备上),或者使用诸如TLS的多级协议来建立和交换秘密信息。
传输层安全性(TLS)协议
TLS存在于不同的版本中(当前版本为1.3 RFC 8446,发布于2018年8月10日)。TLS使用称为“握手”的特殊协议来同意协议和交换密钥(有关详细信息,请参阅此链接)。基本上,证书用于验证服务器身份,非对称加密用于交换用于对称加密的共享密钥:
- 客户端向服务器发送明确(未加密)的“hello”消息,要求加密会话。
- 服务器响应其服务器证书,其中包含服务器公钥。
- 客户端验证证书并提取公钥。
- 客户端使用公钥将他生成的“pre-master”密钥发送到服务器。
- 服务器使用其私钥来提取“pre-master”密钥。
- 客户端和服务器都使用“pre-master”密钥来计算共享密钥。
- 客户端将消息发送到由该共享密钥加密的服务器。
- 服务器解密收到的消息并进行检查。
- 如果通过,服务器使用共享密钥将加密的消息发送回客户端以确认一切正常。
- 从此时起,客户端和服务器都使用共享密钥进行通信。
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.1.0/com.ibm.mq.doc/sy10660_.htm 中的图表提供了握手过程的完整概述:
加密中间件
我不打算实施TLS或加密算法;-)。相反,我正在寻找一个我可以使用的开源库。有不同的供应商提供加密中间件。对于我使用MQTT,lwip和FRDM-K64F的项目,有以下内容:
OpenSSL
(https://www.openssl.org/):非常完整和有能力的开源实现,具有良好的文档。更多针对台式机和Linux机器,以及更小的嵌入式设备。我有一个许可许可证,正在转向Apache许可证版本。但由于一般的开销,我不认为它与FRDM-K64F一起使用。wolfSSL
(https://www.wolfssl.com/wolfSSL/Home.html),以前的CyaSSL:针对嵌入式设备,它适用于FRDM-K64F。免费的开源(GPLv2和GPLv3)版本是限制性的,而且是我预算之外的商业版本?CycloneSSL
(https://www.oryx-embedded.com/cyclone_ssl.html):功能不错,但与wolfSSL相同:仅限GPL许可和商业版。mbedTLS
(https://tls.mbed.org/),以前的PolarSSL:由ARM拥有,良好的文档和Apache 2.0许可证允许我免费在商业和开源项目中使用它。它似乎也与lwip一起使用(稍后将详细介绍)。
mbedTLS是我发现的最通用和开放的库,这就是我开始在我的项目中使用它的原因。在下一篇文章中有关它的更多信息。
总结
要使用安全的数据传输,我必须使用加密。密码算法提供了几个开源库,其中mbedTLS库似乎最符合我的需求。密钥(sic!)加密是密钥和证书的分发和处理。TLS(或传输层安全性)是一种管理mbedTLS库中提供的密钥验证和分发的协议。
链接
- 原文: https://mcuoneclipse.com/2017/04/14/introduction-to-security-and-tls-transport-security-layer/
- 维基百科:https://en.wikipedia.org/wiki/Transport_Layer_Security
- 安全MQTT的SLL:http://rockingdlabs.dunmire.org/exercises-experiments/ssl-client-certs-to-secure-mqtt
- SSL加密场景背后:https://www.digicert.com/ssl-cryptography.htm
- ARM mbed TLS库:https://tls.mbed.org/