TLS原理与实践(四)国密TLS

这篇具有很好参考价值的文章主要介绍了TLS原理与实践(四)国密TLS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主页

  • 个人微信公众号:密码应用技术实战
  • 个人博客园首页:https://www.cnblogs.com/informatics/

引言

TLS作为保证网络通信安全的关键技术和基石被广泛应用,但目前主流国内外网站仍然使用国际TLS协议,即:TLS1.2TLS1.3。随着国内《网络安全法》、《密码法》和《数据安全法》等法律法规的颁布和实施,国密TLS在国内关键领域也逐渐被应用。
支持国密TLS具有以下重要意义:

  • 数据保护:国密TLS使用了国密算法,减少了对国际密码算法的依赖,降低了使用国际算法可能造成的安全隐患
  • 自主可控:技术自主可控,降低了对国际技术的依赖,提高国内密码技术的自主研发能力
  • 合规要求:在某些行业,使用国际算法不符合法律法规和监管要求

国密标准GB/T 39786网络和通信安全层面的密码应用提出了明确的技术要求,涉及通信主体的各个要素, 都需要进行密码技术改造,支持国密TLS。这也是密评中对于“网络和通信安全“的基本技术要求。

本文内容组织如下:

  • 简介
  • 协议原理
  • wireshark抓包分析
  • 总结&参考文献

简介

国密TLS,又称GMTLS1.1,涉及的主要标准有:

  • 《信息安全技术 传输层密码协议(TLCP)》,即GB/T 38636-2020
  • 《SSL VPN技术规范》,即GM/T 0024-2014
  • 上述协议关联标准:如数字证书标准GB/T 20518, SM2密码算法标准GB/T 35275

注:《SSL VPN技术规范》作为行业标准,部分内容已上升为《信息安全技术 传输层密码协议(TLCP)》国密标准, 后文中介绍的内容以后者为准。

GMTLS1.1中的1.1代表国密TLS的版本号: 0x0101。众所周知,目前TLS协议支持的版本:

	VersionTLS10 = 0x0301
	VersionTLS11 = 0x0302
	VersionTLS12 = 0x0303
	VersionTLS13 = 0x0304

目前主流的TLS软件程序实现中,通信实体在建立TLS连接时,会优先协商使用最大版本号TLS协议 (版本号越大意味着安全性越高、性能越好),因此VersionGMSSL = 0x0101 版本号的设定增加了软件支持的复杂度,这也是阻碍GMTLS1.1广泛应用的一个重要原因。(估计国密TLS协议制定者都是一帮学术大佬,实践经验不足)

GMTLS1.1中相关的密码套件(图片来自GB/T 38636-2020):

TLS原理与实践(四)国密TLS

从图中可以了解到GMTLS1.1:

  • 密钥交换算法包含ECDHE、ECC、IBSDH、IBC以及RSA,其中IBC和IBSDH主要涉及到SM9标识密码算法
  • 加密算法只有SM4,加密模式涉及两种方式:CBCGCM
  • 校验算法/哈希算法包含:SM3和SHA256

注:从上图中我们还可以了解到,在GMTLS1.1支持的套件中,包含了国际算法RSA和SHA256,这里从公开文献中未找到具体原因,大胆猜测主要是为了:

  • 支持国际知名CA机构颁发的数字证书
  • 作为一种切换到全国密TLS过度

协议原理

GMTLS1.1协议主要参考了TLS1.1,并借鉴了TLS1.2的部分内容。在关键流程上基本一致,只是在密码算法使用上用国密算法国际算法j进行了替换(从这里可以看到,GMTLS1.1在协议原理上并未有太大创新,基本照搬)。 这里附一张GMTLS1.1协议流程图:

TLS原理与实践(四)国密TLS

由于协议流程与TLS1.2一致,这里不再赘述,可以参考之前的文章:《TLS原理与实践(一)》

Wireshark抓包分析

下面我们通过示例代码wireshark抓包分析来详细介绍GMTLS1.1协议流程,后文Wireshark抓包分析主要介绍与TLS1.2不同的地方。

在示例中,涉及到的工具有:

  • wireshark: 网络抓包和分析软件,这里使用的版本为Version 4.0.7 (v4.0.7-0-g0ad1823cc090),注意4.0之前的版本可能不支持GMTLS1.1,官网为 https://www.wireshark.org
  • practical-crypto: 用于模拟支持GMTLS1.1协议的https服务和客户端,github仓库 https://github.com/warm3snow/practical-crypto.git

