Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

前言

物联网(IoT, Internet of Things)就是连接到互联网,而其中更重要的是安全性,没有安全性,没有加密通信,每个人都可以看到我发送或接收的内容。如果密码或用户名以未加密的方式发送,这尤其糟糕。因此加密和安全通信是关键。解决方案是使用使用TLS(Transport Layer Security,传输层安全性)协议的连接。

这篇文章可以学习到数据通信安全的东西:网络堆栈架构,对称和非对称加密和证书。

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

概览

本文介绍了使用TLS(传输层安全性)协议进行安全通信的基本原则,并结合了MQTT。TLS是SSL(安全套接字层,Secure Sockets Layer)的后继者,通常一起使用(TLS / SSL)。TLS(如名称所示)是传输层上的加密:这意味着应用层本身不必实现加密:相反,它将传输层配置为使用加密协议。

网络堆栈架构

对于与互联网通信的应用(例如,在微控制器上运行),它需要通信栈(TCP / IP,例如lwip)以及与物理层(例如FRDM-K64F开发板)通信所需的硬件。TCP / IP本身是应用程序与另一方通信的常见“语言”:

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

同样的原则适用于在我自己主机上运行的MQTT Mosquitto代理(或任何服务器)。

MQTT是一种使用TCP(传输控制协议,Transmission Control Protocol)的特殊“语言” ,基本上位于应用程序和TCP / IP堆栈之间:应用程序使用MQTT层来交谈和理解“MQTT语言”:

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

TCP / IP使用“套接字”和/或“端口”。默认情况下,Mosquitto正在使用未使用加密协议的端口1883。这意味着可能每个人都可以看到MQTT代理和客户端之间的数据交换。使用MQTT进行未加密的连接非常有用,因为这很简单,并且提供了一种简单的方法来开始探索MQTT。在另一端配置加密和使用加密连接要复杂得多。但是,一旦我以未加密的方式工作以进行测试成功,我肯定还想使用加密方式通信。

而是在应用程序本身中进行“端到端”加密,更好的方法是在通信堆栈之上放置加密层:

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

这样,应用程序(或MQTT语言部分)不需要实现加密协议本身,它只是与加密层对话,并且将完成所有工作。

对称和非对称加密

加密很大程度上依赖于数学,涉及到随机数生成器和加密算法。加密时需要“**”:一系列位和字节,用于“锁定”(加密)和“解锁”(解密)数据。

使用对称加密, 相同的**用于加密和解密消息:

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

这意味着拥有该(蓝色)**的每个人都能够解密该消息。因此,安全性取决于我可以分发和保留该**的安全性。

使用非对称加密,我有一对数学连接的**:共享绿色和私有红色**。我将红色**保密,不要透露和分发。绿色钥匙是公开的:每个人都可以拥有它。每个人都可以使用绿色公钥加密消息,但只有具有红色私钥的消息才能解密它:

???? 公钥和私钥构建一对**,它们不同,但在数学上是相关的。这样,只有私钥才能解密用公钥才能加密消息!

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

证书

但我怎么知道我收到的公钥真的来自我认为它来自的人?也许我认为我已经从我认为的那个人那里收到了公钥,但事实上它是一个“中间人”拦截所有信息而我拥有的确是那些中间人的公钥呢?

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

这时这里的“证书”进入了剧中。证书是一种护照,由“认证机构”(CA)提供,证明该人确实是那个人。

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

证书本身可用于加密和验证**,类似于将**打包到证书中

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

然后,Sue可以使用可信证书来提取**。如果失败,Sue知道带**的证书不是来自Joe。

如何分发**和证书有不同的方法和协议。通常,**/证书是预先分发的(例如,预先安装在设备上),或者使用诸如TLS的多级协议来建立和交换秘密信息。

传输层安全性(TLS)协议

TLS存在于不同的版本中(当前版本为1.3 RFC 8446,发布于2018年8月10日)。TLS使用称为“握手”的特殊协议来同意协议和交换**(有关详细信息,请参阅此链接)。基本上,证书用于验证服务器身份,非对称加密用于交换用于对称加密的共享**:

  1. 客户端向服务器发送明确(未加密)的“hello”消息,要求加密会话。
  2. 服务器响应其服务器证书,其中包含服务器公钥。
  3. 客户端验证证书并提取公钥。
  4. 客户端使用公钥将他生成的“pre-master”**发送到服务器。
  5. 服务器使用其私钥来提取“pre-master”**。
  6. 客户端和服务器都使用“pre-master”**来计算共享**。
  7. 客户端将消息发送到由该共享**加密的服务器。
  8. 服务器解密收到的消息并进行检查。
  9. 如果通过,服务器使用共享**将加密的消息发送回客户端以确认一切正常。
  10. 从此时起,客户端和服务器都使用共享**进行通信。

https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.1.0/com.ibm.mq.doc/sy10660_.htm 中的图表提供了握手过程的完整概述:

Introduction to Security and TLS(安全性和TLS(传输层安全性)简介)

加密中间件

我不打算实施TLS或加密算法;-)。相反,我正在寻找一个我可以使用的开源库。有不同的供应商提供加密中间件。对于我使用MQTT,lwip和FRDM-K64F的项目,有以下内容:

mbedTLS是我发现的最通用和开放的库,这就是我开始在我的项目中使用它的原因。在下一篇文章中有关它的更多信息。

总结

要使用安全的数据传输,我必须使用加密。密码算法提供了几个开源库,其中mbedTLS库似乎最符合我的需求。**(sic!)加密是**和证书的分发和处理。TLS(或传输层安全性)是一种管理mbedTLS库中提供的**验证和分发的协议。

链接