Vmware Fusion TPM安装过程

安装环境

  • 虚拟机软件:Vmware Fusion版本–11.5.6
  • 系统镜像:Ubuntu-20.04.1-desktop-amd64

安装过程

首先需要准备一个虚拟机,这里省略虚拟机的安装过程。安装好后进入虚拟机设置界面。

这里特别说明,Vmware安装TPM芯片必须要使用UEFI作为启动固件,而不能使用传统的BIOS固件。所以选择高级(Advanced) - 固件类型(Firmware type) - UEFI。

然后再将TPM芯片所需的磁盘加密启用。选择“Encryption & Restrictions”,选中启用加密,接着输入加密所需的口令,最后等待加密完成。

此时已经完成了TPM安装所需的前置条件,可以在添加设备中选择添加TPM(Trusted Platform Module)芯片。即可看到,目前TPM芯片已经成功添加到虚拟机中,启动虚拟机可使用。

开机测试

首先使用命令dmesg | grep -i tpm ,查看当前虚拟机内使用的TPM版本。可以看到我的虚拟机使用的TPM芯片版本是2.0。因此使用诸如trousers、tpm-tools之类的工具会发生错误,这些工具仅支持TPM 1.2。

Intel 实现

对于TPM2.0则需要安装其支持的一些工具。tpm2-software项目共包含四个项目:

  • tpm2-tools:为用户提供使用TPM资源的相关命令
  • tpm2-tss:这一个项目TPM 协议栈部分,一共分为两层,一为上层开发者提供和封装统一的调用接口,二为上层提供了访问底层硬件资源接口
  • tpm2-abrmd:tm2-abrmd是一个后台进程,主要做TPM硬件资源管理.比如:当我们上层应用加载key的时候,不需要关心,TPM中是否还有空闲的key slot,因为tpm2-abrmd后台进程会帮助我们做,如果TPM中key slot不够用,那么就会把不用key交换出来,然后供当前访问的进程使用
  • tpm2-tss-engine:这个是一个加密相关的engine,需要配合openssl使用

各组件相关关系如下:

注意:tss2和tpm2-tools无关。

tss2是ibm实现,其软件仓库为https://sourceforge.net/projects/ibmtpm20tss/。

而tpm2-tools是intel实现,其软件仓库为https://github.com/tpm2-software/tpm2-tools。

tpm2-tools所对应的tpm2-tss的软件仓库为https://gitub.com/tpm2-software/tpm2-tss。

tpm2-tools相关命令如下:

tss2不仅包含TCG软件栈,也包含相关的工具如下:

注:如果不像完整软件栈,仅想体验用户态工具tpm2-tools的一些功能,那么在Ubuntu中直接使用apt install tpm2-tools安装即可使用。

至此TPM芯片以及相关工具的安装已经完成,下文将简述一些tpm2-tools的功能测试。如果需要进一步了解TPM2.0的远程证明,参考官方教程Remote Attestation With Tpm2 Tools

pcrread测试

工具安装完成后,使用tpm2_pcrread sha1:0,1,2+sha256:0,1,2命令来查看0、1、2号PCR在sha1和sha256下的值。

seal测试

1.

1
tpm2_createprimary -c primary.ctx

用该命令来创建一个主对象保存到文件primary.ctx中,该主对象的默认层级为TPM_RH_OWNER

2.

1
tpm2_pcrread -o pcr.bin sha256:0,1,2,3

读取sha256 bank下的0-3四个PCR寄存器的值,并保存到pcr.bin文件中。

3.

1
tpm2_createpolicy --policy-pcr -l sha256:0,1,2,3 -f pcr.bin -L pcr.policy

基于跨多个bank的多PCR索引值,创建简单的断言授权策略。

4.

1
echo 'secret' | tpm2_create -C primary.ctx -L pcr.policy -i- -u seal.pub -r seal.priv -c seal.ctx

使用tpm2_create创建一个key或sealing的子对象。此外,sealing对象允许seal最大128字节的用户数据到tpm。这条命令的作用就是利用echo将用户数据输出到stdin,然后通过tpm2_create的-i参数指定seal的输入为-(代表stdin)。


