LWN:Ardruino的IoT设备可以轻松用上TLS了!

关注了就能看到更多这么棒的文章哦~

TLS gets a boost from Arduino for IoT devices

By John Coggeshall
July 28, 2020
https://lwn.net/Articles/826757/
DeepL assisted translation

Arduino 设备是 do-it-yourself(DIY)爱好者用于创建物联网(IoT)等设备时的首选。我们之前已经介绍过 Espressif ESP8266 系列,它们可以使用 Arduino SDK 进行开发,其实 Arduino 项目本身也提供了支持 WiFi 的设备,如 Arduino MKR WiFi 1010 开发板。近日,Arduino 安全团队在一篇文章中(https://blog.arduino.cc/2020/07/02/arduino-security-primer/ )提出了物联网设备的安全是个短板,以及 Arduino 项目计划如何改进。借此机会,我们将介绍其中一些大家可能感兴趣的内容,同时也看看 Arduino 和 Espressif SDK 项目中 TLS 支持的整体情况。

要实现一个安全的物联网设备,一个重要因素就是实现 TLS。最起码,TLS 可以用来防止通信被窃听,但如果部署得好,还可以解决其他一些安全问题(如中间人攻击)。此外,基于证书的认证在物联网端点之间比起用户名和密码认证要好得多。在基于证书的认证中,客户端提交的证书可以通过密码学方式验证客户端的身份,而不是依靠用户名和密码来验证。这些证书是由可信的、可加密验证的权威机构颁发的,因此它们比简单的用户名和密码更难被破解。不过,据该团队介绍。"到今天为止,很多嵌入式设备仍然没有正确实现完整的 TLS 协议栈"。该团队举例指出,"很多非品牌(off-brand)板卡使用的代码实际上并没有验证服务器的证书,这使得它们很容易成为服务器冒充和中间人攻击的目标"。

原因往往只是因为设备上的资源不足——有些设备只提供 32KB 的内存,而许多 TLS 的实现软件需要更多的内存才能起作用。此外,验证服务器证书可能需要存储大量的可信根证书(trusted root certificate)。如果在一个设备上要存下 Mozilla 信任的所有证书机构的数据的话,那么在这个可能只有 1MB 闪存空间的系统中,需要占用掉 170KB 以上。不幸的是,在这一领域普遍缺乏关于安全重要性的教育,这也让问题雪上加霜。毕竟 TLS 并不是开发者要实现的主要目标,而且必须在一个资源有限的平台上实现它,这是一个非常有挑战性的任务。

Arduino 项目似乎很重视这些问题,并在其产品中正进行一些具体改进。对于具有 WiFi 功能的 Arduino 板子来说,这意味着提供了一个基于硬件的加密解决方案。这些芯片(Microchip 的 ATECC508A 和 ATECC608A)为 TLS 实现而提供了证书存储、加密和验证等服务,并不会消耗 firmware 运行设备的资源。本质上,这些硬件加密芯片实现了处理 TLS 等非对称加密所需的一切。使用这些硬件解决方案需要必要的软件,对于 Arduino 来说,这意味着要提供一个轻量级的 TLS 实现,便于开发人员使用。为了解决这个问题,Arduino 项目借鉴了由 Thomas Pornin 编写的 MIT 授权的 BearSSL 项目的工作。

BearSSL 实现了 RFC5246,即 TLS 1.2 版本。根据 BearSSL 项目的指导规则,该项目 "试图在几个有些互相冲突的目标之间找到合理的平衡点",其中之一是希望能支持仅有很少 CPU 计算能力的平台。简而言之,它提供了一个非常适合物联网设备的 TLS 实现。BearSSL 似乎受到了 Pornin 的严格控制。在项目的 "How to Contribute "页面上,Pornin 表示欢迎打补丁,但应该直接发邮件给他来考虑是否合入。Pornin 表示,他 "will rewrite any patch suggestion",并且"产生的代码使用 MIT 授权,将我(也只有我)列为作者"。根据 Pornin 的说法,任何被接受的贡献都只会记录在 BearSSL 网站。代码可以从 Pornin 的 Git 仓库中获取。BearSSL 的最新版本 v0.6 于 2018 年 8 月发布,定位为 "beta-quality"软件。

尽管缺乏社区活动,并且最近一个版本已经是挺久以前了,但 Arduino 项目还是选择了 BearSSL "作为其 TLS library 的起始版本"。也就是名为 ArduinoBearSSL 库的实现方案,它跟 BearSSL 的最后一个版本绑定,并利用 ArduinoECCX08 库进行了增强,以利用硬件提供的加密工具(当硬件条件具备时)。这就为 Arduino 开发者提供了一个可以接受的 TLS 库,也包含了合适的硬件加速,并具有开发者对 Arduino 开发所期望的整体非常简单的特点。

值得一提的是,Arduino 并不是唯一一个使用了 BearSSL 的嵌入式项目。Espressif ESP8266 的 Arduino 代码也为其 WiFi 客户端实现了 BearSSL。和 Arduino 一样,ESP8266 的实现也捆绑了 BearSSL v0.6。不过根据 Espressif 官方论坛对 ESP8266 的介绍:ESP8266 "没有任何硬件加速加密支持"。这使得 TLS 的实现在 ESP8266 设备上变得更加复杂,因为整个实现必须在软件中完成。这可能会导致正 TLS 部署更加困难。例如,基于软件的 TLS 可能会导致连接时间非常慢。

Espressif 公司的新产品 ESP32 芯片,与 ESP8266 相比,它在功耗和整体功能上都有相当大的提升。其中一项改进是该模块的一个版本(ESP32-WROOM-32SE)包含了与 Arduino 开发板(Microchip 的 ATECC608A)相同的硬件加速加密芯片。虽然 BearSSL 被移植到 Espressif 的 Arduino ESP8266 库中,但它并没有被移植到 Espressif 的 Arduino 核中来支持 ESP32。相反,ESP32 的 TLS 支持是移植了 Mbed TLS (作为 WiFiClientSecure 库的一部分)来实现的。与 ArduinoBearSSL 不同的是,这个库的设计似乎并不是为了利用目前一些 ESP32 型号的硬件加速。既然 Arduino core for ESP32 的主要目的能让其利用 Arduino 库来开发,那么开发者应当也可以利用 ArduinoBearSSL 以及它所提供的硬件支持。

总而言之,很高兴看到像 Arduino 这样的项目和像 Espressif 这样的芯片制造商(它们都在尽力迎合 DIY 社区)认真对待安全问题。不过,这类改进对 DIY 社区的重要性不止于此,因为 Espressif 芯片系列还被广泛用于各种现成的消费设备中。在物联网的世界里,有这么一种不占用宝贵资源来完成存储证书的简单方法,就能让开发者不用在项目中再去砍别的功能来挤出资源了。希望这项技术能更广泛地用起来,这将有助于全面提高物联网的安全性。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

你可能感兴趣的:(LWN:Ardruino的IoT设备可以轻松用上TLS了!)