IoT 網路通訊安全很重要,導入 SSL 讓你的 ARDIUNO 裝置不要被駭

評論
評論

 

Mechalas,2015 年 03 月 27 日 此篇文章的 PDF 檔案、程式碼範例的壓縮 (zip) 檔案皆可在最後的" 下載”區取得。

 

目錄

簡介

入門

步驟一:建造 Yocto 的 wolfSSL

步驟二:在 Glileo 安裝 wolfSSL

步驟三:修改編譯模式以符合 Ardiuno IDE

步驟四:在 Ardiuno IDE 系統上安裝 wolfSSL Script 範例 注意事項 文件下載

 

簡介

英特爾®的 Galileo 開發板是 Arduino 認證的開發與標準模組。

Galileo 以 Yocto 1.4 Poky Linux release 為基礎,合併了 Arduino 開發環境與完整的 Linux 作業系統,而此 Linux 系統允許愛好者在 Ardunio sketch 本中結合 Linux 的系統呼叫與 OS 可提供的服務。

長久以來, Arduino 平台的限制一直是未支援 SSL 。由於 Arduino 模組缺少 SSL ,因此直接且危險地使用 HTTP 傳遞訊息,而無法透過 HTTPS 安全地傳送任何資料。

參與內建物聯網的裝置,為了解決此缺陷,必須仰賴輔助的網路橋接設備,而此橋接設備可以將 Arduino 裝置使用 HTTP 的網路服務轉換成 HTTPS 的方式傳送訊息。 此

解決方案非常適用於有固定的網路位置的設備,而此設備需要額外的硬體和制定多個裝置的集中點,但可能易受攻擊。此方式對於偶爾使用公共無線網路的行動設備是完全無效用的。

最有效的保護連結裝置的方式是設備本身能直接支援 SSL 。

在 Galileo 上的 Arduino sketch 僅是一個交叉編譯成機器碼的 C++ 程式,並且如同作業系統管理的程序方式執行著。即它可以進入有任何相同系統的資源和其他編譯程序,且此程序可以任意連結編譯庫。

也意味著,增添 SSL 的支援與把 Arduino  sketch 連結至既有的 SSL 函式庫一樣容易。

此篇分析兩種在 Arduino sketch 中新增支援 SSL 的方法,且此 sketch 是由 wolfSSL 公司出版的 wolfSSL 函式庫 (正式名稱式 CyaSSL 函式庫) 執行在 Galileo 開發板上。

wolfSSL 函式庫是設計給資源有限的環境與嵌入式應用程式使用的輕量級 SSL/TLS 函式庫,並且可在 GPLv2 許可證下發布。

入門

本文研究兩種可以連接 wolfSSL 函式庫至 Arduino  sketch 的方法,且此兩種方法都遵循下列基本步驟:

  1. 為 Yocto 建構 wolfSSL
  2. 安裝 wolfSSL 共享函式庫於你的 Galileo 映像檔
  3. 修改編譯模式以符合 Galileo 的 Arduino IDE
  4. 安裝 wolfSSL 建構檔在管理 Arduino IDE 的系統

 

此過程有點複雜,且需要確實理解  linux 環境、 shell 指令、軟體包、軟體建構程序、和在 Linux 系統下傳送與接收檔案的方法。此外,此篇文章將會介紹一些特定的 Linux 指令細節,但不是一步一步的操作手冊並且是假設在讀者是了解如何操作 Linux 系統上的檔案。 這些步驟可以操作於 Galileo 與 Galileo2 開發板上。

方法 1:動態連結

在動態連結方式中,Arduino Script 是動態的連結共享的物件函式庫, libwolfssl.so 。這個方法是最容易設計的,因為只需直接呼叫函式庫的函式。 然而,此種方法與有以下的缺點:

  • Galileo 的 Arduino IDE 是使用單一的配置來編譯所有的 sketch ,所以不論 sketch 需不需要,此鏈結將會參照 libwolfssl.so 生成可執行檔。如果目標 Galileo 系統有安裝 wolfSSL 的函式庫,這不將是個問題。但如果 sketch 要在其他沒有安裝函式庫的系統編譯的話,將會無法執行。
  • Galileo 的 Arduino IDT 主機系統必須要將可交叉編譯的 wolfSSL 函式庫安裝至 Arduino IDE 的建構樹中。

方法 2:動態裝載

