1.準備工作
1.1 查看硬件SGX支持
首先應該確認計算機CPU是否支持SGX,此處有兩種方法:
- https://ark.intel.com/content/www/us/en/ark.html#@PanelLabel12213 爲Intel提供硬件信息的官方網址,輸入電腦CPU型號,查看是否有SGX支持。
- 根據https://github.com/ayeks/SGX-hardware/blob/master/test-sgx.c,在Linux或者Windows環境下,編譯該代碼,查看運行結果。本計算機的運行結果如下圖所示:
可見,本計算機支持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:
- 不支持,則僅安裝SDK,在編譯代碼時,make SGX_MODE=SIM,即在模擬模式下運行,https://blog.csdn.net/q2240441362/article/details/80343962。
- 如支持,則需要首先安裝一些支持庫,然後按順序安裝SGX driver,PSW和SDK,https://github.com/intel/linux-sgx。
1.2 下載安裝包
根據硬件和軟件環境,這裏選擇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文件
1.3 安裝工具
1.3.1 安裝工具庫
在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
1.3.2 安裝alien
sudo apt-get install alien
1.3.3 下載並安裝Intel® Capability Licensing Service(iclsClient):
下載網址爲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文件夾。
1.3.4 安裝JHI服務:
從https://github.com/intel/dynamic-application-loader-host-interface中下載dynamic-application-loader-host-interface源碼,解壓後進入路徑,使用以下命令編譯並安裝JHI服務。
cmake .;make;sudo make install;sudo systemctl enable jhi
2 安裝SGX
這裏參考了https://blog.csdn.net/cyLee_/article/details/90200470,https://blog.csdn.net/q2240441362/article/details/80343962。
2.1 安裝SGX驅動
由於下載的.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
即爲安裝成功。
2.2 安裝SGX PSW
在當前路徑下,使用以下命令安裝
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文件夾下。
2.3 安裝SGX SDK
爲下載得到的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,則需要手動輸入自定義的路徑。
2.4 修改環境變量
如果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文件夾複製到其它路徑下,進行代碼的編輯與測試。
2.5 環境測試
進入到sgxsdk路徑下的SampleCode文件夾下,以SampleEnclave項目爲例,
cd SampleEnclave
make
編譯過程會生成app可執行文件
./app
程序運行結果如下圖,表明環境安裝成功。
關於SGX程序的編寫,請參考我的另一篇文章:Intel SGX程序編寫
3 環境卸載
按照SGX driver、PSW、SDK的順序卸載。
3.1 SGX driver卸載
安裝之後在 /opt/intel/sgxdriver 路徑下回生成uninstall.sh文件,運行該文件即可卸載驅動。
3.2 卸載PSW
之前安裝的是libsgx-enclave-common_2.3.101.46683-1_amd64.deb,這裏使用以下命令卸載
sudo dpkg -P libsgx-enclave-common
3.3 卸載SDK
在安裝SDK的路徑下,會生成對應的uninstall.sh,運行該文件即可卸載SDK。
參考資料:
- https://ark.intel.com/content/www/us/en/ark.html#@PanelLabel122139
- https://github.com/ayeks/SGX-hardware/blob/master/test-sgx.c
- https://ark.intel.com/content/www/us/en/ark/products/186604/intel-core-i7-9700k-processor-12m-cache-up-to-4-90-ghz.html
- https://blog.csdn.net/q2240441362/article/details/80343962
- https://github.com/intel/linux-sgx
- https://download.01.org/intel-sgx/linux-2.3.1/ubuntu18.04/
- http://registrationcenter-download.intel.com/akdlm/irc_nas/11414/iclsClient-1.45.449.12-1.x86_64.rpm
- https://github.com/intel/dynamic-application-loader-host-interface
- https://github.com/intel/linux-sgx/issues/47
- https://download.01.org/intel-sgx/linux-2.3.1/docs/Intel_SGX_Installation_Guide_Linux_2.3.1_Open_Source.pdf
- https://blog.csdn.net/cyLee_/article/details/90200470