一、下载GmSSL源码
git clone https://github.com/guanzhi/GmSSL/archive/master.zip
解压缩至当前工作目录,这个是主分支代码
$ unzip GmSSL-master.zip
二、编译与安装
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make test
$ sudo make install
安装之后可以执行gmssl命令行工具检查是否成功:
$ gmssl version
GmSSL 3.1.2 Dev
三、命令行使用
SM4加密解密
$ KEY=11223344556677881122334455667788
$ IV=11223344556677881122334455667788
$ echo hello | gmssl sm4 -cbc -encrypt -key $KEY -iv $IV -out sm4.cbc
$ gmssl sm4 -cbc -decrypt -key $KEY -iv $IV -in sm4.cbc
$ echo hello | gmssl sm4 -ctr -encrypt -key $KEY -iv $IV -out sm4.ctr
$ gmssl sm4 -ctr -decrypt -key $KEY -iv $IV -in sm4.ctr
SM3摘要
$ echo -n abc | gmssl sm3
$ gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
$ echo -n abc | gmssl sm3 -pubkey sm2pub.pem -id 1234567812345678
$ echo -n abc | gmssl sm3hmac -key 11223344556677881122334455667788
SM2签名和验签
$ gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
$ echo hello | gmssl sm2sign -key sm2.pem -pass 1234 -out sm2.sig #-id 1234567812345678
$ echo hello | gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig -id 1234567812345678
$ echo hello | gmssl sm2encrypt -pubkey sm2pub.pem -out sm2.der
$ gmssl sm2decrypt -key sm2.pem -pass 1234 -in sm2.der
SM2加密和解密
$ gmssl sm2keygen -pass 1234 -out sm2.pem -pubout sm2pub.pem
$ echo hello | gmssl sm2encrypt -pubkey sm2pub.pem -out sm2.der
$ gmssl sm2decrypt -key sm2.pem -pass 1234 -in sm2.der
生成SM2根证书rootcakey.pem及CA证书cakey.pem
$ gmssl sm2keygen -pass 1234 -out rootcakey.pem
$ gmssl certgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN ROOTCA -days 3650 -key rootcakey.pem -pass 1234 -out rootcacert.pem -key_usage keyCertSign -key_usage cRLSign
$ gmssl certparse -in rootcacert.pem
$ gmssl sm2keygen -pass 1234 -out cakey.pem
$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN "Sub CA" -days 3650 -key cakey.pem -pass 1234 -out careq.pem
$ gmssl reqsign -in careq.pem -days 365 -key_usage keyCertSign -path_len_constraint 0 -cacert rootcacert.pem -key rootcakey.pem -pass 1234 -out cacert.pem
使用CA证书签发签名证书和加密证书
$ gmssl sm2keygen -pass 1234 -out signkey.pem
$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -days 365 -key signkey.pem -pass 1234 -out signreq.pem
$ gmssl reqsign -in signreq.pem -days 365 -key_usage digitalSignature -cacert cacert.pem -key cakey.pem -pass 1234 -out signcert.pem
$ gmssl sm2keygen -pass 1234 -out enckey.pem
$ gmssl reqgen -C CN -ST Beijing -L Haidian -O PKU -OU CS -CN localhost -days 365 -key enckey.pem -pass 1234 -out encreq.pem
$ gmssl reqsign -in encreq.pem -days 365 -key_usage keyEncipherment -cacert cacert.pem -key cakey.pem -pass 1234 -out enccert.pem
将签名证书和ca证书合并为服务端证书certs.pem,并验证
$ cat signcert.pem > certs.pem
$ cat cacert.pem >> certs.pem
$ gmssl certverify -in certs.pem -cacert rootcacert.pem
查看证书内容
$ gmssl certparse -in cacert.pem
生成CRL文件
吊销证书,生成吊销信息文件
gmssl certrevoke -in signcert.pem -reason keyCompromise -invalid_date 20240325120000Z -out revoke_cert.der
常用吊销证书原因,最后有说明。
生成crl文件
gmssl crlgen -in revoke_cert.der -cacert cacert.pem -key cakey.pem -pass 1234 -out a.der
EXAMPLE:
gmssl crlgen -in revoke_cert.der -cacert cacert.pem -key cakey.pem -pass 1234 -next_update 20240325120000Z -out test_guoqi_crl.der
验证crl文件
gmssl crlverify -in a.der -cacert cacert.pem
解析crl文件
gmssl crlparse -in a.der
解析revoke_cert.der
openssl asn1parse -in revoke_cert.der -inform DER
指定吊销证书的原因,常用的有以下情况:
- unspecified(未指定):
- 没有提供具体的吊销原因。
- keyCompromise(密钥泄露):
- 证书的私钥已经泄露或可能已被未经授权的第三方获取。
- CACompromise(CA泄露):
- 签发证书的认证机构(CA)的私钥已经泄露,可能导致证书被篡改或错误签发。
- affiliationChanged(隶属关系改变):
- 证书持有者的隶属关系或组织状态已经发生改变,证书不再适用。
- superseded(被取代):
- 证书已经被一个新的证书取代,新证书具有更新的信息或更长的有效期。
- cessationOfOperation(停止运营):
- 证书持有者已经停止运营或不再使用此证书。
- certificateHold(证书暂停):
- 证书被暂停使用,通常是由于需要进一步审核或由于某种特定原因。
- removeFromCRL(从CRL中移除):
- 这是一个特殊情况,表示之前的吊销通知被错误地发布,现在需要从CRL中移除该吊销条目。
- privilegeWithdrawn(权限撤销):
- 证书持有者的某些权限或特权已经被撤销,证书不再有效。
- aACompromise(属性授权泄露):
- 与证书关联的属性授权机构(AA)的私钥已经泄露,可能导致证书的属性信息被篡改。