01
前言
本文是上文 《STM32H5 DA 之初體驗(帶 TrustZone)》的后續之作。倘若你還沒有閱讀此文,那么建議你先閱讀下,然后再回過頭來閱讀本文。
之前我們已經講過了如何通過 DA 認證來回退芯片產品狀態,或者重新打開調試口,這樣開發人員在芯片為 Closed 狀態下時仍可以調試芯片。在這個 DA 認證過程中,有使用到兩個東西:證書和私鑰,它與之前已經預配置到芯片內部的 obk 文件是對應的關系。也就是說, 如果你已經預配置了芯片, 但對應的私鑰文件或者證書丟失或忘記保存了, 那么此芯片多半是無法再還原了, 除非你找到對應的私鑰和證書。
私鑰是如何來的 ? 如上文所述, 是通過 TPC 工具生成的, 如下所示 :
點擊上圖中的 Regenerate 按鍵將自動生成公鑰私鑰對。
當然你也可以使用其它工具來生成, 比如 openssl 工具, 只要是 ecdsa-p256 類型的密鑰即可。
證書是怎么來的 ? 也是通過 TPC 工具生成的。
如上圖所示, 輸入根密鑰的私鑰和公鑰, 證書類型選擇為 “ROOT”, 然后在操作許可內選擇所有權限(完全回退/半回退 + 安全調試 + 非安全調試).最終點擊 “Generate Certificate”按鍵,生成根證書. 由于這里選擇的類型為 ROOT, 輸入的密鑰也為根密鑰. 所以最終生成的證書為根證書. 它所許可的權限是最高的。
對于一個產品的開發, 可能由不同團隊一起合作開發的, 比如, 有一團隊, 專門負責開發 secure部分的代碼, 向 non secure 工程提供 API 接口, 將那些關鍵算法放入到 secure 世界加以保護, 僅僅面向 non secure 工程開放調用接口. 而另一個開發團隊, 他們僅僅開發 non secure 部分的代碼, 實現應用層大部分功能, 需要時調用 secure 部分代碼開放出來的接口以實現特定的功能. 那么對于這種不同的開發團隊, 其所允許的權限必須有所不同, 開發 secure 部分的團隊, 必然希望他們自己能調試 secure 部分的代碼, 但不希望開發 non secure 部分的開發團隊也可以調試 secure代碼. 但又要允許不影響他們可以調試自己 non secure 部分的代碼, 且可隨意回退 non secure部分代碼. 如此復雜的權限控制, 就需要多個證書來實現了. 這就是證書鏈的意義所在。
02
證書鏈介紹
在產品的開發過程中, 我們假設有三個團隊:
? 安全開發團隊: 負責開發 secure 部分代碼, 并向 non secure 提供 API 接口. 當芯片燒錄完 secure 代碼后, 芯片會被設置為 TZ_Closed 狀態。
? OEM 開發團隊: 負責開發 non secure 部分代碼, 無法直接訪問 secure 世界的代碼,但能調用 secure 提供的特定的 API 接口, 以完成特定功能. 此團隊拿到芯片時, 芯片已經處于 TZ_Closed 狀態. 在此狀態下, 開發 non secure 工程不受任何限制. 可以隨意調試 NS 工程。
? 現場技術支持團隊: 產品到達終端客戶, 若出現任何問題, 需要現場進行技術支持。
對于這三個團隊, 需要授予不同的權限. 安全開發團隊需要授予平臺軟硬件完全訪問的權限. 且安全開發團隊可向 OEM 團隊授予權限. 完全訪問權限就包括了可完全回退+部分回退, S+NS 調試。
OEM 開發團隊的權限應該僅僅局限在 NS 部分, 不應該影響其 NS 代碼的調試, 當然回退也不應該限制. 僅需要限制其調試 S 代碼的權利. 因此, OEM 團隊包括的權限應該有: 完全回退+部分回退, NS 調試. 除此之外, OEM 開發團隊應可向現場技術支持團隊授予權限的能力。
現場技術支持團隊的權限應該僅限于回退的權利.而且僅能完全回退. 以便檢查硬件方面的問題。
針對這三個團隊的授權情況, 引入三級證書. 根證書, 一級證書和二級證書. 分別對應這三個團隊. 這種操作授權就放入到證書里邊。
如上圖所示, 安全開發團隊使用自己的根證書和根密鑰. OEM 開發團隊使用自己的一級密鑰和一級證書; 而現場技術支持團隊則使用自己的二級密鑰和二級證書. 各自有自己的一套密鑰和證書.這里的密鑰是指私鑰. 那么這些密鑰和證書又是如何來的呢?
2.1. 密鑰和證書
這里的密鑰其實是指私鑰, 它和公鑰是一對的. 也就是說, 三個團隊其實都有自己的密鑰對. 在做 DA 時, 會使用到私鑰和證書. 首先我們來看看這個密鑰對是如何來的呢?
如前文第一章節的前言部分, 我們就介紹了根密鑰對的來源, 它是由 TPC 工具內在不同的路徑下點擊 Regenerate 按鍵后生成的. 那么對于 OEM 開發團隊和現場技術支持團隊的密鑰對, 也是這么生成的. 當然, 也可以通過第三方工具如 openssl 這類的工具生成. 我們將三個團隊的密鑰(指私鑰)分別叫做根密鑰, 一級密鑰, 二級密鑰. 它們是三個相互獨立的密鑰。
2.1.1. 根證書
如上圖所示, 根證書是安全開發團隊自己用私鑰對自己的公鑰以及操作許可簽名產生的. 這個證書授權完全回退, 以及 S 調試+NS 調試。
它的生成正如前文第 1 章節如所描述, 生成的就是根證書。
2.1.2. 一級證書
一級證書是由安全開發團隊負責生成, 但使用方卻是 OEM 開發團隊. 也就是說, 它是由安全開發團隊授權給 OEM 開發團隊的證書。
如上圖所示, 它是拿 OEM 開發團隊的公鑰出來, 用安全開發團隊的私鑰進行簽名所產生, 再加上授權許可. 它是安全開發團隊的根證書的子證書:
2.1.3. 中間證書
中間證書也是一級證書, 它也是由安全團隊的根證書的子證書, 由安全開發團隊授權而來. 與一級證書不同地是, 它只能用來派生二級證書, 并不能直接拿來用, 比如 DA 回退, DA 調試. 它僅僅用來頒發二級證書, 給證書管理者用的。
如上圖所示, 中間證書是拿 OEM 開發團隊的公鑰, 用安全開發團隊的私鑰簽名產生, 再加上操作許可信息. 它是給 OEM 開發團隊用的, 僅僅用于派生二級證書. 它也是安全開發團隊的根證書的子證書。
2.1.4. 二級證書
二級證書是給現場技術支持團隊用的. 它是由中間證書派生而來:
如上圖所示, 在從中間證書派生二級證書時, 拿二級公鑰出來, 用一級私鑰進行簽名的, 再加上操作許可信息. 二級證書生成過程完全是由 OEM 開發團隊負責的. 這里需要注意地是, 二級證書是由中間證書派生而來, 并不是由一級證書派生。
STM32H5 支持這三級證書: 根證書, 一級證書, 中間證書和二級證書, 其相互關系如下圖所示:
03
動手實驗
3.1. 實驗概覽
本實驗將分別扮演安全開發團隊, OEM 開發團隊和現場技術開發團隊, 分別生成根證書, 一級證書, 中間證書和二級證書, 并驗證此證書的有效性。
3.2. 安全開發團隊
安全開發團隊有以下幾個任務 :
? 預配置 OBKey+芯片操作許可.
? 生成根證書
? 為 OEM 開發團隊生成一級證書
? 為 OEM 開發團隊生成中間證書
3.2.1. 預配置 OBKey+芯片操作許可
此過程與《STM32H5 DA 之初體驗(帶 TrustZone)》的 3.2 節+3.4 節完全一致。這里不再贅述。
3.2.2. 生成根證書
此過程與《STM32H5 DA 之初體驗(帶 TrustZone)》的 3.3 節完全一致。這里不再贅述。
3.2.3. 測試根證書的有效性
此過程與《STM32H5 DA 之初體驗(帶 TrustZone)》的第 4 章完全一致。這里不再贅述。
3.2.4. 為 OEM 開發團隊生成一級證書
為 OEM 開發團隊生成一級證書首先得拿到 OEM 開發團隊的公鑰. 關于 OEM 開發團隊如何生成自己的公鑰私鑰對, 請參考 3.3.1 節。
如上圖所示, 在 Certificate Role 處選擇 LEAF, 在 Issuer Private Key 處輸入根密鑰:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_1_root.pem, 用它來給證書簽名。
在 Leaf Public Key 處輸入 OEM 開發團隊的一級公鑰:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_2_intermediate_pub.pem
在 Settings 下設置開放給 OEM 開發團隊的操作許可, 因為 OEM 開發團隊僅僅形式發 NS工程, 所以這里開放完全回退+半回退, +NS Debug 權限。
然后在右側 Input certificate for chaining 處輸入根證書:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b64
在 Certificate file 出輸入需要生成的證書路徑及文件名:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/level1_cert_leaf.b64
最后點擊 Generate Certificate 按鍵生成一級證書:
其中 level1_cert_leaf_chain.b64 為一級證書文件, 可發給 OEM 開發團隊用作 NS 工程調試和完全回退+半回退。
3.2.5. 為 OEM 開發團隊生成中間證書
安全開發團隊還需要給 OEM 開發團隊生成中間證書, 此證書是專門用來給下一級授權的, 即生成二級證書用的。
如上圖所示, 在 Certificate Role 處選擇 INTERMEDIATE, 在 Issuer Private Key 處, 輸出根密鑰 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_1_root.pem, 用它給證書簽名。
在Intermediate Public Key 處, 輸入 OEM 開發團隊的公鑰 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_2_intermediate_pub.pem
在下方 Settings 處, 我們僅僅選擇 Full, 即僅僅開放完全回退權限. 這是由于此中間證書只是給 OEM 開發團隊生成下一級證書, 即給現場技術支持團隊用的, 它僅僅需要完全回退權限即可。
在右側 Input certificate for chaining 處輸入根證書 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/cert_root.b64
在 Certificate file 處輸入生成的證書的路徑及文件名 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/level1_cert_intermediate.b64
最后點擊 Generate Certificate 按鍵生成中間證書 :
其中 level1_cert_intermediate_chain.b64 可發給 OEM 開發團隊. 給他們生成下級證書用。
3.3. OEM 開發團隊
OEM 開發團隊主要是開發 NS 工程的團隊, 因此, 需要調試 NS 工程, 需要能回退到 TZClosed 的權限, 當然完全回退權限也需要. 這些權限應該包含在其對應的一級證書內. 在生成OEM 開發團隊自己的證書之前, OEM 開發團隊首先得擁有一套自己的公鑰私鑰對。
3.3.1. 生成自己的公鑰私鑰對
如上圖所示, 用 TPC 打開 xml 文件 :
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Config/DA_Config.xml
然后在 Debug Authentication root key 下, 點擊 open, 打開C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_2_intermediate.pem 這個一級密鑰文件. 然后點擊regenerate 按鍵, 重新生成一個密鑰對:
這個密鑰就是 OEM 開發團隊自己的密鑰. 它的公鑰可以發給安全開發團隊, 用來生成一級證書和中間證書(請參考 3.2.4, 3.2.5 節)。
當然, 你也可以使用其它第三方工具, 比如 openssl 來生成自己的公鑰私鑰對, 最終以 pem 文件格式存在。
3.3.2. 測試一級證書的有效性
我們可以先在 provisioning 狀態下測試下完全回退。
如上圖所示, 輸入 OEM 自己的私鑰:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_2_intermediate.pem
同時輸入一級證書:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDACertificateslevel1_cert_leaf_chain.b64
選擇 Full Regression, 然后點擊 Execute 按鍵…
結果為可以完全回退成功。
接下來我們再測試下此證書是否可以調試 NS 工程…
在 Open 狀態下, 我們燒一個測試程序:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIExamplesGPIOGPIO_IOToggle_TrustZone
并修改芯片的選項字節 TZEN=0xB4, SECWM2_STRT=0x7f, SECWM2_END=0x0
燒錄完固件后, 并確保此程序能正常運行(兩個 LED 燈來回閃爍)的情況下, 再切換到provisioning 狀態下做 DA 預配置, 完了之后再切換到 closed 狀態下. 然后我們再嘗試使用STM32CubeIDE 調試 NS 工程。
修改 NS 工程的調試配置…
如上圖所示, 在 Key path 處輸入 OEM 開發團隊的私鑰:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_2_intermediate.pem
在 Certificate path 處輸入一級證書:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDACertificateslevel1_cert_leaf_chain.b64
Permissions 處選擇 Debug Non Secure L1
Reset behavior 處選擇 None。
然后點擊 Debug 按鍵.. 之后在調試工具欄中點擊暫停 ..
如上圖所示, 程序在 NS 工程的 while(1);已經暫停了下來, 這說明使用一級證書調試 NS 工程是 OK 的。
接下來我們嘗試使用一級證書進行局部回退。
如上圖所示,進 STLink 斷開的情況下,點擊 Discovery 后, 輸入 OEM 開發團隊的私鑰:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_2_intermediate.pem
在下面輸入框內輸入一級證書:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDACertificateslevel1_cert_leaf_chain.b64
然后點擊 Continue 按鍵…
如上圖所示, 選擇 Partial Regression, 然后點擊 Execute 按鍵…
如上圖所示, 執行成功, 并且 STLink 仍然保持連接, 此時查看狀態為 TZ-Closed 狀態:
這表明使用此一級證書進行半回退也是 OK 的。
3.3.3. 給現場技術支持團隊生成二級證書
在給現場技術支持團隊生成二級證書之前, 需要先拿到其公鑰(見 3.4.1 節). 然后使 TPC 生成二級證書:
如上圖所示, 在 Certificate Role 處選擇 LEAF, 在 Issuer Private Key 處輸入 OEM 開發團隊的私鑰:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_2_intermediate.pem
在 Leaf Poblic Key 處輸入現場技術支持團隊的公鑰:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Keys/key_3_leaf_pub.pem
然后在 Settings 處選擇給現場技術支持團隊開放的權限. 需要注意地是, 由于中間證書都只有Full Regression 的權限, 這里也就只能授權這個權限, 其它權限即便在這里點開了, 也不會有實際效果。
然后在右側 Input certificate for chaining 處輸入中間證書:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/level1_cert_intermediate_chain.b64
接著在 Certificate file 處輸入需要導出的證書目錄以及文件名:
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/level2_cert_leaf.b64
最后點擊 Generate Certificate 按鍵生成二級證書:
如上圖所示, 生成的 level2_cert_leaf_chain.b64 就是二級證書, 就是需要發給現場技術支持團隊用的。
3.4. 現場技術支持團隊
現場技術支持團隊是負責現場給客戶進行技術支持的, 往往需要將芯片完全回退, 以便檢查硬件是否出現問題. 因此, 需要完全回退的權限. 其證書僅僅需要此權限即可. 在生成對應的二級證書之前, 需要先擁有一對自己的公鑰私鑰對。
3.4.1. 生成自己的公鑰私鑰對
與 3.3.1 節類似, 使用 TPC 自己的公鑰私鑰對。
如上圖所示, 在 XML file 處輸入
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Config/DA_Config.xml
在 Debug Authentication root key 處, 點擊 open 選擇
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_3_leaf.pem
最后點擊 Regenerate 按鍵生成密鑰對:
如上圖, 其中的 key_3_leaf_pub.pem 文件為公鑰, 需要發給 OEM 開發團隊用來生成二級證書(見 3.3.3 節)。
3.4.2. 測試二級證書的有效性
之前我們已經將 NUCLEO-板回退到 TZ-Closed 狀態, 可直接在此狀態下使用二級證書進行完全回退, 以驗證二級證書的有效性。
如上圖所示, 在 STM32CubeProgrammer 中, 在 ST-Link 斷開的情況下, 點擊 Discovery 按鍵, 然后在 key File path 處輸入現場技術支持團隊自己的私鑰:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_3_leaf.pem
在 Certificate File Path 處輸入二級證書:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDACertificateslevel2_cert_leaf_chain.b64
然后點擊 Continue 按鍵…
然后選擇 Full Regression, 最后點擊 Execute 按鍵…
最終完全回退成功。
這就驗證了此二級證書的有效性。
至此, 根證書, 一級證書, 二級證書均已驗證其有效性。
04
其他問題
在生成證書鏈過程中, 有涉及到中間證書, 我們用它來生成二級證書, 原則上中間證書只能用來生成二級證書, 其本身并不會直接使用, 那么這里有一個問題, 直接使用中間證書能有效嗎? 我們不妨來測試下。
4.1. 測試直接使用中間證書
在芯片 provisioning 狀態下, 我們給芯片做好預配置后, 可直接使用中間證書嘗試完全回退。
如上圖, 在 Key File Path 處使用 OEM 開發團隊的私鑰:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDAKeyskey_2_intermediate.pem
然后證書處輸入中間證書:
C:workspaceSTM32Cube_FW_H5_V1.1.0ProjectsNUCLEOH563ZIROT_ProvisioningDACertificateslevel1_cert_intermediate_chain.b64
然后點擊 Continue 按鍵…
然后選擇 Full Regression, 最后點擊 Execute 按鍵…
之前在生成中間證書時, 是給中間證書授權完全 回退的, 接下來看看實際測試結。
如上圖所示, 實際測試結果為失敗. 由此可見, 中間證書確實是不能直接拿來使用的。
4.2. 測試使用一級證書生成二級證書的有效性
之前我們是使用了中間證書來生成二級證書, 如果我們直接使用一級證書生成二級證書, 會怎樣? 這個二級證書是否仍然有效? 我們接著來測試下。
如上圖所示, 在使用 TPC 生成二級證書過程中, 在右邊的 Certificate file 處輸入一級證書
C:/workspace/STM32Cube_FW_H5_V1.1.0/Projects/NUCLEOH563ZI/ROT_Provisioning/DA/Certificates/level1_cert_leaf_chain.b64時, 會直接彈出錯誤提示框, 且右下角 Generate Certificate 按鍵也是灰色的, TPC 不允許這么操作. 實測通過 TPC 是無法生成這種證書的。
審核編輯:劉清
-
led燈
+關注
關注
22文章
1592瀏覽量
108407 -
STM32
+關注
關注
2272文章
10923瀏覽量
357555 -
stlink
+關注
關注
0文章
19瀏覽量
8599
原文標題:實戰經驗 | STM32H5 DA證書鏈之初體驗
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論