在動態裝載方法中, Arduino sketch 連接者動態連結裝載函式庫, libdl 。 wolfSSL 函式庫和它的記號是在使用 dlopen() 和 dlsym() 執行下,動態裝載的。此種方法較為繁瑣,因為函式名稱無法被鏈結直接解析,而必須要明確地藉由程式碼來裝載以及函式指標來儲存。

比動態連結方法更好的優點為:

  • libdl 是 Galileo 快閃記憶卡映像檔的一部分,因此有被修改過的 IDE 編譯的任何 sketch 仍舊可以執行在其他 Galileo 系統上。
  • Galileo 的 Arduino IDE 主機系統只需要把 wolfSSL 的標頭檔案安裝在建構樹中。
  • 只要單一的修改任何動態函式庫便可用於 Arduino 腳本。

 

步驟一:為 Yocto 建構 wolfSSL

在導入 SSL 支援於 Arduino 環境的第一步是藉由 uClibc 作為 C 的函式庫來建構 Yocto 的 wolfSSL 函式庫。這是使用了結合英特爾 Arduino IDE 與 Linux 的交叉編譯器完成的。這步驟必須執行在 Linux 系統。 目前已經有多種 IDE 版本,這些版本是來自於原始的 Galileo 和任何會做 IDE 的版本釋出。但檔案路徑會根據版本的轉換而有所不同,在此假設你會使用和此篇文章相同最新版本的條件下,目前英特爾綁定在 Arduino 1.6.0 版本是 1.0.4 版。

目標檔案: Arduino Software 1.6.0 -- Intel 1.0.4 for Linux

請針對你的 Linux 版本選擇正確的 32-bit 或 64-bit 檔案。

配置交叉編譯

假如你已使用的此版本的 IDE 來建造 Galileo 裝置的 sketch ,那麼你已經可以正確的配置了,並直接跳過此項目。 假如你尚未利用此版本來建構 sketch ,那麼你需要執行一個安裝 sketch 在這些組件配置檔案中正確地設定路徑名稱。此 sketch , install_script.sh ,是存放在你的 IDE 包之根目錄裡面的 hardware/tools/i586 中。不需任何參數的執行它:

螢幕截圖 2015-09-10 16.30.44

現在,交叉編譯器已經準備好可以使用了。

下載 wolfSSL 的來源

為了建構 Galileo 的 wolfSSL 函式庫,你必須從 wolfSSL 下載原始程式碼。在撰寫此文時,最新版本為 3.4.0,並且是發佈一個壓縮檔。解壓縮原始檔至你選擇的目錄下。

建構函式庫

為了建構函式庫,你必須先參照交叉編譯器來設定你的 shell 環境。此環境的設定檔採用了 Bourne shell 環境,因此你必須在適當和相容的 shell 下執行這些步驟,如 sh 或 bash 。強烈建議從一個乾淨未使用過的 shell 環境下開始。 首先,從英特爾 Arduino IDE 取得環境設定檔。必須使用你的英特爾 Arduino IDE 路徑來取代下面的範例:

螢幕截圖 2015-09-10 16.31.37

此步驟不會產生任何輸出。

現在,你可以準備執行 wolfSSL 的配置 Script 了。這裡必須要提供一些配置選項,以利正確地初始化交叉編譯器。

螢幕截圖 2015-09-10 16.32.14

注意:你必須提供絕對路徑給配置 sketch 使用,不能利用”~”當成是你的主目錄的捷徑。這裡使用 $HOME 此 shell 變數代替。

--prefix 項目是告知系統可以在哪裡安裝函式庫。因為通常你不會安裝函式庫在系統上,所以任何目錄下皆可。此範例表示他將會執行在 $HOME/wolfSSL 目錄下。

--host 和--target 項目是告知是建構一個交叉編譯器的系統,且此目標建構定義為

i586-poky-linux-uclibc。

配置 sketch 將會產生一些輸出。當他完成時並且假設沒有任何錯誤的情況下,你可以使用”make”建立軟體。

螢幕截圖 2015-09-10 16.33.56

接著利用”make install”來安裝至 local/temporary 路徑中。

螢幕截圖 2015-09-10 16.34.40

現在,你的函式庫已經在你利用 --prefix 指定的目錄中的子目錄了:

螢幕截圖 2015-09-10 16.35.18

你可以準備安裝 wolfSSL 函式庫在 Galileo 了。

 

步驟二:在 Galileo 安裝 wolfSSL

有兩個基本的方式可以安裝 wolfSSL 組件到 Galileo:第一個是直接複製檔案到 Galileo 檔案系統的映像檔中,第二個是透過網路連線複製檔案到正在執行的 Galileo 系統。然而,不論哪種方式,你都必須知道你的系統中是跑哪個映像檔, SD-Card Linux 映像檔還是 IoT Developer Kit 映像檔。

執行 SD-Card Linux 映像檔的 Galileo

SD-card Linux 映像檔是 Galileo 開發板的原始系統映像檔。這是一個很小的映像檔,且大小小於 312MB。它缺少開發工具 (例如,它沒有編譯器) 和進階版的 Linux 工具。撰寫此文時, SD-card 映像檔的最新版本為 1.0.4。

目標檔案: SD-Card Linux Image (SDCard.1.0.4.tar.bz2)

同時安裝方法也會在下面討論,但必較偏向於直接安裝到 Galileo 檔案系統映像,因為這樣可以在你的配置下,獲得更有利的工具。

安裝 wolfSSL 至檔案系統映像檔

這是一個跟其他方式比較起來,較簡單且不易出錯的方法,因為你必須提供可用的檔案同步工具,並且不會增加聯網的複雜度。所需要做的是,安裝 Galileo 檔案系統映像檔作為要建造的機器上的檔案系統,然後你可以使用 rsync 來複製 wolfSSL 組件到想要的地方。你可以複製這個檔案到你的建構系統中,或者直接使用讀卡機來讀取附有映像檔的微型快閃記憶卡並安裝。 在 Galileo 快閃記憶卡的檔案系統樹中,主要的 Galileo 檔案系統映像檔稱為 image-full-galileo-clanton.ext3 ,並且它可以使用環狀裝置來安裝。在你的建構系統中,產生一個安裝點 (目錄),下面的範例是使用/mnt/galileo,然後只需用安裝指令來架設。

螢幕截圖 2015-09-10 16.36.10

現在, Galileo 檔案系統存在於 /mnt/galileo 目錄。 利用 rsync 來複製共享函式庫和符號鏈結到指定的地方。他們會被安裝至 Galileo 檔案系統裡的 /usr/lib 中:

螢幕截圖 2015-09-10 16.38.47

必須確認是使用你的本機端建構的 wolfSSL 實際路徑來取代 $HOME/wolfSSL 。

透過網路安裝 wolfSSL

針對此方式, Galileo 系統必須穩定地在活絡的網路連線下運作,並且你也必須知道它的網路位址。因為 Galileo 缺少檔案同步工具,例如, rsync ,所以檔案必須先利用 tar 來複製,以確保符號的鏈結可以正確地處理。 首先,利用 cd 指令切換至你建造的主機端 wolfSSL 函式庫的子目錄下。

螢幕截圖 2015-09-10 16.40.18

現在,使用 tar 來創出一個共享的函式庫與符號鏈結的檔案,接著利用 scp 來複製它到 Galileo 。

螢幕截圖 2015-09-10 16.49.48

確保輸入的網路位址是你的 Galileo 位址,並非範例中的位址。 登入至你的 Galileo 裝置以及 untar 檔案:

螢幕截圖 2015-09-10 16.51.56

執行 Galileo 的 IoT Developer Kit 映像檔 IoT Developer Kit 映像檔是一個相當大以及相當傳統的 Linux 系統的映像檔,其包括了開發工具與許多有用的系統工具與守護進程 (daemons) 。它是分配在原始硬碟映像檔,其包含了 FAT32 和 ext3 硬碟分區,此外它必須是直接寫入快閃記憶卡中。

目標檔案: iotdk-galileo-image.bz2

兩種安裝方法會在下面討論。

如同文章說過的,你必須要用含有英特爾 Arduino IDE 的函式庫取代在 Developer Kit 映像檔中的 uClibc 函式庫。因為在使用這兩種函式庫的副本在建構程序上的不同,並非所有輸出在 IDE 的符號皆表示在 Developer Kit 版本,與導致隨機的 Arduino 腳本損害。實際上, wolfSSL 函示庫介紹了這些符號的相依性,如果缺少了 Developer Kit 建造的 uClibc 以及沒有在 Galileo 系統上取代函式庫,將可能導致 libwolfssl 失敗。

安裝 wolfSSL 至檔案系統映像檔

若你可以利用讀卡機連接到你的 Linux 系統的話,此方法是最容易的。因為 Developer Kit 映像檔包含了 ext3 區間,所以大部分 Linux 版本會自動為你安裝在 /media 或/mnt 之下。可使用 df 指令,搭配 -T 來幫助你決定安裝點。

螢幕截圖 2015-09-10 16.55.24

在此例子中,安裝點為 /media/johnm/048ce1b1-be13-4a5d-8352-2df03c0d9ed8:

螢幕截圖 2015-09-10 16.58.22

Arduino Script 使用的函式庫是存放於 /lib32 目錄下。利用 cd 指令來切至該目錄,並使用 rsync 複製 wolfSSL 共享的資料庫和符號鏈結到該目錄下,以保護符號鏈結。

螢幕截圖 2015-09-10 17.07.37

確認是實際快閃記憶卡的 Galileo 檔案系統的執行點取代了 path-to-mountpoint。 現在你要將 Developer Kit 的 uClibc 函式庫取代成你的英特爾 Arduino IDE 組件。以下的程序只有重新命名,不須去移除或覆寫它,這樣可以不須永久地刪除函式庫即可有效地關閉其原始的複製檔:

螢幕截圖 2015-09-10 17.09.08

記住,是要使用你實際到英特爾 Arduino IDE 的路徑,而非範例上的路徑。

透過網路安裝 wolfSSL

針對此方式, Galileo 系統必須穩態地在活絡的網路連線下運作,並且你也必須知道它的網路位址。因為 Galileo 缺少檔案同步工具,例如, rsync ,所以檔案必須先利用 tar 來複製,以確保符號的鏈結可以正確地處理。

首先,利用 cd 指令切換至你建造的主機端 wolfSSL 函式庫的子目錄下。

螢幕截圖 2015-09-10 17.10.51

現在,使用 tar 來創出一個共享的函式庫與符號鏈結的檔案,接著利用 scp 來複製它到 Galileo 。

螢幕截圖 2015-09-10 17.12.20

確認輸入的是你的 Galileo 的網路位址,而非範例上的位址。 現在登入你的 Galileo 裝置,並且 untar 檔案:

螢幕截圖 2015-09-10 17.13.29

下一步,你必須把將 Developer Kit 的 uClibc 函式庫取代成由你的英特爾 Arduino IDE 組件的函式庫。以下的程序只有重新命名,不須去移除或覆寫它,這樣可以不須永久地刪除函式庫即可有效地關閉其原始的複製檔(這樣可以避免執行中地的 sketch 毀損)

螢幕截圖 2015-09-10 17.17.43

從你的 Galileo 系統中登出,以及使用 scp 指令將你的英特爾的 IDE 函式庫複製到 Galileo 系統:

螢幕截圖 2015-09-10 17.18.17

記得是使用你實際英特爾 Arduino IDE 的路徑和 Galileo 的網路位址,並非範例的路徑與位址。

 

步驟三: 修改編譯器模式以符合 Arduino IDE

為了可以使用 wolfSSL 函式庫來編譯 sketche ,因此需要根據 Galileo 的 Arduino IDE 來修改編譯模式。具體的修改必須根據你所選的連結 libwolfssl 的方式,但無論實踐在 hardware/intel/i586-uclibc 的編譯物件的方法是英特爾 1.0.4 版本和與 Arduino IDE 1.5.3 版亦或更新版本。

修改編譯模式

保存你的編譯模式的檔案名稱是 platform.txt。

fig1 compile patterns

你可以編輯" ecipe.c.combine.pattern" 此行,如下:

螢幕截圖 2015-09-10 17.21.57

動態連結

假設你正在使用動態連結的方式,那麼你必須告知可執行的鏈結要增加 libwolfssl 到函式庫的鏈結列表中。新增 -lwolfssl 至此行的結尾。

螢幕截圖 2015-09-10 17.25.08

不可寫入任何的換行符號。

動態裝載

在動態裝載方法中,你必須通知鏈結新增動態裝載函式庫到函式庫列表中。新增 -ldl 至此行的結尾。

螢幕截圖 2015-09-10 17.27.06

確認不可寫入任何的換行符號。

 

步驟四: 安裝 wolfSSL 建構檔案於 Arduino IDE 系統中

可以編譯 sketch 的最後一步是安裝 wolfSSL 函式庫到 Garlileo 建構樹中的 Arduino IDE 。在 1.6.0 版本中,建構樹在 hardware/tools/i586/i586-poky-linux-uclibc 目錄下。在此,你可以發現類似 UNIX 的目錄結構,且其包含了目錄,如 etc ,  lib ,  usr 與 var 。

安裝 wolfSSL 的標頭檔

無論使用動態裝載還是動態連結方式,你會需要已安裝的 wolfSSL 標頭檔,其檔案 Arduino IDE 是可以搜尋到的,因此你可以包含它們在腳本中:

螢幕截圖 2015-09-10 17.29.49

你可以在步驟 1 產生的本機端安裝的 wolfSSL 找到標頭檔在 include 子目錄中。為了向後相容性的理由, wolfSSL 分布標頭檔在 include/cyassl 和 include/wolfssl 。  wolfSSL 標頭檔必須安裝至 usr/include 目錄下:

fig2 includes dir

安裝 wolfSSL 函式庫

如果你是使用動態連結方法,那麼你必須也要安裝交互編譯的函式庫。如果你是使用動態裝載的方式,那麼你可以略過此步驟。

函式庫是在步驟 1 產生的本機端安裝的 lib 目錄下。從那裡複製:

螢幕截圖 2015-09-10 17.33.29

但所有共享函式庫中的其中之一為鏈結符號,它們可以被複製成一般的檔案。

fig3 copying wolfssl libraries

Sketch 範例

以下的 sketch 範例可以表示出如何利用動態連結和動態裝載的方法來與 wolfSSL 函式庫互相作用。它們呈現出相同的函式:連結至目標的網路伺服器以及透過 SSL 取得網頁。頁面來源會被印至 Galilep 序列控制台的 Arduino IDE 中。 這些 sketch 是由英特爾的簡易來源代碼認證許可的。除了在此瀏覽來源代碼,亦可直接下載它們。 注意:一定要更改伺服器名稱,如果必要時,必須取得頁面的網址。

動態裝載範例

螢幕截圖 2015-09-10 17.37.20

動態裝載範例

螢幕截圖 2015-09-10 17.42.02

注意事項

此文件的資料是由英特爾物聯網產品提供。沒有許可,明示或暗示,禁止翻供或其他方式授予此篇文章智慧財產權。

除了英特爾對於該產品所提供的銷售條款與條件之外,其他涉及銷售和/或使用英特爾產品包括責任或適用於特定的目的、適銷性、或專利、版權、智慧財產權的侵害之擔保,英特爾概不承擔任何責任,英特爾並否認任何陳述或暗示的擔保責任。

除非另有英特爾書面同意,英特爾的產品無意被設計用於或被用於以下應用:

即在這樣的應用中可能因為英特爾產品的故障而導致人身傷亡。 英特爾可能隨時變更規格和產品說明,恕不另行通知。設計者不得依賴標有「保留」或「未定義」字樣的功能、特性或說明的缺失。英特爾保留今後對其進行定義的權利, 對於因今後對其變更所產生的任何衝突或不相容性概不負責。此資訊可能隨時變更,恕不另行通知。

請勿使用此資訊確定最終設計。 本文件所描述的產品可能包含某些設計瑕疵或錯誤,一經發現將收入勘誤表,並因此可能導致產品與已出版的規格有所差異。

最新的勘誤表可供索取。訂購產品前,請聯絡您當地的英特爾銷售辦公室或經銷商了解最新規格。文件副本需要有順序編號並被本文件或其他英特爾文獻引用,1-800-548-4725 或造訪英特爾的網站 www.intel.com 獲取。

英特爾,英特爾標誌,VTune,Cilk 與 Xeon 是英特爾在美國和其他國家的註冊商標。 *其他名稱或商標可能是屬於他人財產。 版權所有© 2012 英特爾公司。版權所有。

英特爾源代碼樣本許可協議.pdf

將 SSL 導入 GALILEO 上的 ARDIUNO.pdf

 

更多精選文章...

 


精選熱門好工作

賣家關係維護專員

樂購蝦皮股份有限公司
臺北市.台灣

獎勵 NT$20,000

Video/Image Processing Software Engineer

PicCollage 拼貼趣
臺北市.台灣

獎勵 NT$20,000

Game Animator 遊戲特效動畫師

Banana Whale Studios 香蕉會兒設計有限公司
臺北市.台灣

獎勵 NT$20,000

評論