practical-crypto介绍

# 下载示例代码
➜  practical-crypto git:(master) git clone https://github.com/warm3snow/practical-crypto.git

# 查看示例代码目录结构
➜  practical-crypto git:(master) tree tls
tls
├── gmtls
│   └── gmtls1_1.go # 使用国密TLS的https服务
├── notls               #无tls保护http服务
│   └── notls.go
├── readme.md           #帮助文档
├── tls1.2              # 使用tls1.2协议的http服务
│   └── tls1_2.go
├── tls1.3              # 使用tls1.3协议的http服务
│   └── tls1.3.go
└── tlsclient.go        # http客户端,可以发起http或https请求

# 查看国密证书生成脚本
➜  practical-crypto git:(master) cat openssl/generate_sm2_cert.sh 
#!/bin/sh
# 1. 设置证书主体subject
SUBJ="/C=CN/ST=BeiJing/L=BeiJing/O=warm3snow/OU=Server/CN=localhost"

# 2. 生成签名证书 (openssl 1.1.x以上版本支持sm2, 或者tassl、gmssl)
gmssl ecparam -genkey -name SM2 -text -out ./gmcerts/server_sign.key
gmssl req -new -key ./gmcerts/server_sign.key -out ./gmcerts/server.csr -subj $SUBJ
gmssl x509 -req -days 3650 -sm3 -in ./gmcerts/server.csr  -signkey ./gmcerts/server_sign.key -out ./gmcerts/server_sign.crt \
-extfile ./openssl.cnf -extensions v3_req_sign

# 3. 生成加密证书
gmssl ecparam -genkey -name SM2 -text -out ./gmcerts/server_enc.key
gmssl req -new -key ./gmcerts/server_enc.key -out ./gmcerts/server.csr -subj $SUBJ
gmssl x509 -req -days 3650 -sm3 -in ./gmcerts/server.csr  -signkey ./gmcerts/server_enc.key -out ./gmcerts/server_enc.crt \
-extfile ./openssl.cnf -extensions v3_req_enc

注意在支持gmtls1.1的https服务中,引用了第三方实现包(golang语言实现), 主要代码如下:

import (
	tls "github.com/warm3snow/gmsm/gmtls" //1.  支持GMTLS1.1的tls协议实现包
	"log"
	"net/http"
)

func HelloHandler(w http.ResponseWriter, r *http.Request) {  // 2. 服务端hello响应实现函数
	log.Printf("Received connection: %s", r.RemoteAddr)
	w.Write([]byte("Hello, world!"))
}

func main() {
	// 设置handler
	mux := http.NewServeMux()
	mux.HandleFunc("/", HelloHandler)

	// 3. 加载服务端签名证书和签名私钥
	signKeyPair, err := tls.LoadX509KeyPair("../../openssl/gmcerts/server_sign.crt", "../../openssl/gmcerts/server_sign.key")
	if err != nil {
		log.Fatalf("LoadX509KeyPair: %v", err)
	}

	// 4. 加载服务端加密证书和加密私钥
	encKeyPair, err := tls.LoadX509KeyPair("../../openssl/gmcerts/server_enc.crt", "../../openssl/gmcerts/server_enc.key")
	if err != nil {
		log.Fatalf("LoadX509KeyPair: %v", err)
	}
	// 5. 设置GMTLS1.1配置项
	tlsCfg := &tls.Config{
		GMSupport:    tls.NewGMSupport(),
		Certificates: []tls.Certificate{signKeyPair, encKeyPair},
		MaxVersion:   tls.VersionTLS12,
	}
	ln, err := tls.Listen("tcp", ":8443", tlsCfg)
	if err != nil {
		log.Fatalf("Listen: %v", err)
	}

    // 6. 其中https服务
	err = http.Serve(ln, mux)
	if err != nil {
		log.Fatalf("Serve: %v", err)
	}
}

从上述代码中,我们可以看到GMTLS1.1需要设置两个证书,一个是签名证书,用于签名验证;一个是加密证书,用于数据加密(这里指的是握手过程中涉及到的加密)。这种双证书体系使得证书的这两种功能(加密和签名验证)能够使用不同证书来单独处理,提高了安全性。

