如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

嵌入式開發可能既困難又昂貴,但本文展示如何在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已連接,並準備使用新固件進行更新。

如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

圖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/獲得。

如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

圖1:基於Web的IDE連接到虛擬機的IP地址。 (來源: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美元的WiFi設備上安裝安全的嵌入式Web服務器

圖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中啟用的宏。

如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

圖4:宏'USE_SMQ'啟用IoT模式,宏''SMQ_DOMAIN'設置服務器名稱。 (來源:R

從圖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顯示了單擊設備鏈接之前和之後的在線服務器。

如何在3美元的WiFi設備上安裝安全的嵌入式Web服務器

圖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


分享到:


相關文章: