IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

Mechalas,2015 年 03 月 27 日 此篇文章的 PDF 档案、程式码範例的压缩档案皆可在最后的" 下载”区取得。

目录

简介

入门

步骤一:建造 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 函式库执行在 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 。这个方法是最容易设计的,因为只需直接呼叫函式库的函式。 然而,此种方法与有以下的缺点:

方法 2:动态装载

在动态装载方法中, Arduino sketch 连接者动态连结装载函式库, libdl 。 wolfSSL 函式库和它的记号是在使用 dlopen 和 dlsym 执行下,动态装载的。此种方法较为繁琐,因为函式名称无法被链结直接解析,而必须要明确地藉由程式码来装载以及函式指标来储存。

比动态连结方法更好的优点为:

步骤一:为 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 中。不需任何参数的执行它:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

现在,交叉编译器已经準备好可以使用了。

下载 wolfSSL 的来源

为了建构 Galileo 的 wolfSSL 函式库,你必须从 wolfSSL 下载原始程式码。在撰写此文时,最新版本为 3.4.0,并且是发布一个压缩档。解压缩原始档至你选择的目录下。

建构函式库

为了建构函式库,你必须先参照交叉编译器来设定你的 shell 环境。此环境的设定档採用了 Bourne shell 环境,因此你必须在适当和相容的 shell 下执行这些步骤,如 sh 或 bash 。强烈建议从一个乾净未使用过的 shell 环境下开始。 首先,从英特尔 Arduino IDE 取得环境设定档。必须使用你的英特尔 Arduino IDE 路径来取代下面的範例:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

此步骤不会产生任何输出。

现在,你可以準备执行 wolfSSL 的配置 Script 了。这里必须要提供一些配置选项,以利正确地初始化交叉编译器。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

注意:你必须提供绝对路径给配置 sketch 使用,不能利用”~”当成是你的主目录的捷径。这里使用 $HOME 此 shell 变数代替。

--prefix 项目是告知系统可以在哪里安装函式库。因为通常你不会安装函式库在系统上,所以任何目录下皆可。此範例表示他将会执行在 $HOME/wolfSSL 目录下。

--host 和--target 项目是告知是建构一个交叉编译器的系统,且此目标建构定义为

i586-poky-linux-uclibc。

配置 sketch 将会产生一些输出。当他完成时并且假设没有任何错误的情况下,你可以使用”make”建立软体。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

接着利用”make install”来安装至 local/temporary 路径中。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

现在,你的函式库已经在你利用 --prefix 指定的目录中的子目录了:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

你可以準备安装 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

同时安装方法也会在下面讨论,但必较偏向于直接安装到 Galileo 档案系统映像,因为这样可以在你的配置下,获得更有利的工具。

安装 wolfSSL 至档案系统映像档

这是一个跟其他方式比较起来,较简单且不易出错的方法,因为你必须提供可用的档案同步工具,并且不会增加联网的複杂度。所需要做的是,安装 Galileo 档案系统映像档作为要建造的机器上的档案系统,然后你可以使用 rsync 来複製 wolfSSL 组件到想要的地方。你可以複製这个档案到你的建构系统中,或者直接使用读卡机来读取附有映像档的微型快闪记忆卡并安装。 在 Galileo 快闪记忆卡的档案系统树中,主要的 Galileo 档案系统映像档称为 image-full-galileo-clanton.ext3 ,并且它可以使用环状装置来安装。在你的建构系统中,产生一个安装点 ,下面的範例是使用/mnt/galileo,然后只需用安装指令来架设。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

现在, Galileo 档案系统存在于 /mnt/galileo 目录。 利用 rsync 来複製共享函式库和符号链结到指定的地方。他们会被安装至 Galileo 档案系统里的 /usr/lib 中:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

必须确认是使用你的本机端建构的 wolfSSL 实际路径来取代 $HOME/wolfSSL 。

透过网路安装 wolfSSL

针对此方式, Galileo 系统必须稳定地在活络的网路连线下运作,并且你也必须知道它的网路位址。因为 Galileo 缺少档案同步工具,例如, rsync ,所以档案必须先利用 tar 来複製,以确保符号的链结可以正确地处理。 首先,利用 cd 指令切换至你建造的主机端 wolfSSL 函式库的子目录下。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

现在,使用 tar 来创出一个共享的函式库与符号链结的档案,接着利用 scp 来複製它到 Galileo 。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

确保输入的网路位址是你的 Galileo 位址,并非範例中的位址。 登入至你的 Galileo 装置以及 untar 档案:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

执行 Galileo 的 IoT Developer Kit 映像档 IoT Developer Kit 映像档是一个相当大以及相当传统的 Linux 系统的映像档,其包括了开发工具与许多有用的系统工具与守护进程。它是分配在原始硬碟映像档,其包含了 FAT32 和 ext3 硬碟分区,此外它必须是直接写入快闪记忆卡中。

两种安装方法会在下面讨论。

如同文章说过的,你必须要用含有英特尔 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 来帮助你决定安装点。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

在此例子中,安装点为 /media/johnm/048ce1b1-be13-4a5d-8352-2df03c0d9ed8:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

Arduino Script 使用的函式库是存放于 /lib32 目录下。利用 cd 指令来切至该目录,并使用 rsync 複製 wolfSSL 共享的资料库和符号链结到该目录下,以保护符号链结。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

