SKF密码设备研究

一、 概述

          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接口的上述功能,可以完成枚举设备、创建应用和密钥容器,创建签名私钥、导入解密私钥、导入证书等功能。

    由于skf命令是在GmSSL 2.4版本之后加入的,应首先确认当前的GmSSL版本支持skf命令。可以通过-help打印skf命令的所有选项,注意,随着GmSSL版本的演进,skf命令行的选项可能会发生变化。

四、使用GmSSL生成SM2证书

mkdir demoCA

cd demoCA

mkdir certs crl newcerts private

touch index.txt

echo "08" >> index.txt

1./*生成SM2密钥对 "cakeyGM.pem"*/

gmssl sm2 -genkey -out private/cakeyGM.pem

 

2./*生成SM2自签证书作为根CA“cacertGM.crt”*/

gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt

3./*生成SM2密钥对 "uGM.com.pem"*/

cd ..

gmssl sm2 -genkey -out uGM.com.key

4./*生成证书请求CSR*/

gmssl req -new -key uGM.com.key -out uGM.com.csr

5./*用CA进行签名*/

sudo gmssl ca -in uGM.com.csr -out uGM.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem

6./*验签*/

gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt uGM.com.crt

7./*生成PKCS12格式的证书文件*/

sudo gmssl pkcs12 -export -in cacertGM.crt -inkey private/cakeyGM.pem -out uGMRootCA.p12

五、导入证书

 

1、插入KEY,打开管理工具,认证设备

 

 

2、登陆应用

3、创建容器

4、显示证书

 

posted @ 2019-06-02 22:25  20189202上官慧羽  阅读(789)  评论(0编辑  收藏  举报