SSL原理与实践(三)国密TLS

这篇具有很好参考价值的文章主要介绍了SSL原理与实践(三)国密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):

SSL原理与实践(三)国密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协议流程图:

SSL原理与实践(三)国密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客户端发送请求
    SSL原理与实践(三)国密TLS

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

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

概览图

SSL原理与实践(三)国密TLS

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

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

Client Hello消息

SSL原理与实践(三)国密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消息。

SSL原理与实践(三)国密TLS

从上图我们可以了解到:

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

服务端签名证书:

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

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

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

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

practical-crypto测试程序服务端使用的加密证书
SSL原理与实践(三)国密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-619071.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

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

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

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

相关文章

  • 微信小程序原生开发功能合集十五:个人主页功能实现

      本章个人主页功能实现,展示当前登录用户信息、个人主页、修改密码、浏览记录、我的收藏、常见问题、意见反馈、关于我们等界面及对应功能实现。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实

    2024年02月06日
    浏览(88)
  • 微信小程序之自定义组件(OA项目个人主页及投票)

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

    2024年02月05日
    浏览(43)
  • SSL/TLS 协议信息泄露漏洞(CVE-2016-2183)【原理扫描】

    SSL/TLS协议 RC4信息泄露漏洞被扫描出来,一般出现的问题在ssh和https服务上使用了DES、3DES算法,禁用这些算法就好了 1.使用nmap扫描出来: nmap -sV --script ssl-enum-ciphers -p 443 ip 2.使用绿盟扫描 显示CVE-2016-2183漏洞 apache: 1.禁止apache服务器使用RC4加密算法 2.重启apache服务 Nginx: 1.禁止

    2024年02月09日
    浏览(64)
  • SSL/TLS协议的概念、工作原理、作用以及注意事项

    个人主页: insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念

    2024年02月10日
    浏览(41)
  • 什么是HTTPS加密协议?HTTPS安全传输原理,SSL和TLS介绍,NGINX如何配置SSL证书

    HTTPS是超文本传输协议(HTTP)的安全版本。它使用SSL(安全套接层)或TLS(传输层安全)加密协议来保护数据传输的安全性和机密性,以防止未经授权的访问和窃听。HTTPS协议通常用于处理敏感信息,如在线支付或登录凭证等。可以通过URL的前缀来识别一个网站是否使用了H

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

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

    2024年02月08日
    浏览(36)
  • SSL/TLS RC4 信息泄露漏洞(CVE-2013-2566)【原理扫描】修复方案

    SSL/TLS协议 RC4信息泄露漏洞被扫描出来,一般出现的问题在ssh和https服务上使用了RC4算法,修改配置文件就可以了 1.使用nmap扫描出来: nmap -sV --script ssl-enum-ciphers -p 443 ip 2.使用绿盟扫描 扫描出来显示CVE-2013-2566 apache: 1.禁止apache服务器使用RC4加密算法 2.重启apache服务 Nginx: 1.禁

    2024年02月16日
    浏览(41)
  • 微信使用证书退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道

    解决方法:IIS-》应用程序池-》高级设置-》进程模块-》加载用户配置文件,设置为True就可以了。

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

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

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

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

    2024年02月06日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包