首先应该确认计算机CPU是否支持SGX,此处有两种方法:
可见,本计算机支持SGX的硬件数为1,即为支持。
本次实验采用的硬件平台为Intel® Core™ i7-9700K,为Intel i7第9代Products formerly Coffee Lake 系列CPU,https://ark.intel.com/content/www/us/en/ark/products/186604/intel-core-i7-9700k-processor-12m-cache-up-to-4-90-ghz.html,14纳米制程,8核8线程,标准频率为3.60 GHz。具体信息如下图所示。
该处理器支持SGX,如下图所示。
对于支持SGX的计算机,也需要在BIOS里开启SGX选项。开机按F2键进入BIOS界面,开启SGX选项。
lsb_release -a
实验的软件平台为Ubuntu18.04.2 LTS,信息如下图所示:
根据硬件是否支持SGX:
根据硬件和软件环境,这里选择Intel SGX Linux 2.3.1 Release for Ubuntu18.04版本,下载网址为https://download.01.org/intel-sgx/linux-2.3.1/ubuntu18.04/,界面如下图所示。
其中的libsgx-enclave-common_2.3.101.46683-1_amd64.deb对应SGX PSW,sgx_linux_x64_driver_4d69b9c.bin对应SGX driver,sgx_linux_x64_sdk_2.3.101.46683.bin对应SDK。下载这三个文件即可。
注意:较高版本的PSW改为libsgx-enclave-common__amd64.deb文件
在Ubuntu18.04下,输入以下命令。
sudo apt-get install libssl-dev libcurl4-openssl-dev libprotobuf-dev
sudo apt-get install build-essential
sudo apt-get install uuid-dev libxml2-dev cmake libsystemd-dev
sudo apt-get install alien
下载网址为http://registrationcenter-download.intel.com/akdlm/irc_nas/11414/iclsClient-1.45.449.12-1.x86_64.rpm,进入下载文件夹,编译 iclsClient:
sudo alien --scripts iclsClient-1.45.449.12-1.x86_64.rpm
会在文件夹中生成同名的deb文件,然后安装iclsClient:
sudo dpkg -i iclsclient_1.45.449.12-2_amd64.deb
iclsClient会安装在 /opt/intel/ 目录下生成的iclsClient文件夹。
从https://github.com/intel/dynamic-application-loader-host-interface中下载dynamic-application-loader-host-interface源码,解压后进入路径,使用以下命令编译并安装JHI服务。
cmake .;make;sudo make install;sudo systemctl enable jhi
这里参考了https://blog.csdn.net/cyLee_/article/details/90200470,https://blog.csdn.net/q2240441362/article/details/80343962。
由于下载的.bin文件没有被执行的权限,使用以下命令修改权限。
chmod 777 sgx_linux_x64_driver_4d69b9c.bin
运行该.bin文件
sudo ./sgx_linux_x64_driver_4d69b9c.bin
SGX驱动会将其设置为开机启动,并在 /opt/intel/sgxdriver 目录下生成uninstall.sh脚本。为确保驱动已经成功安装,可输入以下命令
ls /dev/isgx >/dev/null 2>1 && echo "SGX Driver installed" || echo "SGX Driver NOT installed"
打印SGX Driver installed
即为安装成功。
在当前路径下,使用以下命令安装
sudo dpkg -i libsgx-enclave-common_2.3.101.46683-1_amd64.deb
PSW的库文件默认安装在了 /usr/lib/x86_64-linux-gnu文件夹下,AESM服务以及相关的库安装在了 /opt/intel/libsgx-enclave-common文件夹下。
为下载得到的SDK文件添加可执行权限:
chmod 777 sgx_linux_x64_sdk_2.3.101.46683.bin
使用以下命令安装SGX SDK:
sudo ./sgx_linux_x64_sdk_2.3.101.46683.bin
安装过程中会询问安装的路径,可以输入yes安装到当前文件夹,也可以输入no选择自己想安装到的文件夹。这里选择yes,将SGX SDK安装到 /opt/intel/sgxsdk 文件夹下。如果选择no,则需要手动输入自定义的路径。
如果SDK安装在了自定义的路径下,由于Makefile默认的SDK路径是在opt/intel/sgxsdk,所以在编译代码时,Makefile里的SDK路径要修改为安装的路径。
安装完成时,编译代码报错
Please use the correct uRTS library from PSW package.
Error: Unexpected error occurred.
这里参考https://github.com/intel/linux-sgx/issues/47,编译时没有使用正确的PSW提供的libsgx_urts.so文件,这个文件应该不是opt/intel/sgxsdk里的那个同名文件,而应该是PSW提供的。所以要添加这个库所在的路径:/usr/lib/x86_64-linux-gnu。使用以下命令打开bashrc文件。
sudo gedit ~/.bashrc
在文件末尾添加以下代码。
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
重启终端,运行以下命令,确定环境变量添加成功。
echo $LD_LIBRARY_PATH
在模拟模式下编译,可能会出现以下错误。
libsgx_urts_sim.so:cannot open sharedobject file: No such file or directory
这也是库文件路径的问题,因为处于模拟模式,所以只需要添加SDK下的库文件路径即可。这里,该文件在opt/intel/sgxsdk/lib64下,所以在bashrc文件里添加以下语句即可。
export LD_LIBRARY_PATH= opt/intel/sgxsdk/lib64:$LD_LIBRARY_PATH
由于 opt/intel/sgxsdk 下的文件不可修改,所以这里可以将sgxsdk文件夹复制到其它路径下,进行代码的编辑与测试。
进入到sgxsdk路径下的SampleCode文件夹下,以SampleEnclave项目为例,
cd SampleEnclave
make
编译过程会生成app可执行文件
./app
程序运行结果如下图,表明环境安装成功。
关于SGX程序的编写,请参考我的另一篇文章:Intel SGX程序编写
按照SGX driver、PSW、SDK的顺序卸载。
安装之后在 /opt/intel/sgxdriver 路径下回生成uninstall.sh文件,运行该文件即可卸载驱动。
之前安装的是libsgx-enclave-common_2.3.101.46683-1_amd64.deb,这里使用以下命令卸载
sudo dpkg -P libsgx-enclave-common
在安装SDK的路径下,会生成对应的uninstall.sh,运行该文件即可卸载SDK。
参考资料: