SKF介紹
SKF接口是國密標准中智能密碼鑰匙的C語言應用開發接口標准,目前很多國內密碼密碼設備廠商都為其產品提供了SKF接口的開發包。開發者可以通過統一的SKF接口開發密碼應用,訪問來自不同設備供應商的USB-Key、TF卡、智能卡等不同形態的密碼設備,而無需和某一個設備供應商的專屬設備或專屬接口綁定。
GmSSL與SKF
GmSSL項目從2.0版本開始,以Engine的方式增加了對SKF設備的完善支持。GmSSL通過在libcrypto密碼庫中引入SKF框架,實現了對不同廠商SKF設備的支持。通過將SKF接口封裝為SKF Engine,使得上層應用和SSL庫可以直接通過EVP接口動態調用不同SKF設備。GmSSL項目還修改了gmssl命令行工具中所有相關功能,使得enc、dgst、pkeyutl、sm2utl等命令都可以支持SKF引擎,gmssl命令行工具還新增加了skf命令提供SKF設備的管理功能。應用開發者在通過命令行工具完成對SKF設備的初始化之后,可以直接通過SKF引擎為現有的密碼應用提供SKF設備的支持,只需要提供一個SKF引擎的配置文件,而幾乎無需進行任何代碼開發,可以大大節省密碼設備開發的工作量。
設備邏輯
GmSSL通過ENGINE機制支持密碼硬件。鑒於《智能IC卡及智能密碼鑰匙密碼應用接口規范》標准中公布了訪問國密硬件的C語言API (下面簡稱SKF API),GmSSL通過ENGINE機制訪問支持國密SKF API的國產密碼硬件。
一個SKF API設備中可以包含一個或多個應用(Application),每個應用可以包含一個獲多個容器(Container),每個容器中可以存放兩對分別用於加密和簽名的密鑰對,以及兩個相應的證書或證書鏈。每一個容器只能為ECC或RSA一種類型,一個容器中不能混用ECC密鑰和RSA密鑰。因此,在SKF API中提供公鑰密碼計算的接口通過Container Handle來引用公鑰,容器的特性使得應用無需區分簽名密鑰和加密密鑰,SKF API的實現會自動從容器中選擇對應類型的密鑰。
在使用公鑰及訪問容器時,應用需要進行兩級認證,第一級為設備認證,第二級應用認證。設備認證需要全設備唯一的設備認證密鑰,設備認證密鑰是固定長度的對稱密鑰。訪問某個具體的應用需要提供該應用的專有口令進行認證,認證的口令是可變長度的口令字符串。
管理工具
開發者在獲得密碼設備后,首先需要對密碼設備進行初始化,如設置密碼、生成密鑰容器、導入密鑰和證書等。
通過gmssl命令行工具的skf命令可以訪問和管理SKF設備,通過gmssl的pkey、pkeyutl和req等命令及SKF引擎可以密碼計算、公鑰導出、證書生成等功能,本節主要介紹skf命令的功能和用法。SKF接口包含設備管理、應用管理、密鑰容器管理、數據對象管理等功能,skf命令封裝了SKF接口的上述功能,可以完成枚舉設備、創建應用和密鑰容器,創建簽名私鑰、導入解密私鑰、導入證書等功能。可以通過-help打印skf命令的所有選項。

##設備管理 設備管理包括枚舉設備、打印設備信息、設置設備標簽、修改設備認證密鑰和發送測試報文等功能。 ##應用管理 應用管理包含創建應用、枚舉應用、刪除應用。 ##密鑰容器管理 SKF設備中以密鑰容器的方式管理私鑰,一個應用中可以建立多個密鑰容器,每個密鑰容器中可以裝載同類型的2對公私鑰對,其中一個為簽名密鑰對,一個為加解密或密鑰交換密鑰對。簽名密鑰對只能在SKF設備內部生成而無法由外部導入,而加解密或密鑰交換密鑰只能從外部導入而無法在設備內部生成。在完成密鑰生成或導入后,密鑰對中只有公鑰可以導出,私鑰是無法導出的。密鑰容器還支持證書的存儲,一個密鑰容器中可以存儲兩個證書或兩條證書鏈,分別對應兩個密鑰對。通過skf命令可以完成密鑰容器的枚舉、創建和刪除。 ##數據對象管理 SKF應用支持存儲若干數據對象,由於應用是受到PIN保護的,因此用戶程序可以將需要保護的用戶數據、配置文件等安全敏感數據以數據對象的方式保存到SKF設備中。但是由於SKF設備的內部存儲空間較小,通常只有幾十KB到數百KB,因此只能存儲較少數據。通過skf命令可以實現數據對象的枚舉、導入、導出和刪除。
使用GmSSL生成SM2證書
實驗環境:Ubuntu1804
- 生成SM2密鑰對"cakeyGM.pem"

2. 生成SM2自簽證書作為根CA“cacertGM.crt”:`gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt`

3. 生成SM2密鑰對"ly.com.pem",進入上級目錄,執行`gmssl sm2 -genkey -out ly.com.key`

4. 生成證書請求CSR:`gmssl req -new -key ly.com.key -out ly.com.csr`

5. 用CA進行簽名:`sudo gmssl ca -in ly.com.csr -out ly.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem`

6. 驗簽:`gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt ly.com.crt`

7. 生成PKCS12格式的證書文件,在`demoCA`目錄下執行`sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out lyRootCA.p12`

導入證書
環境:WIN10
KEY型號:mToken-GM3000
- 插入KEY,打開管理工具,認證設備

2. 登錄應用

3. 創建容器

4. 導入證書

5. 證書

6. 重新拔插,安裝證書(或者打開管理員工具,進行證書認證)

參考資料