此时可能会出现如下错误。这个错误发生的原因是,某些TPM不支持CreateLoaded命令。在tpm2-tools中实现的tpm2_create命令中-c参数调用CreateLoaded,因此出现了问题。该问题的相关信息可以参考tpm2_unseal #2181

1
2
3
4
WARNING:esys:src/tss2-esys/api/Esys_CreateLoaded.c:359:Esys_CreateLoaded_Finish() Received TPM Error 
ERROR:esys:src/tss2-esys/api/Esys_CreateLoaded.c:129:Esys_CreateLoaded() Esys Finish ErrorCode (0x000b0143)
ERROR: Esys_CreateLoaded(0xB0143) - rmt:error(2.0): command code not supported
ERROR: Unable to run tpm2_create

可以使用tpm2_getcap commands | grep TPM2\_CC\_Create 命令来检查TPM是否支持。(注:getcap命令所查询的是TPM芯片所支持的命令,而非Linux终端中使用的用户命令)

如上图输出所示,本机的TPM支持的Create相关的命令仅有TPM2_CC_CreatePrimaryTPM2_CC_Create

处理方式:使用createload两个命令来模拟createloaded命令。借助create创建公私钥,再用load加载并输出子对象的上下文。

1
2
echo 'secret' | tpm2_create -C primary.ctx -L pcr.policy -i- -u seal.pub -r seal.priv
tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx

5.

1
tpm2_unseal -c seal.ctx -p pcr:sha256:0,1,2,3

调用该命令解封数据,得到了之前seal的用户数据“secret”。

如果使用了错误或者发生了变化的PCR寄存器,则会出现如下错误:

  1. 重启计算机,再次执行步骤5,确认seal的数据是否丢失。

    这里发生了错误。该seal-unseal重启后产生的问题,在网上有较多的讨论,可以参见参考资料[10]。

    1
    2
    3
    4
    5
    WARNING:esys:src/tss2-esys/api/Esys_ContextLoad.c:279:Esys_ContextLoad_Finish() Received TPM Error 
    ERROR:esys:src/tss2-esys/api/Esys_ContextLoad.c:93:Esys_ContextLoad() Esys Finish ErrorCode (0x000001df)
    ERROR: Esys_ContextLoad(0x1DF) - tpm:parameter(1):integrity check failed
    ERROR: Invalid item handle authorization
    ERROR: Unable to run tpm2_unseal

    处理方式:使用createprimary创建的primary对象是临时的,因此在unseal之前需要重建primary对象,并将其加载到TPM芯片中。之后再调用unseal成功获取了的用户数据。

    1
    2
    3
    tpm2_createprimary -c primary.ctx
    tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx
    tpm2_unseal -c seal.ctx -p pcr:sha256:0,1,2,3

IBM 实现(可选)

IBM实现是基于软件TPM的,它共包含三个部分:ibmswtpm2ibmtpm20tssibmtpm20acs。此外它还需要安装一个Openssl的引擎openssl_tpm2_engine

ibmtpm20tss需要ibmswtpm2的存在,其tss提供的工具均需要通过一个2321端口(ibm软件TPM守护进程的默认端口)来访问信息。

(未测试)

参考资料

[1] TPM2 Linux社区教程

[2] Create a Virtual Trusted Platform Module Device

[3] tpm2.0-tools命令变化日志

[4] tpm2.0-tools命令查询

[5] https://www.mankier.com/1/tpm2_unseal

[6] https://www.mankier.com/1/tpm2_createprimary

[7] https://www.mankier.com/1/tpm2_createpolicy

[8] https://www.mankier.com/1/tpm2_load

[9] https://github.com/tpm2-software/tpm2-tools/issues/2181

[10] https://github.com/tpm2-software/tpm2-tools/issues/1884

[11] tpm2-tools seal-unseal data after reboot

[12] tss2 vs tpm2-tss

[13] TPM模拟器和TPM2-TSS安装

[14] tpm模拟器与新版tpm2-tss\abrmd\tools安装

[15] TPM 协议栈和工具介绍

Author

Chaos Chen

Posted on

2020-11-24

Updated on

2023-06-30

Licensed under

Commentaires