@Intel SGX 读书笔记…
Intel SGX SDK提供以下工具:
该工具在构建Enclave的过程中,自动通过读取用户提供的EDL文件产生边缘例程,这些边缘例程定义了不可信应用程序和Enclave之间的接口。而高级的Enclave开发大牛,可以自己修改Edger8r。
例如给出的EDL文件是demo.edl,Edger8r Tool工具会默认产生以下文件:
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,以确保该工具的完整性,从而不会损害生成的代码。
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签名结构
模块 | 名字 |
Header | HEADERTYPE |
HEADERLEN | |
HEADERVERSION | |
TYPE | |
MODVENDOR | |
DATE | |
SIZE | |
KEYSIZE | |
MODULUSSIZE | |
ENPONENTSIZE | |
SWDEFINED | |
RESERVED | |
Signature | MODULUS |
EXPONENT | |
SIGNATURE | |
Body | MISCSELECT |
MISCMASK | |
RESERVED | |
ISVFAMILYID | |
ATTRIBUTES | |
ATTRIBUTEMASK | |
ENCLAVEHASH | |
ISVEXTPTODID | |
ISVPRODID | |
ISVSVN | |
Buffer | RESERVED |
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 |
明确对Enclave进行签名或者已经签名。它是这四个命令的必要参数 | |
—config |
指定Enclave配置文件。它是dump命令的无效参数,是其他三个命令的可选参数。 | |
—out |
指定输出文件。以下三个命令都需要它。 | |
命令 | 描述 | |
sign | 已签名的Enclave文件 | |
gendata | 包含Enclave签名材料的文件 | |
catsig | 已签名的Enclave文件 | |
—key |
指定签名密钥文件。具体查看文件格式 | |
命令 | 描述 | |
sign | 私钥 | |
gendata | 不适用 | |
catsig | 公钥 | |
—sig |
指定与enclave签名材料相应的包含签名的文件。只对catsig命令有效 | |
—unsigned |
指定通过gendata命令产生的包含Enclave签名材料的文件。只对catsig命令有效 | |
—dumpfile | 指定一个文件来转储元数据信息。它是dump命令的必需参数,是sign和catsig的可选参数 | |
—cssfile | 指定一个文件来转储SIGSTRUCT信息。它是sign,catsig和dump命令的可选参数 | |
—resign | 默认情况下,如果一个输入Enclave已经被签名了,sig_sign就会报告错误。你可以通过提供的选项重新签名该Enclave | |
—version | 打印版本信息并退出 | |
—help | 打印帮助信息并退出 |
一个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文件 | DLL | sgx_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进行签名。然而,当私钥只能在隔离的签名设施中访问时,必须遵循下面所描述的“两步”签名过程。
sgx_sign sign -enclave enclave.dll -config config.xml -out enclave_signed.dll -key private.pem
我看了一下SGX中的SampleEnclave这个例子,生成后事件中的命令行中,有签署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的典型示例:
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
如有误,请指正!感激!