openssl自制SM2国密证书

OpenSSL项目最近添加了许多新特性, 包括对中国SM2/SM3/SM4算法的支持:

SM2椭圆曲线: https://github.com/openssl/openssl/pull/4793
SM3哈希摘要: https://github.com/openssl/openssl/pull/4616
SM4对称加密: https://github.com/openssl/openssl/pull/4552

openssl version
OpenSSL 1.1.1-pre5 (beta) 17 Apr 2018
检查 SM3 哈希校验和
$ echo -n “abc” | openssl dgst -SM3
(stdin)= 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
检查椭圆曲线是否包含SM2
$ openssl ecparam -list_curves | grep SM2
SM2 : SM2 curve over a 256 bit prime field
检查对称算法
openssl enc -ciphers
-sm4
-sm4-cbc
-sm4-cfb
-sm4-ctr
-sm4-ecb
-sm4-ofb

openssl中有如下后缀名的文件

.key格式:私有的密钥

.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写

.crt格式:证书文件,certificate的缩写

.crl格式:证书吊销列表,Certificate Revocation List的缩写

.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

CA根证书的生成步骤

生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。

# Generate CA private key 
openssl ecparam -out sm2.key -name SM2 -genkey 
# Generate CSR 
openssl req -new -key ca.key -out ca.csr
# Generate Self Signed certificate(CA 根证书)
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

可以使用这个证书再签发 server 证书

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

生成pem格式证书 
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成 
$cat client.crt client.key> client.pem 

openssl ca命令会默认读取配置文件openssl.cnf,也可以用openssl x509签证书,默认openssl.cnf中的结构要求如下

[ CA_default ]
dir             = /etc/pki/CA             # 定义路径变量
certs           = $dir/certs              # 已颁发证书的保存目录
database        = $dir/index.txt          # 数据库索引文件
new_certs_dir   = $dir/newcerts           # 新签署的证书保存目录
certificate     = $dir/cacert.pem         # CA证书路径名
serial          = $dir/serial             # 当前证书序列号
private_key     = $dir/private/cakey.pem  # CA的私钥路径名

openssl x509命令具以下的一些功能,例如输出证书信息,签署证书请求文件、生成自签名证书、转换证书格式等。openssl x509工具不会使用openssl配置文件中的设定,而是完全需要自行设定或者使用该伪命令的默认值,它就像是一个完整的小型的CA工具箱。

主要选项:
-in filename          : #指定证书输入文件,若同时指定了”-req”选项,则表示输入文件为证书请求文件。
-out filename        : #指定输出文件
-md2|-md5|-sha1|-mdc2: #指定单向加密的算法

签署选项:

*  伪命令x509可以像openssl ca一样对证书或请求执行签名动作。注意,openssl x509         *
*  不读取配置文件,所有的一切配置都由x509自行提供,所以openssl x509像是一个”mini CA”  *

-signkey filename :该选项指定签名秘钥(秘钥必须是输入文件的私钥),并使得由-in 提供的输入文件转成自签名的证书。
                  :自签署的输入文件”-in file”的file可以是证书请求文件,也可以是已签署过的证书。会使用文件中的subject name 作为issuer name.
-x509toreq        :将已签署的证书转换回证书请求文件。需要使用”-signkey”选项来传递需要的私钥。
-req              :x509工具默认以证书文件做为inputfile(-in file),指定该选项将使得input file的file为证书请求文件。
-set_serial n     :指定证书序列号。该选项可以和”-singkey”或”-CA”选项一起使用。
                  :如果和”-CA”一起使用,则”-CAserial”或”-CAcreateserial”选项指定的serial值将失效。
                  :序列号可以使用数值或16进制值(0x开头)。也接受负值,但是不建议。
-CA filename      :指定签署时所使用的CA证书。该选项一般和”-req”选项一起使用,用于为证书请求文件签署。
-CAkey filename   :设置CA签署时使用的私钥文件。如果该选项没有指定,将假定CA私钥已经存在于CA自签名的证书文件中。
-CAserial filename:设置CA使用的序列号文件。当使用”-CA”选项来签名时,它将会使用某个文件中指定的序列号来唯一标识此次签名后的证书文件。
                  :这个序列号文件的内容仅只有一行,这一行的值为16进制的数字。当某个序列号被使用后,该文件中的序列号将自动增加。
                  :默认序列号文件以CA证书文件基名加”.srl”为后缀命名。如CA证书为”mycert.pem”,则默认寻找的序列号文件为”mycert.srl”
-CAcreateserial   :当使用该选项时,如果CA使用的序列号文件不存在将自动创建:该文件将包含序列号值”02″并且此次签名后证书文件序列号为1。
                  :一般如果使用了”-CA”选项而序列号文件不存在将会产生错误”找不到srl文件”。

证书扩展选项:
-purpose:选项检查证书的扩展项并决定该证书允许用于哪些方面,即证书使用目的范围。

例如,使用x509工具自建CA。由于x509无法建立证书请求文件,所以只能使用openssl req来生成请求文件,然后使用x509来自签署。自签署时,

使用”-req”选项明确表示输入文件为证书请求文件,否则将默认以为是证书文件,再使用”-signkey”提供自签署时使用的私钥。

openssl req -new -keyout key.pem -out req.csr
openssl x509 -req -in req.csr -signkey key.pem -out x509.crt

x509也可以用来签署他人的证书请求,即为他人颁发证书。注意,为他人颁发证书时,确保serial文件存在,建议使用自动创建的选项”-CAcreateserial”。

openssl x509 -req -in req.csr -CA ca.crt -CAkey ca.key -out x509.crt -CAcreateserial

查看证书信息:

openssl x509 -in ca.crt -noout -text

验证证书(通过CA证书):

openssl x509 -hash -in ca.crt -noout

mkdir demo

cp ca.crt demo/9746d4b2.0

openssl verify -CApath demo alice tmp.crt