前言
本文主要講述的是如果從TPM 裏面生成的非對稱的Key想要獲取第三方證書頒發者(credential provider)請求證書的流程, 還有獲取證書後是如何保存到TPM的? 如上的過程我們通常稱爲Activating a Credential in the TPM.
對於TPM而言,它並不關心credential的格式, 不過一般情況下都是X.509格式certificate。
該激活證書的流程可以幫助實現如下的2個目標:
- credential provider可以確保需要認證的key的一些屬性(例如:signing/decryption)。
- TPM密鑰簽名的接收者無法確定多個密鑰駐留在同一TPM上。(因爲EK只在Credential 激活的階段纔會被使用到)
改流程可以簡單的理解爲:
CA爲該pub key頒發了一個證書,該證書被TPM的初始密鑰的public key(Endorsement Key)進行了加密, 只有在TPM裏面使用對應的private key纔可以解開。
當然,實際情況比較複雜,詳細的步驟我們接下來會具體分析:
激活證書的流程
Credential Provider需要做的工作
步驟一: CA收到了一個爲Kpub頒發證書的請求,該請求包含來自TPM的公鑰Kpub, 和其TPM的EK(Endorsement Key)的證書 (該證書由product vendor頒發)
步驟二: CA首先會驗證EK的證書是否合法, 改過程會使用到vendor的根證書,由次確保EK的確是存在於對應的TPM上的。
步驟三/四: CA檢測想要請求證書的Kpub的屬性,確保是否符合要求,完成檢查之後,會給它頒發證書Cert_Kpub
步驟五: CA生成一個Secret, 用來加密步驟三中生成的Cert_Kpub。
步驟六/七: CA會再生成一個Seed, 這個Seed會被EK cert中的public key進行加密, 而Seed本身會和key name一起做KDF算法生成一個對稱的密鑰SK,和一個HAMC key。
步驟八: 使用上一步的SK對Secret進行加密, HAMC key來保證Cert_Kpub的完整性, 然後這樣我們就會得到如下三個object,作爲參數TPM_import到TPM裏面:
a. Cert_Kpub被Secret進行加密
b. Secret被從Seed派生出來的SK進行加密
c. Seed被EK cert中的公鑰進行了加密
TPM需要做的工作
步驟一: TPM使用EK的私鑰private key(一般存儲在TPM的reserved的一個storage裏面)把Seed進行解密。
步驟二/三: 使用同樣的KDF算法,把Seed和keyname作爲參數,派生出SK和HAMC key。
步驟四: 使用SK對Secret進行解密, HAMC key進行cert_kpub的完整性檢查。
步驟五: 獲得解密後的secret後, 用它對cert_kpub進行解密, 然後就得到了明文的CA給Kpub頒發的證書Cert_Kpub
步驟六: TPM會把該明文的Cert_Kpub存儲到之前reserved的NVIndex中
注意: TPM中的IDevID key(Initial device identity Key)和AIK key(attestation identity key)的provision過程基本都是使用如上的流程。
參考文檔:
TPM2.0_Practical_Guide.pdf
https://pan.baidu.com/s/11enEtANxgrENcQCZdSu5Cg (提取碼:3rka)