嵌入式开发可能既困难又昂贵,但本文展示如何在30分钟内,在一种成本超低的设备上安装好安全的嵌入式Web服务器,以便在WiFi芯片上运行FreeRTOS和lwIP TCP/IP堆栈。
为什么要使用安全(TLS)的服务器?
浏览器已经开始将标准(HTTP)服务器在浏览器栏中标记为“不受信任”(参见下面的图2),而安全服务器对最终用户来说将更加值得信赖。我将在本文下面的安全注意事项部分详细介绍。
WiFi芯片ESP8266和Minnow服务器
1美元即可买到ESP8266芯片,但我建议使用带USB接口的线路板。更新固件需要USB接口。如果没有板载USB,则需要额外的步骤,比如使用USB-TTL转换器。一个现成的带USB接口的ESP8266线路板只需3美元可以购买到。
低成本的ESP8266 WiFi芯片非常适合学习之用,但速度很慢,特别是在执行诸如加密等CPU密集型任务时。在使用慢速芯片来处理CPU密集型任务时,确实需要慎重考虑你的设计。
ESP8266以80 Mhz的频率运行,这对嵌入式芯片来说还算可以,但代码执行速度比较慢,因为代码要通过SPI内存执行。在超过资源受限微控制器的实际限制时,在此设备上运行启用TLS的服务器可提供真正的唤醒呼叫,并提供对可在慢速微控制器上运行的内容的精彩介绍。选择合适的安全Web服务器类型和Web应用程序设计对于速度较慢的设备至关重要。
在本文中,我将解释如何在ESP8266上编译和运行Minnow服务器。 Minitow服务器和参考示例在GitHub上可以找到。
我最近在embedded.com上发表了一篇关于Minnow服务器的文章。该篇文章介绍了如何使用Minnow服务器创建一个基于Web的现代设备管理应用程序。本文还探讨了在使用TLS时将WebSocket服务器与所谓的单页应用程序(SPA)结合使用的好处。我建议读者先阅读一下这篇文章,因为我们将为ESP8266准备和编译相同的示例代码。
入门
我们将使用由esp-open-rtos项目提供的ESP8266 FreeRTOS/lwIP环境,但不用担心,你不需要经历一遍复杂的esp-open-rtos设置过程。相反,我们将利用预先配置好且完全准备好使用的环境,这个环境就是一个易于使用的基于Web的IDE.
下载FreeRTOS/lwIP ESP8266 IDE
导航到Real Time Logic并下载我们已经准备好的ESP8266 IDE。这一IDE专为教育目的而设计,包括一个预先配置好的esp-open-rtos,并绑定好了可简单使用的基于Web的C语言源代码IDE。 IDE需要VmWare或VirtualBox,我本人更喜欢VmWare胜过VirtualBox,因为我发现前者更容易使用。而且,请注意,VmWare对于非商业用途是免费的。
ESP8266 IDE还包括一个嵌入式TLS堆栈(SharkSSL),Minnow服务器在使用SharkSSL编译时会自动使用TLS。
您可以在没有ESP8266线路板的情况下开始使用ESP8266 IDE,但无法上载和运行已编译过的代码。换句话说,您可以下载IDE并按照本教程中的所有步骤完成操作,除了在ESP8266上运行代码。
图1中的屏幕截图显示了虚拟机及与其相连的基于Web的IDE。请注意虚拟机是如何获得ESP8266 USB连接的所有权。基于Web的IDE检测到此情况,便显示ESP8266已连接,并准备使用新固件进行更新。
图1:基于Web的IDE连接到虚拟机的IP地址。 (来源:Real Time Logic)
图1中的屏幕截图显示ESP8266通过一块面包板连接到LED。除非您想要控制本示例应用程序中使用的外部LED,否则不需要额外的LED或面包板。
请注意,你的VM的IP地址很可能与图1中的不同。确保在虚拟机窗口中单击IP地址。如果窗口为空白,请单击窗口,然后按Enter键。您必须在浏览器中输入此IP地址才能打开Web IDE。
安装Minnow Server和示例代码
Minnow Server参考示例不包含在ESP8266 IDE中,必须单独安装。图1显示了已安装在“ESP/ms”目录下的Minnow Server示例。必须从Linux命令行安装Minnow Server,但如果您没有使用Linux,也不要担心。您只需复制并粘贴我们准备好的命令即可。下图显示了粘贴到Linux Web shell中的Minnow Server安装命令的屏幕截图,可从http://vm-ip-address/webshell/获得。
图2:粘贴到Linux Web shell中的Minnow Server安装命令。 (来源:Real Time Logic)
当您在浏览器中输入Web shell的URL时,系统将提示您登录。用户名为sharkssl,密码为SharkSSL。
GitHub上的ESP8266教程解释了如何配置虚拟机、安装所有内容、编译Web服务器示例,以及刷新固件等。以下视频通过逐步解释简化了操作过程。
安全与非安全
Minnow Server可以在安全或非安全模式下使用,而在与ESP8266 IDE和SharkSSL一起使用时自动进入安全模式(TLS)。在设备中使用支持TLS的Web服务器会增加额外的复杂性,最终用户也将要承担处理SSL证书的管理责任。在上面的视频中,我们展示如何通过在浏览器中安装认证机构(CA)证书来去除浏览器中显示的证书错误。CA证书用于在Web服务器示例中对证书进行签名。
嵌入式设备通常安装在受保护的专用网络中,但许多客户仍要求使用TLS进行Web服务器连接。在专用网络上使用支持TLS的服务器会有问题,因为没有众所周知的认证授权机构签署IP地址或非标准(专用网络)名称。一种选择是成为自己的证书颁发机构。如果有兴趣了解更多相关信息,请点击链接地址,查看教程:https://realtimelogic.com/blog/2014/05/How-to-act-as-a-Certificate-Authority-the-Easy-Way
如上所述,ESP8266速度很慢。TLS非常占用CPU,您会注意到需要一些时间才能建立连接。使用WebSockets进行通信的单页应用示例针对CPU资源有限的设备进行了优化,但初始非对称加密(TLS握手)仍然需要时间,特别对于一些不遵循友好设计实践规则且打开许多TCP连接的浏览器,因为需要完整的TLS握手。要了解有关现代Web浏览器和慢速微控制器问题的更多信息,请参阅我们的教程:https://realtimelogic.com/blog/2018/11/Creating-SinglePage-Apps-with-the-Minnow-Server,该教程详细探讨了这一问题。
开发者模式与发布模式
在上面的视频中,我们通过在固件中嵌入单页应用(HTML资源)来编译发布模式。这样,我们可以简单地导航到设备以启动应用,将应用按需加载到浏览器中。
开发Web应用通常需要多次迭代,并且必须为每次迭代刷新新的固件,这就使得开发过程非常耗时。幸运的是,单页应用可以在开发期间驻留在您的PC上,您只需刷新浏览器即可加载新的应用程序。从PC加载应用程序后,其中的JavaScript代码将与ESP8266建立唯一的WebSocket连接。此连接用于所有浏览器与设备的交互。教程【使用Minnow Server创建单页应用程序】:https://realtimelogic.com/blog/2018/11/Creating-SinglePage-Apps-with-the-Minnow-Server,也详细探讨了这一开发过程。
请注意,单页应用的服务器端(设备端)为ESP8266提供了一个端口API。此API与拖放固件上载示例一起使用,但不保存上载的数据。此外,更改凭据也没生效。 esp-open-rtos API包含一个文件系统,您可以使用esp-open-rtos提供的API添加缺失的功能。
IoT启用ESP8266的参考示例
配置有嵌入式Web服务器的设备通常会在公司防火墙和/或路由器后面的专用网络上安装和操作,并且在外部使用时和防火墙滥用时自动受到保护。但是,此类部署也会阻止合法的远程使用。
有时,嵌入式设备需要通过Internet从远程位置进行操作,最安全的方法是利用物联网启用设备并让设备连接到Internet上的服务器。下图描绘了这样的设置。
图3:本地或通过Internet远程访问嵌入式设备。(来源:Real Time Logic)
External User:外部用户
Online connection:在线连接
Redirector:重定向器
Private Network:专有网络
Local Intranet user:本地企业内部用户
Direct websocket: 直接Websocket
Connection:连接
Minnow Server参考示例包含一个可在编译时启用的可选IoT组件。请注意,此组件在默认情况下是禁用的,并且需要对代码(或Makefile)进行一些细微的修改才能启用它。上面视频的第二部分显示了如何连接到我们设置的在线测试服务器。
当设备以IoT模式运行时,除了充当本地使用的服务器之外,该设备还作为网络客户端运行。网络客户端通常不需要任何网络配置来连接到Internet上的服务,但必须连接到已知的服务。出于这个原因,我们建立了一个可用于测试目的的在线IoT服务器。您可以使用它进行测试。
在线服务器充当远程用户和设备之间的代理,并允许远程用户安全地访问在防火墙后运行的私有Web服务器。请注意,我们设置的测试服务器不是即用型服务。我们将保持运行一段时间,但如果您计划使用IoT模式,最终您将需要设置自己的私有IoT服务器。
GitHub上的Minnow页面包含有关如何设置自己的私有IoT服务器的说明。私有IoT服务器的好处是不必依赖于任何特定的IoT服务提供商。您会惊讶地发现操作私有IoT服务器是多么容易和合理。
如何启用IoT模式
上面的视频显示了如何IoT启用Minnow Server的参考示例,以下屏幕截图显示了需要在Makefile中启用的宏。
图4:宏'USE_SMQ'启用IoT模式,宏''SMQ_DOMAIN'设置服务器名称。 (来源:Real Time Logic)
从图4中可以看出,SMQ_DOMAIN宏必须设置为我们的在线IoT演示服务器“minnow.ml”,或您自己的IoT服务器。
此时,您应该可以单击“Run”按钮,以编译并上载新的固件。运行新固件时,您应该会在Web控制台中看到以下文本。请注意,我删除了一些打印输出结果。
WebSocket服务器监听443
SMQ:连接到https://minnow.ml
协商密码:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
警告:从minnow.ml收到的证书不受信任!
证书警告的原因与充当不信任在线服务器的TLS客户端的设备有关。证书管理很复杂,我会在本文最后讨论这个问题。
所有连接的设备都显示在在线服务器的(minnow.ml)用户界面中。单击其中一个设备将转到该设备的登录屏幕。登录页面的验证凭据由设备提供,而不是在线服务器。默认凭据是root/password。图5显示了单击设备链接之前和之后的在线服务器。
图5:单击设备链接之前和之后的在线服务器。 (来源:Real Time Logic)
图5的左侧窗格显示了一个已连接的设备,但是在线服务器可以管理任意数量的设备,并且随着连接设备的增加,列表也会增长。单击链接时,联机服务器的代理功能会将您连接到设备,从这一点开始,在概念上,连接的工作方式与图3中所示的直接WebSocket连接类似。
安全考虑事项
如上所述,Minnow Server可以在安全(HTTPS)或非安全(HTTP)模式下运行。因不必处理证书,使用非安全连接比较容易。在慢速CPU上服务器运行也要快得多。但是,如上图2中的浏览器栏所示,在非安全连接时,Google的Chrome浏览器和其他浏览器现在会显示警告消息。谁知道接下来他们会做什么?谷歌似乎决心想要关闭非安全通信。
使用TLS时,您必须确保使用有效的信任链。如果用户浏览到具有不受信任证书的服务器,所有浏览器都会发出严重警告信息。正如我们在上面的视频中所解释的那样,为私有服务器建立信任链需要您在专用网络上提供信任管理解决方案。如上视频所示,一种解决方案是充当您自己的证书颁发机构。如果您有兴趣建立自己的信任链,我建议您阅读文章:《如何充当自己的证书颁发机构?》
https://realtimelogic.com/blog/2014/05/How-to-act-as-a-Certificate-Authority-the-Easy-Way
当设备在客户端模式下运行,并连接到在线测试服务器minnow.ml时,控制台上将打印出证书警告。您可以在示例源代码文件“main.c”中找到此打印输出结果(参见图3)。不要打印警告,而是应该终止连接,但在修改C代码以终止不受信任连接之前,必须确保设备信任在线服务器minnow.ml。通过将在线服务器的CA证书(根证书)导入设备的C代码,就可以恢复信任。在线服务器的证书由Let's Encrypt签署。
如果您不熟悉“信任链”这一概念,我建议您阅读文章《嵌入式系统的证书管理》:
https://realtimelogic.com/blog/2013/10/Certificate-Management-for-Embedded-Systems
本文同步刊登于2019年电子工程专辑杂志4月刊
- ESP8266这个在IOT当中是明星方案,现在USB接口化了,那使用起来更加便捷