启动服务并进行抓包

  • 启动https服务,并使用tlsClient客户端发送请求
    TLS原理与实践(四)国密TLS

  • 打开wireshark并进行抓包设置
    TLS原理与实践(四)国密TLS

从左上角图的最后输出我们可以看到,GMTLS1.1协议执行完成,服务端最终返回了Hello world!消息。

概览图

TLS原理与实践(四)国密TLS

从概览图中,我们可以了解到:

  • 客户端和服务端通信使用了GMTLSv1协议,即GMTLS1.1
  • GMTLS1.1握手协议发送的消息类型与TLS1.2完全一致
  • 握手完成后,进行了应用数据Application Data通信

Client Hello消息

TLS原理与实践(四)国密TLS

从Client Hello消息中,我们可以看出:

  • 协议版本号:客户端使用的协议版本号为GMTLS(0x0101)
  • 加密套件:客户端支持的GMTLS加密套件有4个, 并不是标准里面的12个(这与测试程序引用的gmtls实现包有关系, 目前仅支持4个国密tls加密套件),分别为:
          Cipher Suite: ECC_SM4_CBC_SM3 (0xe013)
          Cipher Suite: ECC_SM4_GCM_SM3 (0xe053)
          Cipher Suite: ECDHE_SM4_CBC_SM3 (0xe011)
          Cipher Suite: ECDHE_SM4_GCM_SM3 (0xe051)

Server Hello消息

服务端发送ServerHello消息后,紧接着发送了Certificate消息。

TLS原理与实践(四)国密TLS

从上图我们可以了解到:

  • 服务端TLS版本号:服务端和客户端握手过程中使用了GMTLS1.1协议
  • 协商使用的加密套件:服务端和客户端最终协商使用了ECC_SM4_CBC_SM3加密套件。注意我们在测试用例中并未指定使用的加密套件,服务端和客户端默认协商使用排在加密套件列表最前端的一个,参考上文Client Hello发送的加密套件列表。
  • 服务端返回的签名证书,从图中可以看出服务端返回了我们在启动服务时在代码中设置的签名证书
  • 服务端返回的加密证书,从图中可以看出服务端返回了我们在启动服务时在代码中设置的加密证书

服务端签名证书:

  • Wireshark抓包详情(Certificate消息)
    TLS原理与实践(四)国密TLS

  • practical-crypto测试程序服务端使用的签名证书
    TLS原理与实践(四)国密TLS

从上面两张图可以看出:抓包显示证书的KeyUage - digitalSignature字段,和服务端启动设置证书的X509v3 Key Usage - Digital Signature字段对应,都为签名证书。(实际上我们这里想要说明的是发送的签名证书无误,由于签名证书和加密证书的证书主体Subject字段是一致的,我们这里用证书KeyUsage进行区分)

服务端加密证书
Wireshark抓包详情(Certificate消息)
TLS原理与实践(四)国密TLS

practical-crypto测试程序服务端使用的加密证书
TLS原理与实践(四)国密TLS

从上面两张图可以看出:抓包显示证书的KeyUage - keyEncipherment字段,和服务端启动设置证书的X509v3 Key Usage -KeyEncipherment字段对应,都为加密证书。(实际上我们这里想要说明的是发送的加密证书无误,由于签名证书和加密证书的证书主体Subject字段是一致的,我们这里用证书KeyUsage进行区分)*

结论

GMTLS1.1作为中国密码技术的重要组成部分,在国内重要领域已广泛应用,也是密评评测指标中的关键卡点。本文结合TLS1.2协议流程以及GMTLS1.1协议demo程序和Wireshark抓包,对其进行了详细介绍。

目前主流计算机语言(JAVA、Python、NodeJs以及Golang等)官方都未支持GMTLS1.1,国密TLS协议包基本都是国内开发者基于主流语言的TLS程序报进行的二次开发,在实际应用和推广中仍然存在不少阻力,因此GMTLS1.1国际化任重道远。

