iot注册服务器,IoT 设备与服务器设备接口

我一贯推荐用户使用SSL/TLS这种标准方式来实施设备的服务器接口。当然我也清楚许多嵌入式设备采用SSL依然是有困难。困难来自以下几点:

嵌入式设备多采用嵌入式C/C++编程;

如果采用标准库,耗费RAM/ROM和计算时间;

如果没有使用标准库,自行开发验证安全算法耗费太多、时间。

即使SSL/TLS,不同Cloud供应商和证书供应商的安全套件不尽相同。

RSA/ECC等非对称算法在某些阶段过于耗费时间。

互联网常见的Base64/ASCII传输方式,在嵌入式领域比较耗费资源。

TLS证书的存储。

所以,根据安全设计原则来提供一个私有设备接口规范,是非常必要的。这里,还需要区分TCP长连接、短连接和UDP方式。

TCP长连接

如果设备使用WiFi/以太网/SocketCAN等方式连接到服务器上,则TCP长连接很适合。在Linux中,TCP称之为Stream,这一点在长连接上会造成信息在接收端所特有的沾包、半包现象。所以承载在TCP长连接之上的应用层协议,必须设计合理地帧结构来隔断、截取完整的信息。

如果TCP安全加密后,TLS其实是AES这种block加密方式,所以TCP长连接 Stream 中位数不足的可以采用padding方式,接收端部分地解决了此类问题。但是由于AES中IV的存在,需要增设一个问答方式来不断地重置IV。

TCP短连接

一些无线传感器网络如BLE/WiFi网关、Sub-1GHz WSN网关、LoRa网关,蜂窝数据等,采用短连接也很适合。TCP短连接一般没有沾包现象,典型的HTTP就是使用ASCII字符串以及回车来实现各个字段的划分的。

针对TCP短连接,如果每次重新连接,走密钥交换流程太费时间,往往在后续TCP连接中继续使用AES Session Key,同时应用层中使用Token + cookie等实现。

UDP报文

某些设备如NB-IoT天生的传输方式就是UDP方式。TCP/UDP的区别在于UDP是不保证信息一定送达,先后次序和重复发送的。也就是说UDP接收端会出现报文丢失、报文重复、次序颠倒等现象。而TCP接收端则不会出现此类现象。

虽然UDP有DTLS,但是我目前还没有研究透彻。

设备端的简化

一般常见的TLS安全套件由以下几个部分组成:

key exchange algorithm (RSA/DH/ECDH/SRP/PSK)

authentication (RSA/ECDSA/DSA)

bulk encryption algorithm (DES/3DES/AES)

message authentication code (MAC)

典型套件有:

TLS_RSA_WITH_3DES_EDE_CBC_SHA,其中3DES_EDE_CBC是一个加密算法

TLS_PSK_WITH_AES_128_CCM_8,IoT设备常用安全套件

TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,IoT设备常用安全套件

假设设备采用长连接服务器,而且设备可以通过预先分配AES初始密码的(PSK, Pre-shared key)方式下发到设备和服务器中,那么安全算法中的Key Agreement已经完成了。所以剩下的就是产生Session Key启动AES加密,然后在AES加密通道中完成HMAC签名,实现双向认证即可。

所以,我和同事无意中设计的安全套件是:

TLS_PSK_WITH_AES_128_CCM_SHA

虽然它的Handshake是与TLS有些差异的。

在开发过程中,针对SHA1/SHA256的C/C++/Python源码了解了以下,发现SHA仅仅是散列算法,而HMAC-SHA才是签名算法,需要使用密钥来签名。虽然HMAC底层也是调用SHA散列算法的。这里有三个网站可以验证这些算法的正确性:

应用层协议

由于是TCP长连接,带AES128块加密,所以信息的截取问题不大。但是许多嵌入式开发的资深工程师会尝试将串口协议照搬使用来实现预定义的二进制协议。但是这是在为服务器端工程师埋坑。

虽然在工程上马最初,双方使用ctype/struct等可以很简单地解决这个问题。但无论何种领域的工程师,都知道需求更改是肯定会发生的。而预先定义二进制协议,会在后续协议升级维护阶段造成很大困扰,甚至无法维护。

当一个端口面临多个版本的二进制协议,服务器端工程师心里绝对是崩溃的。所以补救措施:

增设VERSION字段,一旦发现版本差异,马上提示OTA,并断开连接。

采用更加通用的带语义解释的应用协议。

至于采用何种协议,需要双方讨论。可以使用:

CSV;

JSON;

msgpack;

某种二进制JSON。

如果工程师一定要采用自己的二进制协议,那么服务器端团队应该提供某种透传协议工具,比如JSON schema实现二进制与JSON的互相转换,让设备端工程师和应用端工程师直接对接,而规避这种麻烦事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWS IoT是一种完全托管的云服务,用于将物联网(IoT设备连接到Amazon云平台,实现设备的管理和数据通信。而EC2(Elastic Compute Cloud)是亚马逊AWS云计算服务的一部分,为用户提供可伸缩的虚拟服务器环境。 要实现AWS IoT MQTT设备接入EC2,首先需要将MQTT设备注册到AWS IoT平台。在AWS IoT中,我们可以创建设备证书和密钥,然后将其下载到设备上。设备使用这些证书和密钥来与AWS IoT平台建立安全的连接。 然后,在EC2中,我们需要设置一个运行MQTT Broker的服务器。可以选择使用Mosquitto等开源软件或AWS IoT Core来搭建MQTT Broker。根据实际需求,我们可以选择搭建独立的MQTT Broker服务器,或者在现有的EC2实例中运行。 接下来,我们需要为EC2实例配置安全组规则,以允许设备通过MQTT协议与EC2进行通信。可以为设备定义入站和出站规则,以确保连接的安全性。 完成这些配置后,设备就可以使用其证书和密钥通过MQTT协议与EC2建立连接了。设备可以发布数据到指定的主题(topic),或订阅感兴趣的主题,接收其他设备或EC2发布的消息。 通过AWS IoT MQTT设备接入EC2,可以实现设备和云端之间的实时数据传输和通信。设备可以将传感器数据、状态信息等上传到EC2进行处理和分析,也可以接收来自EC2的指令和控制信息。 总之,AWS IoT MQTT设备接入EC2是一种有效的方式,将物联网设备连接到云计算环境中,实现设备管理和数据交换。同时,它还提供了强大的安全性和灵活性,满足不同场景下的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值