SKF接口是國密標準中智能密碼鑰匙的C語言應用開發接口標準,目前不少國內密碼密碼設備廠商都爲其產品提供了SKF接口的開發包。開發者能夠經過統一的SKF接口開發密碼應用,訪問來自不一樣設備供應商的USB-Key、TF卡、智能卡等不一樣形態的密碼設備,而無需和某一個設備供應商的專屬設備或專屬接口綁定。編程
然而目前應用開發者開發SKF應用仍然存在一些困難和挑戰。首先,SKF是一個底層的密碼設備應用開發接口,這個接口不支持數字證書和SSL通訊等面向高層密碼應用的功能,對於應用開發者來講直接使用SKF接口開發密碼應用,工做量較大。其次,因爲SKF的標準草案和正式公佈標準在內容上有一些差別,致使不一樣設備廠商的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引擎的配置文件,而幾乎無需進行任何代碼開發,能夠大大節省密碼設備開發的工做量。除了SKF引擎以外,GmSSL項目還提供針對PCI-E密碼卡和服務器密碼機的SDF引擎,應用能夠隨意選擇低成本的SKF密碼設備或者高性能、高安全等級的SDF密碼設備。服務器
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的實現會自動從容器中選擇對應類型的密鑰。工具
在使用公鑰及訪問容器時,應用須要進行兩級認證,第一級爲設備認證,第二級應用認證。設備認證須要全設備惟一的設備認證密鑰,設備認證密鑰是固定長度的對稱密鑰。訪問某個具體的應用須要提供該應用的專有口令進行認證,認證的口令是可變長度的口令字符串。性能
開發者在得到密碼設備後,首先須要對密碼設備進行初始化,如設置密碼、生成密鑰容器、導入密鑰和證書等。目前國內的SKF設備供應商一般不提供具有這些功能的管理工具,開發者須要經過SKF編程接口自行開發所需功能。GmSSL項目經過命令行工具提供了SKF設備的管理功能,開發者能夠利用該工具,編寫腳本完成大規模、自動化的SKF設備管理功能。加密
經過gmssl命令行工具的skf命令能夠訪問和管理SKF設備,經過gmssl的pkey、pkeyutl和req等命令及SKF引擎能夠密碼計算、公鑰導出、證書生成等功能,本節主要介紹skf命令的功能和用法。SKF接口包含設備管理、應用管理、密鑰容器管理、數據對象管理等功能,skf命令封裝了SKF接口的上述功能,能夠完成枚舉設備、建立應用和密鑰容器,建立簽名私鑰、導入解密私鑰、導入證書等功能。spa
因爲skf命令是在GmSSL 2.4版本以後加入的,應首先確認當前的GmSSL版本支持skf命令。能夠經過-help打印skf命令的全部選項,注意,隨着GmSSL版本的演進,skf命令行的選項可能會發生變化。命令行
mkdir demoCA3d
cd demoCA
mkdir certs crl newcerts private
touch index.txt
echo "08" >> index.txt
gmssl sm2 -genkey -out private/cakeyGM.pem
gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt
cd ..
gmssl sm2 -genkey -out uGM.com.key
gmssl req -new -key uGM.com.key -out uGM.com.csr
sudo gmssl ca -in uGM.com.csr -out uGM.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem
gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt uGM.com.crt
sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out uGMRootCA.p12