Go 1.12发布开始支持TLS 1.3

Go团队在发布1.11版本后6个月,发布了Go 1.12,这个版本没有添加语言功能,但是加入了TLS 1.3,并改进了模块支持,为即将在Go 1.13成为默认做准备,另外还支持Windows Arm系统,同时也改进了macOS和iOS向前兼容性。

Go 1.12加入了对TLS 1.3的支持,开发者可以在GODEBUG环境变量中增加tls13=1激活,而官方预告,TLS 1.3在Go 1.13将会默认激活。除了在ConnectionState中的TLSUnique以及重新协商功能外,所有的TLS 1.2功能都可以在TLS 1.3中使用,并获得相同或更好的安全性和性能。

虽然TLS 1.3向后兼容以前的版本,但是部分老旧系统可能无法正确执行,像是RSA凭证密钥太小不安全,就无法和TLS 1.3一起使用。 TLS 1.3密码组件无法配置,官方提到,所有密码组件的支持都是安全的。

另外,目前不支持早期数据(Early Data,0-RTT模式),而且当客户端送出早期数据,Go 1.12服务器也不支持略过意料之外的早期数据,因为在TLS 1.3 0-RTT模式,客户端会留存服务器支持0-RTT的状态,因此Go 1.12服务器所在的负载均衡池,不能有部分服务器支持0-RTT。当客户端要转换域名,从一个支持0-RTT的服务器转到Go 1.12服务器上,则必须在切换前禁用0-RTT,以保持运行不中断。

在模块支持方面,当GO111MODULE选项设为激活时,Go命令现在支持在模块目录之外的模块感知操作,不过,前提是这些操作不需要解析相对于当前目录的导入路径,或也不需要明确地编辑go.mod文件。下载和解压缩模块的Go命令,现在可以安全的同时使用。

go.mod文件现在会指示该模块使用的语言版本,如果没有存在当前版本,系统则转而使用Go 1.12,当模块指定的语言版本比工具链的还要新,则Go命令会直接尝试构建,除非构建失败才会发出通知。