确认是实际快闪记忆卡的 Galileo 档案系统的执行点取代了 path-to-mountpoint。 现在你要将 Developer Kit 的 uClibc 函式库取代成你的英特尔 Arduino IDE 组件。以下的程序只有重新命名,不须去移除或覆写它,这样可以不须永久地删除函式库即可有效地关闭其原始的複製档:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

记住,是要使用你实际到英特尔 Arduino IDE 的路径,而非範例上的路径。

透过网路安装 wolfSSL

针对此方式, Galileo 系统必须稳态地在活络的网路连线下运作,并且你也必须知道它的网路位址。因为 Galileo 缺少档案同步工具,例如, rsync ,所以档案必须先利用 tar 来複製,以确保符号的链结可以正确地处理。

首先,利用 cd 指令切换至你建造的主机端 wolfSSL 函式库的子目录下。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

现在,使用 tar 来创出一个共享的函式库与符号链结的档案,接着利用 scp 来複製它到 Galileo 。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

确认输入的是你的 Galileo 的网路位址,而非範例上的位址。 现在登入你的 Galileo 装置,并且 untar 档案:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

下一步,你必须把将 Developer Kit 的 uClibc 函式库取代成由你的英特尔 Arduino IDE 组件的函式库。以下的程序只有重新命名,不须去移除或覆写它,这样可以不须永久地删除函式库即可有效地关闭其原始的複製档(这样可以避免执行中地的 sketch 毁损)

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

从你的 Galileo 系统中登出,以及使用 scp 指令将你的英特尔的 IDE 函式库複製到 Galileo 系统:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

记得是使用你实际英特尔 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。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

你可以编辑" ecipe.c.combine.pattern" 此行,如下:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

动态连结

假设你正在使用动态连结的方式,那幺你必须告知可执行的链结要增加 libwolfssl 到函式库的链结列表中。新增 -lwolfssl 至此行的结尾。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

不可写入任何的换行符号。

动态装载

在动态装载方法中,你必须通知链结新增动态装载函式库到函式库列表中。新增 -ldl 至此行的结尾。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

确认不可写入任何的换行符号。

步骤四: 安装 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 是可以搜寻到的,因此你可以包含它们在脚本中:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

你可以在步骤 1 产生的本机端安装的 wolfSSL 找到标头档在 include 子目录中。为了向后相容性的理由, wolfSSL 分布标头档在 include/cyassl 和 include/wolfssl 。  wolfSSL 标头档必须安装至 usr/include 目录下:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

安装 wolfSSL 函式库

如果你是使用动态连结方法,那幺你必须也要安装交互编译的函式库。如果你是使用动态装载的方式,那幺你可以略过此步骤。

函式库是在步骤 1 产生的本机端安装的 lib 目录下。从那里複製:

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

但所有共享函式库中的其中之一为链结符号,它们可以被複製成一般的档案。

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

Sketch 範例

以下的 sketch 範例可以表示出如何利用动态连结和动态装载的方法来与 wolfSSL 函式库互相作用。它们呈现出相同的函式:连结至目标的网路伺服器以及透过 SSL 取得网页。页面来源会被印至 Galilep 序列控制台的 Arduino IDE 中。 这些 sketch 是由英特尔的简易来源代码认证许可的。除了在此浏览来源代码,亦可直接下载它们。 注意:一定要更改伺服器名称,如果必要时,必须取得页面的网址。

动态装载範例

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置

动态装载範例

IoT网路通讯安全很重要,导入SSL让你的ARDIUNO装置
注意事项

此文件的资料是由英特尔物联网产品提供。没有许可,明示或暗示,禁止翻供或其他方式授予此篇文章智慧财产权。

除了英特尔对于该产品所提供的销售条款与条件之外,其他涉及销售和/或使用英特尔产品包括责任或适用于特定的目的、适销性、或专利、版权、智慧财产权的侵害之担保,英特尔概不承担任何责任,英特尔并否认任何陈述或暗示的担保责任。

除非另有英特尔书面同意,英特尔的产品无意被设计用于或被用于以下应用:

即在这样的应用中可能因为英特尔产品的故障而导致人身伤亡。 英特尔可能随时变更规格和产品说明,恕不另行通知。设计者不得依赖标有「保留」或「未定义」字样的功能、特性或说明的缺失。英特尔保留今后对其进行定义的权利, 对于因今后对其变更所产生的任何冲突或不相容性概不负责。此资讯可能随时变更,恕不另行通知。

请勿使用此资讯确定最终设计。 本文件所描述的产品可能包含某些设计瑕疵或错误,一经发现将收入勘误表,并因此可能导致产品与已出版的规格有所差异。

最新的勘误表可供索取。订购产品前,请联络您当地的英特尔销售办公室或经销商了解最新规格。文件副本需要有顺序编号并被本文件或其他英特尔文献引用,1-800-548-4725 或造访英特尔的网站 www.intel.com 获取。

英特尔,英特尔标誌,VTune,Cilk 与 Xeon 是英特尔在美国和其他国家的注册商标。 *其他名称或商标可能是属于他人财产。 版权所有© 2012 英特尔公司。版权所有。

英特尔源代码样本许可协议.pdf

将 SSL 导入 GALILEO 上的 ARDIUNO.pdf