将私钥保存在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 ; 使用已有的私钥
|