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语言模拟while语句实现无限循环的方法

    Go语言模拟while语句实现无限循环的方法

    这篇文章主要介绍了Go语言模拟while语句实现无限循环的方法,实例分析了for语句模拟while语句的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go语言中strings和strconv包示例代码详解

    Go语言中strings和strconv包示例代码详解

    这篇文章主要介绍了Go语言中strings和strconv包示例代码详解 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Go语言defer语句的三种机制整理

    Go语言defer语句的三种机制整理

    在本篇文章里小编给大家分享的是一篇关于Go语言defer语句的三种机制整理,需要的朋友们学习下吧。
    2020-03-03
  • Go语言中的逃逸分析究竟是什么?

    Go语言中的逃逸分析究竟是什么?

    这篇文章主要介绍了Go语言中的逃逸,套哟究竟是什么呢?通俗来讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了“逃逸”。下面文章将详细介绍Go语言中的逃逸,需要的朋友可以参考一下
    2021-09-09
  • 如何使用腾讯云go sdk 查询对象存储中最新文件

    如何使用腾讯云go sdk 查询对象存储中最新文件

    这篇文章主要介绍了使用腾讯云go sdk 查询对象存储中最新文件,这包括如何创建COS客户端,如何逐页检索对象列表,并如何对结果排序以找到最后更新的对象,我们还展示了如何优化用户体验,通过实时进度更新和检索多个文件来改进程序,需要的朋友可以参考下
    2024-03-03
  • Go语言线程安全之互斥锁与读写锁

    Go语言线程安全之互斥锁与读写锁

    这篇文章主要介绍了Go语言线程安全之互斥锁与读写锁,互斥锁是为了并发的安全,在多个goroutine共同工作的时候,对于共享的数据十分不安全,而读写锁效率革命,使用锁的时候,安全与效率往往需要互相转换,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • Golang使用lua脚本实现redis原子操作

    Golang使用lua脚本实现redis原子操作

    这篇文章主要介绍了Golang使用lua脚本实现redis原子操作,本文通过实例代码给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Go 计时器使用示例全面讲解

    Go 计时器使用示例全面讲解

    这篇文章主要为大家介绍了Go 计时器使用示例全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Golang中重复错误处理的优化方法

    Golang中重复错误处理的优化方法

    这篇文章主要给大家介绍了关于Golang中重复错误处理优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Golang Recover处理错误原理解析

    Golang Recover处理错误原理解析

    Golang 中的 recover 是一个鲜为人知但非常有趣和强大的功能,让我们看看它是如何工作的,以及在 Outreach.io 中如何利用它来处理 Kubernetes 中的错误
    2023-12-12

最新评论