国密 SM2 算法的 SSL证书虽然目前还未普遍使用,但已经有多款浏览器开始支持国产加密算法 —— SM2国密算法的SSL证书,这是我国在网络安全发展发面一个重要的方面。国密即国家密码局认定的国产密码算法,即商用密码。
目前支持 SM2 国密算法的免费浏览器已经有:密信浏览器,零信浏览器.(在实际的密码改造中免费的浏览器可能因为无法提供国密证书无法通过密评)
现在就已经开始着手去研究SM2国密算法的SSL证书,近期发现一家提供ECC&SM2双重算法SSL证书服务提供商,https://cersign.com/
根据该官网的介绍,使用支持国密算法的Nginx作为反向代理,加载双重算法证书。通过全生态支持体系和 “SM2/RSA双证书”服务模式,使得部署国密SSL证书的网站系统,兼顾国密合规性和全球通用性,真正达到实用的水平,确保用户业务系统平滑升级改造并稳定运行,真正实现基于国密算法的HTTPS网站全加密和身份可信。
当用户通过Chrome、FireFox、Edge、Safari等主流浏览器访问本站点时,系统自适配ECC国际算法SSL证书。当使用基于国密算法的如密信等访问支持国密SSL证书的浏览器访问本站时,优先建立国密HTTPS连接。
改造拓扑如下:
其中Nginx反向代理配置如下
server { listen 443 ssl; listen 80 ; server_name 你的网站名称; ssl_certificate /bodata/key/yujunhong.cn.crt; ssl_certificate_key /bodata/key/yujunhong.cn_rsa.key; ssl_certificate /bodata/key/yujunhong.cn_sm2_sign.crt; ssl_certificate_key /bodata/key/yujunhong.cn_sm2_sign.key; ssl_certificate /bodata/key/yujunhong.cn_sm2_encrypt.crt; ssl_certificate_key /bodata/key/yujunhong.cn_sm2_encrypt.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-SM2-SM4-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; } if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { proxy_pass http://原网站.com proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
ECC算法证书
使用 “零信浏览器”打开本博客即可使用国密算法浏览
使用wireshark 4.0以上抓包可观察GMSSL协议。
算法对比:
国密算法是国家密码局制定标准的一系列算法。其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM2,SM3,SM4等,其中:SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括:SM3,密码杂凑算法,杂凑值长度为32字节,和SM2算法同期公布,参见《国家密码管理局公告(第 22 号)》;SMS4,对称加密算法,随WAPI标准一起公布,可使用软件实现,加密强度为128位。
整个协议握手和TLS版本基本一致,但和TLSv1.0并不兼容。主要的不同体现在三个地方:
协议的版本号不同,握手和加密协议细节不同;协议采用的主要是SM2/SM3/SM4算法,不同于TLS采用的国际密码算法;采用的是SM2双证书体系。
这里涉及的是HTTPS协议在TLCP握手阶段的消息流程,注意这里客户端与服务器之间采用的是单向身份鉴别,即客户端对服务器端进行身份鉴别。以我的博客为例进行简单分析:
消息1:客户端向服务器端发送Client Hello消息。

Client Hello消息中重要字段包括:
可用的版本号- version 当前时间-GMT Unix Time 客户端随机数-Random Bytes,随机数1。 会话ID- Session ID,恢复之前的会话时会用到。
可用的密码套件清单-Cipher Suites,这里使用的是国密浏览器所以可以看到支持的国密算法为0x013 ,在 《GB∕T 38636-2020 信息安全技术 传输层密码协议(TLCP)》中有相关定义。服务器端将在依照这个列表选择本端支持的算法进行回复确认。
消息2:服务器端向客户端发送Server Hello消息。
Server Hello消息中重要字段包括:
使用的版本号-version 当前时间-GMT Unix Time 服务器随机数-Random Bytes,随机数2。 会话ID-Session Id
使用的密码套件清单-Cipher Suite,这里服务器端选择了ECC_SM4_CBC_SM3密码套件,也就是SM2公钥算法、SM4-CBC分组密码算法和SM3杂凑算法。具体来说,这里SM2算法密钥交换算法,SM4是加密算法(SM4-CBC)、SM3是校验算法(国标要求为HMAC-SM3)。
消息3:服务器端向客户端发送Certificate消息。
Certificate消息中重要字段包括:
国密SSL协议使用双证书体系,分别称为签名证书和加密证书,服务器和用户持有两对SM2独立的密钥对。其中加密证书和签名证书主要的区别就是密钥用法(KeyUsage)不一样(当然对应的密钥等也不一样),使用相同的DN。密钥用法具体是:
签名证书:Digital Signature, Non-Repudiation (c0) 加密证书:Key Encipherment, Data Encipherment, Key Agreement (38)
签名算法-Signature:iso.2.156.10197.1.501,即使用SM3消息摘要然后SM2签名。这里的取值和algorithmIdentifier相同。
服务器的加密证书:加密证书中在同样在扩展字段中KeyUsage标识出KeyEncipherment为true和dataEncipherment为true,即数字证书中包含的公钥可用来做密钥加密密钥和数据密钥。
服务器的加密证书:加密证书中在同样在扩展字段中KeyUsage标识出KeyEncipherment为true和dataEncipherment为true,即数字证书中包含的公钥可用来做密钥加密密钥和数据密钥。
具体公钥信息包含subjectPublickey公钥数据信息和算法名称,例如这里就是使用公钥04d4e......采用iso.2.156.10197.1.301也就是SM2算法进行加密操作。
消息4:服务器向客户端发送Server Key Exchange消息。
这里Server Key Exchange是用于生成预主密钥。
消息5:服务器向客户端发送Server Hello Done消息,通知客户端 Hello 时间结束。
额外实验:
假设服务器证书与证书名不符、过期、被吊销。此时客户端会告警:
您的连接不是私密连接 攻击者可能会试图从XXX 窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情 NET::ERR_CERT_AUTHORITY_INVALID
当点击“返回安全连接”时,客户端不会发送“Client Key Exchange”消息,并终止会话。这时候一定要小心是否遭到中间人劫持,或者是服务器本身证书配置错误,SSL证书不是由浏览器中受信任的根证书颁发机构颁发的,或者此证书已被吊销,此证书网站的域名与根证书中的域名不一致,浏览器都会显示安全警告,建议用户关闭此网页,不要继续浏览该网站。
消息6:客户端向服务器端发送Client Key Exchange消息
消息内容取决于双方Hello消息协商出的密钥交换算法,客户端用服务器端加密公钥加密后传输。
消息7:客户端向服务器端发送Change Cipher Spec消息
这不是握手协议,而是密码规格变更协议。客户端告诉服务器我要换密码了。因为已经双方已经交换了密码套件信息,可以开始切换密码进行通信了。
后面就开始正常加密通信,服务器端也会发送Change Cipher Spec,
之后开始加密通信,SSL/TLS/TLCP在通信过程中提供机密性、完整性保护。具体来说,先对消息明文M生成MAC然后将M和MAC一起进行加密传输。所以这里我们看到应用数据就是一个加密后的密文字符串。
产生用于MAC完整性和真实性保护的密钥以及数据加密密钥(工作密钥)方式
工作密钥的长度由选用的密码算法决定,由主密钥、客户端随机数(随机数1)、服务器端随机数(随机数2)、常量字符串经PRF计算生成。其中主密钥由预主密钥、随机数1、随机数2、常量字符串经PRF计算生成。在这个例子里,数据加密算法使用SM4-CBC,所以用于数据加密的密钥长度为128bit。完整性保护使用HMAC-SM3,SM3分组长度为512bit,所以用于验证完整性的工作密钥长度为512bit。
安全性检测,检测部署SSL/TLS的服务是否符合行业最佳实践,PCI DSS支付卡行业安全标准,Apple ATS规范。
可在这里做个检查:https://myssl.com/
建议在conf文件中修改,添加下列配置达到A+级合规
add_header Strict-Transport-Security "max-age=31536000"; ssl_protocols TLSv1.1 TLSv1.2; #国密配置TLSv1.3会出现加载失败,可能系编译问题。本站未启用1.3版本。
不错的改造方案。