Golang中TLS版本设置的实现步骤

 更新时间:2025年11月07日 09:52:32   作者:叨陪鲤  
文本文介绍了在Golang中配置TLS版本,包括TLS1.2和TLS1.3的支持,通过修改http服务端的TLSConfig参数,可以指定最小和最大TLS版本,下面就来具体介绍一下,感兴趣的可以了解一下

Golang中TLS版本设置


1. Go源码中的TLS

最近在看Go源码中的http框架tls实现框架实现,go中的TLS实现了TLS1.0, TLS1.1, TLS1.2, TLS1.3 四个版本,还有SSL3.0版本, 不过代码中已经明确说明不再支持SSL3.0版本。

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

	// Deprecated: SSLv3 is cryptographically broken, and is no longer
	// supported by this package. See golang.org/issue/32716.
	VersionSSL30 = 0x0300
)

TLS 握手过程中,优先采用TLS1.3版本,然后依次是:TLS1.2, TLS1.1, TLS1.0。 当前网络上的TLS版本正处于从TLS1.1及以下版本往TLS1.2版本上升级,大多数已经开始使用TLS1.2版本。不过已经有很多应用支持TLS1.3版本,比如说浏览器(包括Chrome,IE,FireFox等主流浏览器),Postman工具、Eolinker工具等都已经支持TLS1.3。

我最初看到的TLS握手是这样的:

但是在看go的tls源码时,流程上报文交互有很大的差距,后来又通过断点debug的方式确定了是由于TLS版本不同导致的,这才开始了解TLS1.2 与 TLS1.3版本之间的异同,这里暂不介绍他们之间的关系。后来为了继续看TLS1.2(上图交互流程)的实现,尝试了各种浏览器、Linux中的wget, windows上的postman, eolink等,他们默认都是采用TLS1.3版本。 

2. https服务端修改TLS支持版本

go代码中实现起来非常方便,http包中提供了使用默认配置的接口ListenAndServeTLS。它实现了一个默认的Server结构

func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServeTLS(certFile, keyFile)
}

其中,TLS参数配置是Server结构中的一个成员:TLSConfig *tls.Config。因此我们只需要实现一个Server结构,然后配置其中的TLSConfig *tls.Config即可。

实现如下:

package main

import (
	"crypto/tls"
	"fmt"
	"net/http"
)

func HelloWorld(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "hello world")
}

func main() {/*默认情况下*/
	http.HandleFunc("/", HelloWorld)

	err := http.ListenAndServeTLS(":10443", "./cert/server.crt", "./cert/server.key", nil)
	if err != nil {
		fmt.Println(err)
	}
}

func main() {/*修改TLS版本*/
	http.HandleFunc("/", HelloWorld)

	server := &http.Server{
		Addr:    ":8443",
		Handler: nil,
		TLSConfig: &tls.Config{
			MinVersion: tls.VersionTLS12,
			MaxVersion: tls.VersionTLS12,
		},
	}

	err := server.ListenAndServeTLS("./cert/server.crt", "./cert/server.key")
	if err != nil {
		fmt.Println(err)
	}
}

3. 抓包验证

关于Wireshark中的TLS版本显示问题:

wireshark标注tls所属版本,并不是通过当前报文来标注的,而是类似于会话的方式进行标注

目前ClientHello报文,需要兼容TLS1.3, TLS1.2,…等多个版本,仅从ClientHello无法判断出当前的版本。TLS版本是在ServerHello中确定的。

TLS1.2 ServerHello报文:

TLS1.3 ServerHello报文:

从这两张图上应该可以看出:TLS1.2与TLS1.3 的握手报文中version字段填充的都是0x0303,也就是TLS1.2版本,如果是TLS1.3,则是通过扩展字段supported_version来确定的。

到此这篇关于Golang中TLS版本设置的实现步骤的文章就介绍到这了,更多相关Golang TLS版本设置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    这篇文章主要介绍了Go 高效截取字符串的一些思考,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • golang 函数返回chan类型的操作

    golang 函数返回chan类型的操作

    这篇文章主要介绍了golang 函数返回chan类型的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用 Go 管理版本的方法示例

    使用 Go 管理版本的方法示例

    这篇文章主要介绍了使用 Go 管理版本的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Go 错误处理实践总结示例

    Go 错误处理实践总结示例

    这篇文章主要为大家介绍了Go错误处理实践的总结示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang环境搭建及打包和工具链详解

    Golang环境搭建及打包和工具链详解

    这篇文章主要介绍了Golang环境搭建及打包和工具链,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • golang 实用库gotable的具体使用

    golang 实用库gotable的具体使用

    使用gotable框架以实现在CLI命令行界面中打印表格。本文就介绍一下golang 实用库gotable的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 在Golang中读写CSV文件的操作指南

    在Golang中读写CSV文件的操作指南

    CSV(逗号分隔值)文件是一种常见的数据存储格式,广泛应用于数据导入、导出、分析和交换等场景,在Golang中,有许多库和工具可以帮助我们读取和写入CSV文件,使数据处理变得简单而高效,本文将深入探讨如何在Golang中使用标准库以及第三方库来读写CSV文件
    2023-11-11
  • Golang动态数组的实现示例

    Golang动态数组的实现示例

    动态数组能自动调整大小,与静态数组不同,其大小不固定,可根据需求变化,实现通常依赖于数据结构如链表或数组加额外信息,本文就来介绍一下Golang动态数组的实现示例,感兴趣的可以了解一下
    2024-10-10
  • Go中的Context实现原理以及正确使用方式

    Go中的Context实现原理以及正确使用方式

    在 Go 语言中,Context 包是一种非常常用的工具,它被用来管理 goroutine 之间的通信和取消,本文将深入探讨Context 包的基本原理,包括使用场景、原理和一些最佳实践,感兴趣的小伙伴跟着小编一起来看看吧
    2024-11-11
  • Go 每日一库之termtables的使用

    Go 每日一库之termtables的使用

    本文主要介绍了Go 每日一库之termtables的使用,termtables处理表格形式数据的输出。是一个很小巧的工具库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论