Intel SGX开发者参考书(三)—— 使用Intel SGX SDK工具(一)

@Intel SGX 读书笔记…

使用Intel SGX SDK工具

Intel SGX SDK提供以下工具:

  • Edger8r Tool:生成不可信组件和Enclaves之间的接口。
  • Enclave签名工具:生成包含Enclave签名的Enclave元数据,并将此类元数据添加到Enclave image。
  • Enclave 调试器:帮助调试Enclave。
  • Enclave内存检测工具:在Enclave运行期间帮助检测受保护内存的使用。
  • CPUSVN配置工具:帮助在不修改硬件的情况下模拟CPUSVN升级/降级场景。

Edger8r Tool

该工具在构建Enclave的过程中,自动通过读取用户提供的EDL文件产生边缘例程,这些边缘例程定义了不可信应用程序和Enclave之间的接口。而高级的Enclave开发大牛,可以自己修改Edger8r。
例如给出的EDL文件是demo.edl,Edger8r Tool工具会默认产生以下文件:

  • demo_t.h —— 包含可信代理和桥的原型声明。
  • demo_t.c —— 包含可信代理和桥的函数定义。
  • demo_u.h —— 包含不可信代理和桥的原型声明。
  • demo_u.c —— 包含不可信代理和桥的函数定义。
    下面是Edger8r工具的命令行描述:
    语法:
sgx_edger8r [options] <.edl file> [another .edl file …]

参数:

[Options]描述
– --use–prefix在不可信的代理前面加上Enclave名称
– --header–only只产生头文件
– --search–path< path> 指定EDL文件的搜索路径
– --untrusted只生成不可信的代理和桥
– --untrusted–dir< dir> 指定保存不可信代码的目录
– --trusted–dir< dir> 指定保存可信代码的目录
– --preprocessor指定编译器的路径,用于预处理EDL文件
– --help打印出命令行和选择的帮助信息

如果-- --untrusted和-- --trusted都没有指定,那么两者Edger8r Tool会生成的。
path参数的格式与path环境变量相同,并且Enclave名称是EDL文件的基本文件名(例子中是demo)。

注意:必须在受保护的无恶意软件环境中运行Edger8r Tool,以确保该工具的完整性,从而不会损害生成的代码。

Enclave签名工具

Intel SGX SDK提供sgx_sign工具对Enclave签名。对Enclave进行签名是一个涉及生成包含Enclave属性(如Enclave度量)的签名结构的过程(后面会提到Enclave签名结构的)。一旦以这种签名结构对Enclave签名,就可以检测到对Enclave文件的修改(例如代码、数据、签名等)。签名工具还会评估Enclave image,以发现潜在的错误,并警告您潜在的安全危害。sgx_sign通常由Intel SGX SDK中的配置工具设置,并在构建过程结束时自动运行。在加载过程中,检查签名,以确认Enclave没有被篡改,并加载正确。此外,还可以使用签名工具报告已签名的Enclave的元数据信息,并生成所需的SIGStruct文件来白名单Encalve签名者。
表2:Enclave签名结构

模块名字
HeaderHEADERTYPE
HEADERLEN
HEADERVERSION
TYPE
MODVENDOR
DATE
SIZE
KEYSIZE
MODULUSSIZE
ENPONENTSIZE
SWDEFINED
RESERVED
SignatureMODULUS
EXPONENT
SIGNATURE
BodyMISCSELECT
MISCMASK
RESERVED
ISVFAMILYID
ATTRIBUTES
ATTRIBUTEMASK
ENCLAVEHASH
ISVEXTPTODID
ISVPRODID
ISVSVN
BufferRESERVED
Q1
Q2

命令行语法:
用以下命令行语法运行sgx_sign:

sgx_sign <command> [args]

表3 签名工具命令

命令描述参数
sign在“一步签名”法中用私钥对Enclave签名必须的:–enclave,–key,–out; 可选择的:–config,–dumpfile,–cssfile
gendata这是“两部签名”过程中的第一步。用外部工具签名生成Enclave签名才来。此步骤将签名材料转储到一个总共256字节大小的文件中。必须的:–enclave,–key,–out,–sign,–unsigned; 可选择的:–config,–dumpfile,–cssfile
dump获取已签名的Enclave文件的元数据信息,并将元数据转储到使用–dumpfile选项指定的文件中,并将SIGSTRUCT转储到使用–cssfile选项指定的文件中。必须的:–enclave,–dumpfile, 可选的:–cssfile

表4 签名工具参数

