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命令的所有选项。
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182608262-435608851.png)
##设备管理
设备管理包括枚举设备、打印设备信息、设置设备标签、修改设备认证密钥和发送测试报文等功能。
##应用管理
应用管理包含创建应用、枚举应用、删除应用。
##密钥容器管理
SKF设备中以密钥容器的方式管理私钥,一个应用中可以建立多个密钥容器,每个密钥容器中可以装载同类型的2对公私钥对,其中一个为签名密钥对,一个为加解密或密钥交换密钥对。签名密钥对只能在SKF设备内部生成而无法由外部导入,而加解密或密钥交换密钥只能从外部导入而无法在设备内部生成。在完成密钥生成或导入后,密钥对中只有公钥可以导出,私钥是无法导出的。密钥容器还支持证书的存储,一个密钥容器中可以存储两个证书或两条证书链,分别对应两个密钥对。通过skf命令可以完成密钥容器的枚举、创建和删除。
##数据对象管理
SKF应用支持存储若干数据对象,由于应用是受到PIN保护的,因此用户程序可以将需要保护的用户数据、配置文件等安全敏感数据以数据对象的方式保存到SKF设备中。但是由于SKF设备的内部存储空间较小,通常只有几十KB到数百KB,因此只能存储较少数据。通过skf命令可以实现数据对象的枚举、导入、导出和删除。
使用GmSSL生成SM2证书
实验环境:Ubuntu1804
- 生成SM2密钥对"cakeyGM.pem"
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182704058-104529047.png)
2. 生成SM2自签证书作为根CA“cacertGM.crt”:`gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182736974-1438753640.png)
3. 生成SM2密钥对"ly.com.pem",进入上级目录,执行`gmssl sm2 -genkey -out ly.com.key`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182745777-490520696.png)
4. 生成证书请求CSR:`gmssl req -new -key ly.com.key -out ly.com.csr`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182753335-295944865.png)
5. 用CA进行签名:`sudo gmssl ca -in ly.com.csr -out ly.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182802168-2053397186.png)
6. 验签:`gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt ly.com.crt`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182809281-1788154380.png)
7. 生成PKCS12格式的证书文件,在`demoCA`目录下执行`sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out lyRootCA.p12`
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182817031-2003033141.png)
导入证书
环境:WIN10
KEY型号:mToken-GM3000
- 插入KEY,打开管理工具,认证设备
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182824227-508739016.png)
2. 登录应用
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182829105-1076641373.png)
3. 创建容器
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182834253-400139616.png)
4. 导入证书
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182842512-1913158304.png)
5. 证书
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182848300-862455754.png)
6. 重新拔插,安装证书(或者打开管理员工具,进行证书认证)
![](https://img2018.cnblogs.com/blog/1506992/201906/1506992-20190602182854789-1034146566.png)
参考资料