1、gmssl组成
分为加密和通信两部分
2、加密
主要指的是sm2 sm3 sm4加密算法,以及相关的加密组件
3、通信
指的是gmtls
按照一个 GM/T 0024-2014规范实现的,采用双证书,签名证书+加密证书
4、生成证书
可使用地址https://github.com/jntass/TASSL/tree/master/Tassl_demo/mk_tls_cert 下的SM2certgen.sh生成双证书。
注意:生成请求时指定的摘要算法 在用请求生成证书时并不生效,需要重新指定,否则会使用默认的算法rsa-sha256
针对gmssl,签名算法一定要是sm2sign-with-sm3
针对tassl,只要加密用的是sm2即可,sm2sign-with-sm3不是必须
5、兼容性
指的是gmssl对openssl的兼容性
ssl/tls下,仅支持有限的套件:
ECDHE-SM2-WITH-SMS4-SM3
ECDHE-SM2-WITH-SMS4-SHA256
不是完全兼容的
采用老的openssl证书,要指定tls版本为1或1.2才可以,或者直接使用TSLv1_2_method,使用TSL_method不可以,号称的会自己检测版本并没有实现,貌似默认是使用1.1版本
6、双证书
gmssl对双证书和双密钥的设置
直接设置两个sm2证书和密钥就可以,没有新增接口,都是代码里自己适配:
keyusagedigitalSignature 类型的证书是签名证书,否则是加密证书,密钥呢,加密证书存在的时候是加密密钥,否则是签名密钥
这个其实是有漏洞的,必须先设置签名证书。。然后才是加密证书
tassl是有的,增加了一个设置加密密钥的接口SSL_use_enc_PrivateKey,设置证书的接口也是代码里适配的,证书类型需要keyusage(keyAgreementkeyEnciphermentdataEncipherment)
7、版本
以上总结仅针对GmSSL最新版(v2.3.1)和tassl当前最新版(2018-09-17)
8、最新版的openssl已经支持国密算法
仅仅支持国密的算法,通信还未支持
9、编程实现
server.c:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define CERTSERVER "/tmp/testopenssl/demoCA/cacert.pem"
//#define KEYSERVER "/tmp/testopenssl/demoCA/private/cakey.pem"
#define CERTSERVER "SS.pem"
#define KEYSERVER "SS.key.pem"
#define SM2_SERVER_ENC_CERT "SE.pem"
#define SM2_SERVER_ENC_KEY "SE.key.pem"
#define CHK_