啥?双证书?

国密标准对于SSL通信定义得不是很清楚,所能依仗的标准只有《GMT 0024-2014 SSL V** 技术规范》。在文档中提到,国密TLS需要有签名证书和加密证书。开发伊始并没有注意到这个细节,以至于在后面的联调中吃了很多苦头。现将双证书的概念以及配置方法总结一下,希望对大家有所帮助。

何为单证书和双证书?

通常情况下,服务器会部署一张证书,用于签名和加密,这就是所谓的单证书:

  • 签名时,服务器使用自己的私钥加密信息的摘要(签名),客户端使用服务器的公钥(包含在证书中)进行解密,对比该摘要是否正确,若正确,则客户端就确定了服务器的身份,即验签成功。
  • 加密时,服务器和客户端协商出会话密钥(一般为对称密钥),会话密钥的产生根据密钥协商算法的不同,过程有所不同,但都会用到证书的公钥和私钥,也就是说证书也用在加密场景中。

在单证书配置下,服务器端的公钥和私钥由服务器负责保存。私钥需要特别保存,如果泄漏出去就会有很大的安全风险。客户端的公钥和私钥一般在通信过程中动态产生,客户端也不会存储。如果客户端也要配置证书,这种情形不常见,不在讨论之列。

双证书则包括签名证书和加密证书:

  • 签名证书在签名时使用,仅仅用来验证身份使用,其公钥和私钥均由服务器自己产生,并且由自己保管,CA不负责其保管任务。
  • 加密证书在密钥协商时使用,其私钥和公钥由CA产生,并由CA保管(存根)。

既然单证书可以搞定一切,为何要使用双证书?

从道理上来说两个密钥具有不同的属性,逻辑上应该分开处理。其实最主要的原因是国家要保证必要的时候有能力对某些通讯进行监控,如果采用单证书,除了自己谁也无法解密(理论上如此),不利于国家安全。因此某些国家法律规定使用双证书。如果拥有加密证书的私钥,可以进行实时监控。使用过wireshark抓HTTPS包的朋友应该知道,如果配置了RSA密钥,可以解密出HTTPS通信中的加密信息。

关于安全性话题,我并非这方面的专家,也许理解有误。下面说说如何配置双证书。

配置双证书测试环境

TASSL

在《搭建国密SSL开发测试环境》一文中,我介绍了GmSSL这个开源项目。在开发过程中,我也不断在搜寻资料,后来又发现另一个实现国密的开源项目TASSL。TASSL也是基于OpenSSL开发,由北京江南天安科技有限公司维护,这是中国领先的密码技术与信息安全综合服务商。TASSL基于OpenSSL 1.0.2o版本开发,其项目地址为:

https://github.com/jntass/TASSL/

他们还有一个基于OpenSSL 1.1.1b版本开发的版本,其项目地址为:

https://github.com/jntass/TASSL-1.1.1b

在这个项目里面,我找到了配置双证书的方法。下面就以TASSL开源项目为例,说说双证书测试环境的搭建。

编译TASSL

因为都是基于OpenSSL开发,其编译过程和GmSSL差不多,详细的步骤请参考我之前写的《搭建国密SSL开发测试环境》。

下面直接给出步骤:

$ git clone https://github.com/jntass/TASSL/
$ cd TASSL
$ chmod a+x config
$ ./config --prefix=/home/alex/work/gmbrowser/usr/local/tassl
$ make
$ make install

如果出现如下错误:

/bin/sh: 1: ./pod2mantest: Permission denied
installing man1/CA.pl.1
sh: 1: --section=1: not found
Makefile:646: recipe for target 'install_docs' failed
make: *** [install_docs] Error 127

你可以选择忽略,因为这一步是安装文档,一般来说用不着。如果要解决,也很简单。其原因在于克隆下来的文件,某些可执行脚本和文件的可执行属性整没了。执行如下的命令,修改util下脚本和可执行文件的可执行属性,然后再执行一遍make install。

