Workbench on Elysium

「Nice try.」

Windows TPM Backed Key

Apache553's Avatar 2023-08-16 折腾记录

将私钥保存在TPM中可以有效地增强密钥的安全性,记录一下在Windows上创建存储在TPM中的密钥的方法。

创建新密钥

要在Windows上生成存储在本地TPM中的密钥,需要使用certreq.exe来达成目的。

创建如下所示的req.inf文件,作为对密钥的描述并稍后在生成过程中使用。

1
2
3
4
5
6
7
8
9
10
11
12
[NewRequest]
Subject = "CN=DarkFlameMaster,OU=Secondary,O=ApacheNet,C=CN" ; Subject 不用多说
Keylength = 2048 ; 密钥长度,TPM可能支持更长的
KeyContainer = MyPrivateKey ; 密钥容器名,注释这一整行来让系统自动生成。为了方便,我为他指定了一个名字
Exportable = FALSE ; 必须为FALSE——TPM中的密钥不可导出
MachineKeySet = FALSE ; 设置密钥是否是属于本计算机的,设置为FALSE表示密钥只对当前用户可用
ProviderName = "Microsoft Platform Crypto Provider" ; 设置CSP为TPM
RequestType = PKCS10 ; 指定生成的CSR的格式
UserProtected = TRUE ; 指示在使用私钥时弹出对话框向用户确认,TRUE表示需要确认
KeyUsage = 0xB0 ; CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_KEY_ENCIPHERMENT_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE
FriendlyName = "DarkFlameMaster" ; 友好名称
UseExistingKeySet = FALSE ; 创建一个新的密钥,在使用已有密钥创建CSR时,需要修改此项

运行certreq.exe -new req.inf certificate.csr。系统会弹出一个窗口,允许你输入密码,没有问题的话,就会生成出相应的CSR允许你拿去签发证书了。值得注意的是,签发下来的证书请使用PEM格式(后缀为crt)导入,否则会找不到对应的私钥。

要检查当前系统级别的存放在TPM中的密钥,执行:

1
certutil.exe -csp "Microsoft Platform Crypto Provider" -key

要查看当前用户存放在TPM中的密钥,执行:

1
certutil.exe -user -csp "Microsoft Platform Crypto Provider" -key

使用已有密钥

要使用已有密钥创建CSR,需要对上面提到的req.inf进行一些改动。

1
2
3
4
5
6
7
8
9
10
11
12
[NewRequest]
Subject = "CN=DarkFlameMaster,OU=Secondary,O=ApacheNet,C=CN"
Keylength = 2048
KeyContainer = MyPrivateKey ; 密钥容器名,需要已经存在
; Exportable = FALSE ; 此行需要注释或删除
MachineKeySet = FALSE
ProviderName = "Microsoft Platform Crypto Provider"
RequestType = PKCS10
; UserProtected = TRUE ; 此行要删除或注释掉
KeyUsage = 0xB0 ; CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_KEY_ENCIPHERMENT_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE
FriendlyName = "DarkFlameMaster"
UseExistingKeySet = TRUE ; 使用已有的私钥
本文最后更新于 天前,文中所描述的信息可能已发生改变