SKF密碼設備研究
密碼設備
mToken GM3000 國密身份認證鎖是龍脈科技自主研發設計支持國密算法、完全遵照國家密碼管理局頒布的《智能IC卡及智能密碼鑰匙密碼應用接口規范》要求設計的USB Key,采用國產高性能智能卡芯片,內置SSF33、SM1、SM2、SM3、SM4等國產算法,支持高速數據國密算法加解密,提供CSP以及PKCS11和國密接口,完全符合國家密碼管理局關於“密鑰不落地”的技術規范要求,是電子政務、電子軍務、CA廠商首選的USB Key產品。
適用范圍:主要是用作基於公鑰體系PKI的數字證書和私鑰的安全載體。
使用目的:學習使用key導入數字證書等功能
SKF密碼設備
SKF密碼設備使用的是SKF接口,SKF接口是國密標准中智能密碼鑰匙的C語言應用開發接口標准,目前很多國內密碼密碼設備廠商都為其產品提供了SKF接口的開發包。開發者可以通過統一的SKF接口開發密碼應用,訪問來自不同設備供應商的USB-Key、TF卡、智能卡等不同形態的密碼設備,而無需和某一個設備供應商的專屬設備或專屬接口綁定。
GmSSL項目從2.0版本開始,以Engine的方式增加了對SKF設備的完善支持。GmSSL通過在libcrypto密碼庫中引入SKF框架,實現了對不同廠商SKF設備的支持。通過將SKF接口封裝為SKF Engine,使得上層應用和SSL庫可以直接通過EVP接口動態調用不同SKF設備。
GmSSL通過ENGINE機制支持密碼硬件。鑒於《智能IC卡及智能密碼鑰匙密碼應用接口規范》標准中公布了訪問國密硬件的C語言API (下面簡稱SKF API),GmSSL通過ENGINE機制訪問支持國密SKF API的國產密碼硬件。一個SKF API設備中可以包含一個或多個應用(Application),每個應用可以包含一個獲多個容器(Container),每個容器中可以存放兩對分別用於加密和簽名的密鑰對,以及兩個相應的證書或證書鏈。每一個容器只能為ECC或RSA一種類型,一個容器中不能混用ECC密鑰和RSA密鑰。
SKF密碼設備管理
通過gmssl命令行工具的skf命令可以訪問和管理SKF設備,通過gmssl的pkey、pkeyutl和req等命令及SKF引擎可以密碼計算、公鑰導出、證書生成等功能。我按照文章http://gmssl.org/docs/skf.html所介紹的方法,對mToken GM3000在Linux下進行管理,需要在Linux下先安裝mToken GM3000的驅動程序。
dpkg -i LM-mPluginV4-V4.0.0.0.amd64.deb 命令用來安裝插件
插件安裝成功后,要想進行設備管理,需要獲得由廠商提供的針對該類型設備的動態庫,這個動態庫通常隨廠商的開發SDK提供,在Linux操作系統中以so為擴展名,在skf命令中,通過參數-lib指定廠商的SKF動態庫。剛開始我並沒有找到廠商提供的動態庫,在網頁中的命令如下:
$ ln -s /path/to/vendors/skf/libSKF.so ./libskf.so
$ gmssl skf -lib ./libskf.so -vendor wisec -listdevs
Device 0 : /media/guanzhi/99E1-9854
其中,-lib
參數用來指定廠商的SKF動態庫,在提供的中間件文件夾中mToken-GM3000
中的skf\api\linux\x86
,最后找到了該動態庫名為libgm3000.1.0.so
。所以對該動態庫進行重命名,用./libskf.so
命名。
查看skf的相關命令 gmssl skf -help
后來發現可以使用skf命令查看設備信息等功能
gmssl skf -lib ./libskf.so -vendor wisec -listdevs

gmssl skf -lib ./libskf.so -dev $設備名稱 -devinfo

進行應用管理的時候包含創建應用、枚舉應用、刪除應用。首先,我們可以通過-listapps指令枚舉指定設備中的應用,普通用戶在拿到設備時,可能已經有預先設備好的應用。
gmssl skf -lib ./libskf.so -dev $DEV -authkey $AUTHKEY -listapps
在文檔中看到設備認證的流程:
gmssl skf -lib ./libskf.so -dev $DEV -authkey $AUTHKEY -listapps
使用命令查看設備的應用時,出現錯誤
秘鑰容器管理
SKF設備中以密鑰容器的方式管理私鑰,一個應用中可以建立多個密鑰容器,每個密鑰容器中可以裝載同類型的2對公私鑰對,其中一個為簽名密鑰對,一個為加解密或密鑰交換密鑰對。簽名密鑰對只能在SKF設備內部生成而無法由外部導入,而加解密或密鑰交換密鑰只能從外部導入而無法在設備內部生成。在完成密鑰生成或導入后,密鑰對中只有公鑰可以導出,私鑰是無法導出的。密鑰容器還支持證書的存儲,一個密鑰容器中可以存儲兩個證書或兩條證書鏈,分別對應兩個密鑰對。
證書生成
用戶秘鑰及證書生成過程如下:
mkdir demoCA
cd demoCA
mkdir certs crl newcerts private
touch index.txt
od -vAn -N4 -tx1 < /dev/urandom |tr -d ' ' > serial
echo "good" >> testPage.txt
gmssl sm2 -genkey -out private/cakeyGM.pem
生成SM2自簽證書作為根CA
gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt
生成用戶SM2密鑰對
cd ..
gmssl sm2 -genkey -out wzz.com.key
生成證書請求
gmssl req -new -key wzz.com.key -out wzz.com.csr
利用CA進行簽名
sudo gmssl ca -in wzz.com.csr -out wzz.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem
驗簽
gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt wzz.com.crt
生成PKCS12格式的證書文件
cd demoCA
sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out wzzRootCA.p12
導入證書
登錄管理工具
導入證書,選擇剛剛在Linux下生成的證書
可以導入PCKS12格式的證書
最后可以實現安裝證書