$ chmod a+x ./util/*

设置环境变量:

PATH=$HOME/work/gmbrowser/usr/local/tassl/bin:$PATH
LD_LIBRARY_PATH=$HOME/work/gmbrowser/usr/local/tassl/lib:$LD_LIBRARY_PATH

查看一下版本:

$ openssl version
OpenSSL/TaSSL 1.0.2o  27 Mar 2018

生成签名证书和加密证书

TASSL提供了一个脚本,可用来生成CA证书、Server证书和Client证书。脚本位于 Tassl_demo/mk_tls_cert/SM2certgen.sh,执行如下命令可以生成全套的测试证书:

$ cd Tassl_demo/mk_tls_cert
$ sh SM2certgen.sh

证书生成在其下的sm2Certs子目录里,其中:

  • CA.key.pem和CA.cert.pem分别是CA私钥和CA证书。
  • CE.cert.pem和CE.key.pem分别是客户端的加密证书和对应的私钥。
  • CS.cert.pem和CS.key.pem分别是客户端的签名证书和对应的私钥。
  • SE.cert.pem和SE.key.pem分别是服务器的加密证书和对应的私钥。
  • SS.cert.pem和SS.key.pem分别是服务器的签名证书和对应的私钥。

有人可能注意到,生成的文件还有CA.pem、CE.pem、CS.pem、SE.pem和SS.pem文件,他们是证书和对应的私钥合并在一起形成的,主要是为了使用方便。

配置双证书通信

服务器端:

openssl s_server -accept 44330 -CAfile sm2Certs/CA.pem -cert sm2Certs/SS.pem -enc_cert sm2Certs/SE.pem

客户端:

openssl s_client -connect 127.0.0.1:4433 -cntls

它们之间通信会使用 ECC-SM4-SM3 密码套件。

小结

本文介绍了双证书的来头,随后介绍了一个新的国密开源实现TASSL,最后介绍了双证书的生成和测试环境配置。

如果大家有什么问题,欢迎交流。

本文分享自微信公众号 - 云水木石(ourpoeticlife),作者:陈正勇

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 搭建个人国密CA(Certification Authority)

    在SSL/TLS/HTTPS通信中,证书虽然不是TLS/SSL协议的一部分,却是HTTPS非常关键的一环,网站引入证书才能避免中间人攻击。证书涉及了很多密码学知...

    云水木石
  • 当微信小程序遇上TensorFlow:Server端实现补充

    在前面一篇文章《当微信小程序遇上TensorFlow:Server端实现》中,我们探讨了微信小程序server端的实现。今天在调试微信小程序时才发现一个问题,那...

    云水木石
  • [序列模型] Recurrent Neural Networks习题解析

    圆括号(i)代表第i个样本,尖括号<j>代表第j个词,考虑到主次,第(i)个样本是主,第<j>个词是次,所以答案是选项1。

    云水木石
  • [论文解读]微信看一看实时Look-alike推荐算法

    微信看一看的精选文章推荐(见下面图1)大家应该都用过,微信团队在今年发表了一篇文章来专门介绍精选推荐的算法实现细节(Real-time Attention ba...

    week
  • django 多数据库及分库实现方式

    在settings里面的DATABASES是一个字典,用于定义需要的数据库,如下,一共定义了两个数据库。

    砸漏
  • 【微信分享】李滔:搜狐基于Spark的新闻和广告推荐实战

    用户1737318
  • samba

    2)增加用户:smbpasswd -a username  ,注:username为linux用户

    用户1396155
  • 一种绕过Android P对非SDK接口限制的简单方法

    众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制。这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次...

    weishu
  • Linux系列教程(十四)——Linux用户和用户组管理之相关配置文件

      前面我们介绍了软件包管理。首先介绍了rpm包的相关命令,但是我们发现直接安装rpm包会被其依赖性折磨的不行,然后解决办法是yum在线管理,通过yum命令安装...

    IT可乐
  • 如何设计并执行一场「创意工作坊」

    概念设计初期,为了让项目成员都有参与感,也为了收集更多维的思考角度,我们会邀请不同角色的人参与到创意工作坊中来。但工作坊绝不是将参与者集合在一起讨论几个问题这么...

    Shawn.W

扫码关注云+社区

领取腾讯云代金券