参数描述
—enclave <file>明确对Enclave进行签名或者已经签名。它是这四个命令的必要参数
—config <file>指定Enclave配置文件。它是dump命令的无效参数,是其他三个命令的可选参数。
—out <file>指定输出文件。以下三个命令都需要它。
命令描述
sign已签名的Enclave文件
gendata包含Enclave签名材料的文件
catsig已签名的Enclave文件
—key <file>指定签名密钥文件。具体查看文件格式
命令描述
sign私钥
gendata不适用
catsig公钥
—sig <file>指定与enclave签名材料相应的包含签名的文件。只对catsig命令有效
—unsigned <file>指定通过gendata命令产生的包含Enclave签名材料的文件。只对catsig命令有效
—dumpfile指定一个文件来转储元数据信息。它是dump命令的必需参数,是sign和catsig的可选参数
—cssfile指定一个文件来转储SIGSTRUCT信息。它是sign,catsig和dump命令的可选参数
—resign默认情况下,如果一个输入Enclave已经被签名了,sig_sign就会报告错误。你可以通过提供的选项重新签名该Enclave
—version打印版本信息并退出
—help打印帮助信息并退出
这些参数(包括选项和文件名),可以在任何顺序下指定。首先执行选项,然后文件名。使用一个或多个空格或制表符(tab)分隔参数。每个选项都包含一个选项标识符,一个破折号(-),后面跟一个选项的名称。<file>参数指定文件的绝对或相对地址。 用户可以从系统命令提示符启动sgx_sign,或在VS IDE的Enclave项目属性下将命令行写入Post Build Event中。为了在不同的平台上遵循不同的命令符集规则,sgx_sign命令行在Widows OS中不区分大小写。 sgx_sign成功,则产生输出文件并返回0.否则,产生一个错误消息并返回-1.

Enclave 签名密钥管理

一个Enclave项目支持在Enclave开发生命周期中ISVs所需的不同签名方法。

  • 使用ISV的测试私钥的“单步”方法:
    签名工具支持“单步”签名过程,这需要在本地构建系统上访问签名密钥对。然而,一个需求是任何白名单列表Enclave签名密钥必须在硬件安全模块中管理。因此,ISV的测试私钥存储在构建平台将不是白名单列表,且Enclave只能在debug或prerelease模式下使用该密钥。在这种情况下,ISV管理签名密钥对,可以在创建Enclave项目时由VS
    Wizard生成,也可以由ISV使用自己的方法生成。单步方法是非生产Enclave应用程序的默认签名方法,它是使用Intel
    SGX项目Debug和prerelease概要文件创建的。

  • 使用一个外部签名工具的“两步”方法:
    1.步骤一:在Enclave构建过程的结尾,签名工具产生Enclave签名材料。ISV也许也通过一个VS插件中可选择的选项产生Enclave签名材料。
    ISV将Enclave签名材料文件放到一个存储私钥的外部签名平台,签名这个签名材料文件,并取结果的签名文件返回到构建平台。
    2.步骤二:ISV从VS插件中选择Second Step Signing选项,以将公钥的散列和签名添加到Enclave的元数据部分。

这个“两步”签名过程保护再单独的设施中的签名密钥。因此,这是Intel SGX release配置文件项目的默认签名方法。这意味着它是对生产Enclave应用程序进行签名的唯一方法。

文件格式

有几个文件具有不同的格式,后面是不同的选项。文件格式细节如下所示。
表5 签名工具文件格式

文件格式描述
Enclave文件DLL一个标准的DLL
已签名Enclave文件DLLsgx_sign生成这个已签名的Enclave文件,它包含签名到Enclave文件中
配置文件XML在Enclave配置文件中有描述(在很后面)
密钥文件PEM密钥文件应该遵循包含未加密的RSA 3072位密钥的PEM格式。公共指数必须是3.
Enclave hex文件RAW要用私有RSA密钥签名的Enclave签名材料数据的转储文件
签名文件RAW在ISV签名工具中产生的签名的转储文件。签名应该遵循RSA-PKCS1.5填充方案,且使用带有SHA-256消息摘要的RSA方案的v1.5版本生成
元数据文件RAW包含已签名Enclave的SIGStruct元数据的转储文件。此文件是在请求Intel将一个生产Enclave列入白名单时提交的

签名密钥文件

Enclave签名工具只接受未加密的PEM格式文件。当第一次创建Enclave项目时,你必须选择一个已经存在的签名密钥或者自动产生一个密钥给你。当你选择输入一个提前存在的密钥时,确保密钥是未加密的PEM格式。如果不是这样,要先把签名密钥转换成签名工具所接受的格式(PEM格式)。例如,以下命令将PKCS#8/DER格式的加密私钥转换成未加密的PEM格式:

openssl pkcs8 –inform DER –in private_pkcs8.der –outform PEM –out private_pkcs1.pem

根据操作系统的不同,openssl工具可能已经安装,也可能随Intel SGX SDK一起发布。

Enclave 签名者使用示例

下列是使用“一步”和“两步”签名方法的典型示例。当私有签名密钥在构建平台上可用时,您可以按照“一步”签名过程对您的Enclave进行签名。然而,当私钥只能在隔离的签名设施中访问时,必须遵循下面所描述的“两步”签名过程。

  • “一步”签名过程:
    在构建系统上用一个私钥签名一个Enclave:
sgx_sign sign -enclave enclave.dll -config config.xml -out enclave_signed.dll -key private.pem

我看了一下SGX中的SampleEnclave这个例子,生成后事件中的命令行中,有签署Enclave的命令行,使用的是“一步”签名。

  • “两步”签名过程:
    使用存储在HSM中的私钥对一个Enclave进行签名:

1.生成Enclave签名材料:

sgx_sign gendata -enclave enclave.dll -config
config.xml -out enclave_sig.dat

2.在签名工具中,签署包含Enclave签名材料的文件(enclave_sig.dat),并取出结果签署文件(signature.dat)回构建平台。
3.使用签名文件和公钥签署Encalve:

sgx_sign catsig -enclave enclave.dll -config config.xml -out enclave_signed.dll -key public.pem -sig signature.dat -unsigned enclave_sig.dat

配置文件config.xml是可选择的。如果你不提供一个配置文件,签名工具会使用默认的配置值。
下面的示例演示如何为已签名的Enclave元数据信息的报告:

sgx_sign dump -enclave enclave_signed.dll -dumpfile metadata_info.txt

以下是根据自己的文件所写的命令行:

"$(SGXSDKInstallPath)bin\win32\release\sgx_sign.exe" sign -key "Enclave1_private.pem" -enclave "$(OutDir)Enclave1.dll" -out "$(OutDir)Enclave1.signed.dll" -config "Enclave1.config.xml"
"$(SGXSDKInstallPath)bin\win32\release\sgx_sign.exe" dump -enclave "$(OutDir)Enclave1.dll" -dumpfile "$(OutDir)metadata_info.txt"

Intel SGX SDK提供的工具可以操作32位和64位的Enclave哦。

OpenSSL示例

下列命令行是 使用OpenSSL的典型示例:
1.生成一个3072位的RSA私钥。用3作为公共指数值。

openssl genrsa -out private_key.pem -3 3072

我是自己下载了openssl,直接进入到openssl文件夹运行openssl,来生成private_key.pem。
openssl.exe genrsa -out E:\privatekey\private_key.pem -3 3072

2.生成私有RSA密钥的公共部分。

openssl rsa -in private_key.pem -pubout -out public_key.pem

我自己的:
openssl.exe rsa -in E:\privatekey\private_key.pem -pubout -out E:\privatekey\public_key.pem

3.签署包含Enclave签名材料的文件

openssl dgst -sha256 -out signature.dat -sign private_key.pem -keyform PEM enclave_sig.dat

我自己的:
openssl dgst -sha256 -out D:\HelloWorld\Project1\Simulation\signature.dat -sign E:\ppkey\private_key.pem -keyform PEM D:\HelloWorld\Project1\Simulation\Enclave1_sig.dat
中途我把密钥的文件名改成了ppkey

!!!!!!!!!!!!!!!!!!!!
两步签名:
1.通过openssl产生RSA公私密钥
2.根据两步签名步骤,即可完成。

这是搞了很久的两步签名法!!!!我真的没有天赋,搞了这么久才搞出来…

"$(SGXSDKInstallPath)bin\win32\release\sgx_sign.exe" gendata -enclave  "$(OutDir)Enclave1.dll"  -config "Enclave1.config.xml" -out "$(OutDir)Enclave1_sig.dat" //Enclave命令行,生成Enclave签名材料
openssl.exe genrsa -out E:\privatekey\private_key.pem -3 3072 //本地cmd,生成RSA私钥
openssl.exe rsa -in E:\privatekey\private_key.pem -pubout -out E:\privatekey\public_key.pem //本地cmd,生成RSA公钥
openssl dgst -sha256 -out D:\HelloWorld\Project1\Simulation\signature.dat -sign E:\ppkey\private_key.pem -keyform PEM  D:\HelloWorld\Project1\Simulation\Enclave1_sig.dat //本地cmd,根据生成的签名材料生成signature.dat文件返回到构建平台
"$(SGXSDKInstallPath)bin\win32\release\sgx_sign.exe" catsig -enclave "$(OutDir)Enclave1.dll" -config "Enclave1.config.xml" -out "$(OutDir)enclave1_signed.dll" -key "E:\ppkey\public_key.pem" -sig "$(OutDir)signature.dat" -unsigned "$(OutDir)Enclave1_sig.dat"  //Enclave命令行,用签名文件和公钥签署Enclave

如有误,请指正!感激!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值