tpm2-tss-engine/README.md
wangyoukang e3456407d6 tpm2-tss-engine:add README.md file
Signed-off-by: wangyoukang <wangyoukang@xfusion.com>
2023-05-13 16:12:43 +08:00

5.7 KiB
Raw Blame History

tpm2-tss-engine

介绍

这个tpm2-tss-engine工程为openssl实现对于可信平台模块TPM2.0)引擎加密,调用满足TCG规则的tss协议栈. 它使用 TSS 2.0 的增强型系统 API ESAPI 接口进行向下通信。它支持 RSA 解密和签名以及 ECDSA 签名. 如果你想找到遵循OpenSSL3.0提供的API,而不是引擎的API请转到这个项目tpm2-openssl(https://github.com/tpm2-software/tpm2-openssl).

操作

密钥层级

此引擎使用的密钥都位于 ECC 受限的主存储解密密钥下,此密钥在每次调用时创建 (因为 ECC 密钥创建速度比 RSA 快因此无需预先部署持久SRK密钥。

假定存储层次结构(所有者密码)的授权值是清楚的(长度为零)。 如果不是这种情况,则需要使用引擎 ctrl 进行设置

密钥类型

创建 RSA 密钥时具有签名和解密功能,这允许所有 RSA 密钥用于任一操作. 注意TPM 的 RSA 签名操作将使用所用哈希算法的 ASN.1 编码标识符强制标记有效负载. 这与OpelSSL的RSA接口结构不兼容。因此TPM2_RSA_Decrypt方法也用于签名操作 这也需要为此密钥激活解密功能。

ECDSA 密钥被创建为具有执行签名操作能力的 ECDSA 密钥 #编译和安装指令 编译和安装tpm2-tss-engine是可用的指令在 INSTALL文件中。

使用

为了更多的测试用力,请考虑tests/*.sh集成测试 For additional usage examples, please consider the integration tests under tests/*.sh.

查看引擎信息

可以使用检索引擎信息

openssl engine -t -c tpm2tss

生成随机数

检索使用一组10个随机数

openssl rand -engine tpm2tss -hex 10
engine "tpm2tss" set.
WARNING:esys:src/tss2-esys/esys_tcti_default.c:137:tcti_from_file() Could not load TCTI file: libtss2-tcti-default.so
WARNING:esys:src/tss2-esys/esys_tcti_default.c:137:tcti_from_file() Could not load TCTI file: libtss2-tcti-tabrmd.so
40ac9191079e490d17b7
WARNING:esys:src/tss2-esys/esys_tcti_default.c:137:tcti_from_file() Could not load TCTI file: libtss2-tcti-default.so
WARNING:esys:src/tss2-esys/esys_tcti_default.c:137:tcti_from_file() Could not load TCTI file: libtss2-tcti-tabrmd.so

注意这些警告源于tpm2-tss库且不是问题只要之后由不同的tcti建立了TPM链接。

RSA操作

RSA加密

以下命令序列使用 TPM 创建 RSA 密钥,导出 公钥,加密数据文件并使用 TPM 解密:

tpm2tss-genkey -a rsa -s 2048 mykey
openssl rsa -engine tpm2tss -inform engine -in mykey -pubout -outform pem -out mykey.pub
openssl pkeyutl -pubin -inkey mykey.pub -in mydata -encrypt -out mycipher
openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -decrypt -in mycipher -out mydata

或者,可以使用 TPM 密钥直接加密数据:

openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -encrypt -in mydata -out mycipher

RSA 签名

以下命令序列使用 TPM 创建 RSA 密钥,导出 公钥,使用 TPM 签署数据文件并验证签名:

openssl rsa -engine tpm2tss -inform engine -in mykey -pubout -outform pem -out mykey.pub
openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -sign -in mydata -out mysig
openssl pkeyutl -pubin -inkey mykey.pub -verify -in mydata -sigfile mysig

可选的,可以直接使用验证数据 openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -verify -in mydata -sigfile mysig 注意:'mydata'一定不能超过RSA密钥的大小因为这些操作没有对数据执行任何的哈希

ECDSA 操作

以下命令序列使用 TPM 创建 ECDSA 密钥,符号 使用 TPM 并验证签名的数据文件:

tpm2tss-genkey -a ecdsa mykey
openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -sign -in mydata -out mysig
openssl pkeyutl -engine tpm2tss -keyform engine -inkey mykey -verify -in mydata -sigfile mysig

导出公钥使用:

openssl ec -engine tpm2tss -inform engine -in mykey -pubout -outform pem -out mykey.pub

自签名证书生成操作

以下命令序列使用 TPM 密钥创建自签名证书。Openssl 命令将 tpm2tss 设置为引擎, 并根据提供的 CSR 配置信息生成自签名证书。

$ tpm2tss-genkey -a rsa rsa.tss
$ openssl req -new -x509 -engine tpm2tss -key rsa.tss  -keyform engine -out rsa.crt

使用受限密钥签名

可以使用受限制的 ECDSA 密钥进行签名,但需要注意的是, TPM 必须用于摘要,因此必须改用更高级别的摘要和签名操作,例如:

$ openssl dgst -engine tpm2tss -keyform engine -sha256 -sign ${HANDLE} -out mysig mydata.txt

其中$ {handle}是由外部工具创建的限制密钥的tpm持久句柄ID 因为tpm2tss-genkey不支持创建受限密钥

TLS和s_server

该引擎可用于使用OpenSSL创建TLS的所有地方 安全通道连接。您可以指定命令

./tpm2tss-genkey -a rsa rsa.tss
openssl req -new -x509 -engine tpm2tss -key rsa.tss  -keyform engine  -out rsa.crt
openssl s_server -cert rsa.crt -key rsa.tss -keyform engine -engine tpm2tss -accept 8443

但是对于ECDSA密钥需要指定哈希算法因为TPM不支持SHA512。您可以普遍列入SHA512. 通过openssl.cnf可以做到这一点。请参阅此页面上的“ signaturealgorithms”配置文件命令 https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html

注意仅在OpenSSL 1.1.0和新版本上支持使用HSM保护的私钥的S_Server使用

开发前缀

为了在没有“make install”的情况下使用这个引擎进行测试调用

export LD_LIBRAY_PATH=${TPM2TSS}/src/tss2-{tcti,mu,sys,esys}/.libs
export PKG_CONFIG_PATH=$PWD/../tpm2-tss/lib
./bootstrap
./configure \
    CFLAGS="-I$PWD/../tpm2-tss/include" \
    LDFLAGS="-L$PWD/../tpm2-tss/src/tss2-{esys,sys,mu,tcti}/.libs"
make
make check