国密证书
国密证书
介绍
国密SSL指的是采用国密算法(SM1/2/3/4等),符合国密标准(GM/T0024-2014和GB/T38636-2020)的安全传输协议。简而言之,国密SSL就是SSL/TLS协议的国密版本。
等级保护2.0明确规定,要求对网络通信中的报文或会话过程全文加密(三级)。其中的密码技术,主要技术标准之一就是国密SSL。
国密SSL实际使用中,需要国密证书、国密U盾、国密网关/服务器、国密浏览器等互相配合,才能形成完整的落地方案。
国密证书是双证书,包含签名证书/签名密钥,加密证书/加密密钥共4个文件。
单证书和双证书介绍
通常情况下,服务器会部署一张证书,用于签名和加密,这就是所谓的单证书:
- 签名时,服务器使用自己的私钥加密信息的摘要(签名),客户端使用服务器的公钥(包含在证书中)进行解密,对比该摘要是否正确,若正确,则客户端就确定了服务器的身份,即验签成功。
- 加密时,服务器和客户端协商出会话密钥(一般为对称密钥),会话密钥的产生根据密钥协商算法的不同,过程有所不同,但都会用到证书的公钥和私钥,也就是说证书也用在加密场景中。
- 在单证书配置下,服务器端的公钥和私钥由服务器负责保存。私钥需要特别保存,如果泄漏出去就会有很大的安全风险。客户端的公钥和私钥一般在通信过程中动态产生,客户端也不会存储。
而双证书则包括签名证书和加密证书:
- 签名证书在签名时使用,仅仅用来验证身份使用,其公钥和私钥均由服务器自己产生,并且由自己保管,CA不负责其保管任务。
- 加密证书在密钥协商时使用,其私钥和公钥由CA产生,并由CA保管(存根)。
既然单证书可以搞定一切,为何要使用双证书?
- 从道理上来说两个密钥具有不同的属性,逻辑上应该分开处理。
- 其实最主要的原因是国家要保证必要的时候有能力对某些通讯进行监控,如果采用单证书,除了服务器自己谁也无法解密(理论上如此),不利于国家安全。因此某些国家法律规定使用双证书。如果拥有加密证书的私钥,可以进行实时监控。
准备证书
正式证书需要从官方渠道获取,这里介绍获取测试证书
的方式:
::: tabs
@tab 官网下载
下载地址:https://www.gmssl.cn/
@tab 官网签发
签发地址:https://www.gmcrt.cn/
相关信息根据实际情况填写,其中名字
内容必填,需要是nginx等web服务器的IP地址或者域名。
生成的证书解压后可以获取4个证书文件:
@tab 代理商提供
代理商提供测试证书,直接使用即可。
:::
安装配置
::: tabs
@tab 官网下载
官网提供基于Centos7 x86_64系统架构的安装包,其他系统或架构需要采用编译安装的方式。
@tab 编译安装
下载国密组件:https://www.gmssl.cn/,根据系统架构选择,这里以Centos7 x86_64为例,下载第一个:
Nginx编译
编译部署(以nginx-1.18.0为例)
# 1) 上传gmssl_openssl_1.1_bxx.tar.gz到/root/下
# 2) 解压
tar xzfm gmssl_openssl_1.1_bxx.tar.gz -C /usr/local
# 3) 下载nginx-1.18.0.tar.gz到/root/下
# 4) 解压
tar xzfm nginx-1.18.0.tar.gz
# 5) 进入目录
cd /root/nginx-1.18.0
# 6) 编辑auto/lib/openssl/conf,将全部$OPENSSL/.openssl/修改为$OPENSSL/并保存
# 7) 编译配置,这里可以根据实际需求修改或添加其他模块
./configure \
--without-http_gzip_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_v2_module \
--with-file-aio \
--with-openssl="/usr/local/gmssl" \
--with-cc-opt="-I/usr/local/gmssl/include" \
--with-ld-opt="-lm"
# 8) 编译安装
make install
# 9) /usr/local/nginx即为生成的nginx目录,注:可能需要使用yum install pcre-devel安装pcre-devel
Nginx配置
以从官网下载的测试证书为例:
- SM2签名测试证书:demo1.sm2.sig.crt.pem
- SM2签名测试私钥:demo1.sm2.sig.key.pem
- SM2加密测试证书:demo1.sm2.enc.crt.pem
- SM2加密测试私钥:demo1.sm2.enc.key.pem
Nginx配置示例:首先将证书上传到Nginx服务器任意目录(例如:/usr/local/nginx/conf/)
server
{
listen 0.0.0.0:443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA:DES-CBC3-SHA:ECC-SM4-CBC-SM3:ECC-SM4-GCM-SM3;
ssl_verify_client off;
ssl_certificate /usr/local/nginx/conf/demo1.sm2.sig.crt.pem;
ssl_certificate_key /usr/local/nginx/conf/demo1.sm2.sig.key.pem;
ssl_certificate /usr/local/nginx/conf/demo1.sm2.enc.crt.pem;
ssl_certificate_key /usr/local/nginx/conf/demo1.sm2.enc.key.pem;
location /
{
root html;
index index.html index.htm;
}
}
:::
国密客户端
奇安信可信浏览器支持国密算法和国密SSL。
奇安信可信浏览器的配置、使用参考:奇安信国密浏览器配置.doc