顺便多一句:GMTLS1.1由于版本号的原因,够呛能够国际化。 TLS1.3支持国密算法倒是值得尝试(目前已有人提交了提案,有兴趣的可以参考 -> https://datatracker.ietf.org/doc/html/rfc8998文章来源地址https://www.toymoban.com/news/detail-619110.html

参考资料

  • 信息安全技术 传输层密码协议(TLCP)
  • SSL VPN技术规范
  • wireshark: https://www.wireshark.org
  • practical-crypto: https://github.com/warm3snow/practical-crypto.git
  • TLS1.2 RFC: https://www.ietf.org/rfc/rfc5246.txt
  • TLS1.3 RFC: https://datatracker.ietf.org/doc/html/rfc8998

到了这里,关于TLS原理与实践(四)国密TLS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序之自定义组件(OA项目个人主页及投票)

    本期为大家带来微信小程序自定义组件及OA项目的个人主页布局和投票 自定义组件 / 介绍 (qq.com)  2.1 创建目录 在根目录下依次创建components/tabs,然后在tabs中新建Component 创建好后会自动为我们生成对应的文件 2.2添加配置文件(关闭检查) 在根目录下的project.config.json中的settin

    2024年02月05日
    浏览(31)
  • 国密商用密码SM3杂凑算法原理分析与Java实现

    国密SM3算法是我国自研设计的商用密码杂凑算法,是在SHA-256的基础上进行改造的,其安全性与SHA-256相当。《SM3密码杂凑算法》于2010年12月份由国家密码管理局首次发布。后于2012年发布为密码行业标准《GM/T 0004-2012 SM3密码杂凑算法》,2016年发布为国家密码杂凑算法标准《GB

    2024年02月04日
    浏览(33)
  • TLS详解之原理和实践(一)

    个人微信公众号:密码应用技术实战 个人博客园首页:https://www.cnblogs.com/informatics/ 本文主要内容涉及到TLS协议 发展历程 、TLS 协议原理 以及在 HTTPS中的应用 ,以希望读着对TLS协议的基本工作原理和实际应用有个基本认识。 我们在访问网站的时候经常会碰到以下两种情况:

    2024年02月08日
    浏览(28)
  • 使用ChatGPT加个人微信公众号打造属于自己的AI助手

    相信现在不少人已经体验过ChatGPT,并被它的智能程度所折服。ChatGPT可以高效的完成许多事,但就目前来说使用还是限制不少,如何进一步使用它和如何更加方便使用它是现在许多人的思考问题。在此,给各位介绍一下如何使用微信公众号和ChatGPT打造成一个方便的个人助手。

    2023年04月17日
    浏览(102)
  • 个人微信公众号文章留言功能开通方法,无需迁移账号,三个步骤轻松完成

    总所周知。微信公众号关闭了2018年以后开通的微信公众号的评论管理功能。这样其实对于个人账号而言不太方便。现在常见的方法是迁移到别人在18年之前的账号上去,但是这个操作很麻烦,而且账号也不一定能弄到,还需要花费大加强。 实际上,公众号原创图文是可以插入

    2024年02月06日
    浏览(33)
  • uniapp小程序中长按识别公众号二维码,企业微信二维码,个人微信二维码

    长按识别公众号二维码,企业微信二维码,个人微信二维码 效果图 通过给image标签添加show-menu-by-longpress=\\\"true\\\"属性,实现长按识别功能 注意:二维码图片样式尺寸不能太小,太小时也会出现长按二维码识别不了

    2024年02月12日
    浏览(43)
  • PHP实践:手把手微信公众号网页授权登录功能实现

    🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🏆另有专栏PHP入门基础教程,希望各位大佬

    2024年02月12日
    浏览(39)
  • 23.实战演练--个人主页

    2024年01月19日
    浏览(44)
  • 制作github个人主页

    github创建一个项目命名为.github.io git clone一个他人的主页作为模板 按情况修改readme.md, index.html中名字,邮箱,github,google scholor 如果您创建的 .github.io 仓库的 部分与您的 GitHub 用户名不一样,您需要通过 GitHub Pages 设置来指定要使用的用户名。以下是具体的步骤: 进入 .github

    2024年01月25日
    浏览(41)
  • 个人Scratch HTML程序合集 主页

    个人Scratch HTML程序合集 主页 此程序是本人制作的Scratch HTML程序合集的主页,使用HTML+CSS编写,整合了本人近期发布的转换为HTML的Scratch程序的内容,可以通过主页内的链接打开相应的程序和博客。主页在本地运行,大家可以在github.com下载主页文件及相关资源。 代码如下

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包