啥?双证书?

国密标准对于SSL通信定义得不是很清楚,所能依仗的标准只有《GMT 0024-2014 SSL VPN 技术规范》。在文档中提到,国密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: --p=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,最后介绍了双证书的生成和测试环境配置。

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

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
Freeradius证书是一种用于身份验证的安全机制。证书验证使用了服务器证书和客户端证书,以确保通信方的身份真实可信。 在证书验证中,服务器和客户端都拥有各自的证书。服务器证书用于验证服务器的身份,而客户端证书用于验证客户端的身份。这种向验证机制可以防止恶意活动和非法访问。 当客户端想要访问被保护的资源时,首先将发送自己的证书给服务端,证明自己的身份。服务器接收到客户端证书后,会使用预先设置好的可信证书进行验证。只有在验证通过的情况下,服务器才接受客户端的请求,并向客户端返回服务器证书。 对于证书验证,必须确保服务器和客户端都拥有有效的证书。服务器证书通常由受信任的证书颁发机构(CA)签发,并包含了服务器的公钥和其他相关信息。客户端证书也可以由CA签发,也可以由服务器进行签发。这些证书应该在网络环境中进行保护,以防止被篡改或盗取。 Freeradius作为一种开源的RADIUS服务器软件,可以通过配置文件来启用证书验证。在配置文件中,可以指定服务器和客户端证书的位置和相关的验证规则。同时,还可以设置其他参数,如证书有效期、CA的根证书等。 证书验证为网络通信提供了更高的安全性,防止了身份伪造和未经授权的访问。在敏感数据传输和访问控制方面,使用证书验证是一种可靠的安全解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水木石

但行好事,莫问前程

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值