本文永久链接 – https://tonybai.com/2026/10/23/go-urgent-security-release-ca-certificate-trust-crisis

大家好,我是Tony Bai。

【导读】

2026 年 10 月 19 日,Go 项目紧急发布 Go 1.26.10 和 Go 1.27.3。此次更新只涉及一项安全修复,却触及 HTTPS 信任体系的核心:Go 将一小批存在特定安全隐患的中间证书列入不信任范围,阻止包含这些证书的验证链通过 crypto/x509 的验证。

这不是一次普通的功能更新。它背后涉及 CA 的信任边界、证书撤销机制、操作系统信任库,以及 Go 程序静态编译和部署方式带来的安全响应难题。

本文从此次安全事件出发,拆解证书链验证的工作原理,分析 Go 为什么要主动拒绝部分证书链,并给出可运行的 Go 代码和一套生产环境升级检查清单。

【文章要点】

  • 安全事件:Go 1.26.10 和 Go 1.27.3 于 2026 年 10 月 19 日发布,修复 CVE-2026-111943。
  • 问题本质:一部分中间证书不再被认为可信,正常的签名校验和有效期检查不足以证明整条证书链仍然安全。
  • 技术机制:Go 在 crypto/x509 的证书链验证路径中增加针对特定中间证书的拒绝逻辑。
  • 工程影响:Go 工具链升级与生产二进制升级是两回事;旧二进制不会因为开发机安装了新版本 Go 就自动获得修复。
  • 实践建议:检查实际构建版本、重建和部署服务、验证证书链,并审视容器镜像、静态二进制及自定义根证书配置。


2026 年 10 月,软件安全领域接连出现值得关注的事件。对于 Go 开发者而言,10 月 19 日是一个需要记住的日期:Go 团队紧急发布了 Go 1.26.10 和 Go 1.27.3。

这次更新没有引入新的语言特性,也没有带来令人兴奋的性能提升。它只包含一项安全修复,却直接触及互联网安全体系最重要的基础设施之一:TLS 证书信任。

官方公告给出的理由很明确:由于某个特定证书颁发机构存在安全方面的顾虑,Go 将一小批中间证书列入不信任范围。今后,crypto/x509 在执行证书链验证时,会过滤掉包含这些中间证书的验证链,不再将其作为有效结果返回。

此次漏洞编号为 CVE-2026-111943,对应 Go issue #82345。Go 团队明确建议用户立即升级。

官方发布公告:Go 1.27.3 和 Go 1.26.10 安全更新。

这次事件值得关注的地方,不只是 Go 又发布了一次安全补丁,更在于它揭示了一个容易被忽视的事实:

HTTPS 的安全,不仅取决于证书是否有效、签名是否正确,还取决于我们是否仍然愿意信任签发这张证书的整条链路。

对于使用 Go 构建 API 服务、网关、微服务、云原生基础设施和网络客户端的团队来说,这次更新也是一次重新审视安全更新流程的机会。

一次只有一个修复项的紧急发布

先看此次安全更新的基本信息。

项目 内容
发布时间 2026 年 10 月 19 日
Go 1.26 系列 Go 1.26.10
Go 1.27 系列 Go 1.27.3
漏洞编号 CVE-2026-111943
主要影响组件 crypto/x509
修复目标 阻止包含特定不可信中间证书的验证链通过验证
官方建议 尽快升级

这里有两个细节值得注意。

首先,这是针对证书信任问题的定点修复,而不是 Go 语言语法、编译器优化或者运行时行为的一次常规调整。修复发生在 Go 标准库的 crypto/x509 中,而这个包承担着 X.509 数字证书解析、证书链验证等关键工作。

其次,Go 官方将该问题归入安全策略中的 URGENT 处理通道。Go 的安全策略将这类问题定义为可能威胁 Go 生态完整性,或者正在被利用并造成严重损害的安全事件。此次公开 issue 也明确标注了这一处理背景。

不过,需要准确区分两件事:进入 URGENT 通道意味着项目方认为问题需要紧急处理,并不等于已经公开证实所有受影响证书都被攻击者利用,也不等于所有 Go HTTPS 程序都已遭到入侵。

真正需要开发者关注的,是这次修复改变了哪些证书链能够通过验证,以及自己的生产程序是否已经包含这项修复。

为什么一张签名正确的证书,也可能不再可信?

要理解这次更新,必须先回到 HTTPS 的基础机制。

当 Go 程序通过 HTTPS 访问一个服务时,客户端不仅要建立加密连接,还要确认自己连接的确实是预期中的服务器,而不是一个能够冒充服务器的中间人。

TLS 证书在这个过程中承担着身份认证的作用。客户端通常需要验证证书的签名、有效期、主机名以及从服务器证书到受信任根证书的信任路径。

问题在于:证书上的数字签名正确,只能说明它与相应的签名密钥相匹配,并不能单独证明这张证书今天仍然值得信任。

证书链是如何建立的?

假设我们访问 api.example.com,服务器返回一张由中间 CA 签发的证书。这个中间 CA 又由一个根 CA 签发。

一条简化的证书链可以表示为:

图中的箭头表示签发关系,而不是网络请求方向。

在典型的证书验证过程中,客户端会检查:

  • 服务器证书是否由相应的中间 CA 签名。
  • 中间 CA 的证书是否能够继续连接到受信任的根证书。
  • 证书是否处于有效期内。
  • 证书用途、主机名及相关约束是否满足要求。
  • 最终建立的证书链是否符合客户端的信任策略。

如果所有检查都通过,客户端才可能接受这条证书链。

但这里存在一个关键问题:证书链中的某个 CA,即使过去曾经获得信任,也可能因为安全事件、密钥泄露疑虑、签发行为不符合要求或者其他安全原因而失去信任。

此时,单纯验证签名是不够的。

信任链中的一环出了问题,会发生什么?

可以把证书链理解成一份逐级背书的身份文件。

根 CA 信任某个中间 CA,中间 CA 为服务器签发证书,客户端再根据这条链判断服务器身份是否可信。

如果中间 CA 的可信性发生变化,那么过去可以通过验证的证书链,就不一定应该继续通过验证。

例如,攻击者如果掌握了某个 CA 的签名私钥,理论上就可能利用该私钥签发看起来具有正确签名的证书。对于没有其他约束的验证程序而言,签名本身无法区分合法签发与利用泄露密钥进行的伪造签发。

这里必须强调:这是解释 CA 风险的通用例子,并不意味着公开资料已经证明此次事件的全部具体原因就是私钥泄露。

Go issue 对此次事件的公开描述是:由于特定 CA 存在安全方面的顾虑,项目决定阻断一小批中间证书的信任。Hacker News 上的讨论进一步提出了围绕相关证书与证书透明度日志的推测,但社区讨论中的推测不应直接当作官方确认的事实。

这也解释了为什么安全修复不一定表现为修补一个传统意义上的程序漏洞。有时,程序的密码学计算本身没有出错,需要改变的是它接受什么样的信任关系。

Go 做了什么:主动拒绝特定中间证书

此次修复的技术落点是 Go 标准库 crypto/x509。

官方 issue 的描述很简洁:Go 将一小批中间证书列入不信任范围;Verify 会过滤包含这些中间证书的验证链,防止它们被返回给调用方。

这里的关键词是 Verify。

在 Go 中,X.509 证书的验证通常通过 x509.Certificate.Verify 完成。它根据验证选项、受信任根证书、中间证书和目标证书,寻找符合规则的验证链。

此次修复并不是关闭 TLS,也不是让 Go 对所有证书都采取更严格的统一规则,而是在证书链验证过程中,明确排除包含特定中间证书的链。

可以将修复前后的逻辑抽象为:

这张图是对验证思路的概念性说明,不是对 Go 内部实现细节的逐行复刻。

从安全工程角度看,这种设计有一个重要优点:当某个证书的可信性受到质疑时,不必等待所有系统、浏览器、应用和证书链都完成同步更新,Go 也可以通过自己的验证逻辑主动拒绝已知的不可信证书。

这是一种防御性措施。

它也有一个必然的代价:如果某个业务系统仍在使用包含这些中间证书的证书链,那么升级后,原本能够成功的 TLS 连接可能开始失败。

这并不意味着 Go 的 TLS 实现“坏了”,而是信任策略发生了变化。安全与兼容性之间的冲突,正是证书信任管理中最难处理的问题之一。

为什么修复发生在标准库?

因为 Go 的证书验证逻辑不只被某一个应用调用,大量网络客户端和服务端都可能依赖它。

例如:

  • 使用 net/http 访问外部 API 的程序。
  • 通过 crypto/tls 建立 TLS 连接的客户端。
  • 直接使用 crypto/x509 验证证书的业务代码。
  • 依赖标准库 TLS 能力的各类微服务和基础设施组件。

当这些程序通过 Go 标准库执行常规证书验证时,新的拒绝逻辑就有机会保护它们。

当然,具体影响仍取决于程序使用的 Go 版本、证书链、根证书来源,以及是否存在自定义验证逻辑。不能仅凭程序使用 HTTPS,就断言它必然受到实际攻击或者必然出现连接失败。

为什么不能只依赖证书撤销和操作系统信任库?

看到这里,一个自然的问题是:既然证书有问题,为什么不直接撤销它?为什么 Go 还要在标准库中增加额外的拒绝逻辑?

这实际上涉及互联网 PKI 体系中几个不同层次的信任管理机制。

证书撤销不是一个自动生效的全局开关

X.509 体系中存在证书撤销列表(CRL)和在线证书状态协议(OCSP)等机制,用于传递证书是否已经被撤销的信息。

从概念上看,流程很直接:

  1. CA 或相关机构确认某张证书不应继续被信任。
  2. 通过相应的撤销机制发布状态信息。
  3. 客户端查询或获取撤销状态。
  4. 客户端根据策略决定是否接受证书。

但现实世界并没有一个能够让所有客户端即时同步的全球统一撤销开关。

不同客户端可能采用不同的撤销策略;有些应用会查询在线状态,有些会使用缓存,还有些环境可能根本不进行实时撤销检查。网络不可用时如何处理、撤销信息过期时如何处理,也涉及安全性与可用性的权衡。

因此,撤销信息已经发布,不代表所有运行中的程序都会立即拒绝相应证书。

系统根证书库也不是所有问题的终点

许多 Go 程序会使用操作系统提供的根证书集合。例如,在常见平台上,Go 可以利用系统信任库完成根证书信任判断。

这意味着操作系统的根证书更新通常非常重要。

然而,根证书与中间证书不是同一个概念。

根证书通常是信任链的起点;中间证书则位于根 CA 与服务器证书之间。一个根证书仍然存在于信任库中,并不意味着由它签发的每一张中间证书都应该无限期地获得信任。

此次 Go 修复还有一个容易被忽略的背景:Go 官方漏洞数据库指出,在某些较窄的场景下,若不做额外操作,系统信任库可能不会及时更新。为降低这类环境中的残余风险,Go 在 crypto/x509 中增加了针对已知不可信中间证书的拒绝列表。

这就形成了多层防御:

第一层:证书自身的验证

检查签名、有效期、主机名、用途及证书链约束等条件。

第二层:平台信任库与撤销机制

根据系统根证书、证书撤销状态和客户端自身的验证策略,判断证书是否可信。

第三层:Go 的定点拒绝策略

对已经明确列入不信任范围的中间证书进行额外拦截,减少对平台更新时效的依赖。

这里有一个重要的边界:Go 的拒绝列表并不是完整的证书撤销系统,也不能替代操作系统更新、CA 治理和正常的证书验证。它是针对特定风险的一项补充措施。

这是不是意味着 Go 比浏览器更安全?

不能这样简单比较。

Hacker News 上的相关讨论提到,浏览器及其他生态也在处理相关 CA 的信任问题。有参与者讨论了证书透明度日志,以及浏览器如何通过更新信任库和相关撤销信息处理此类风险。

不同客户端拥有不同的更新机制和信任策略。浏览器可以通过自身的更新渠道管理信任状态,操作系统可以更新根证书库,Go 也可以在标准库中增加针对特定证书的拒绝逻辑。

这些措施解决的是相互关联、但并不完全相同的问题。

真正值得借鉴的是:不能把安全完全寄托在某一个组件上。即使某个系统层已经实施了防护,应用运行时和语言生态仍然可能需要针对特殊风险采取补充措施。

用 Go 代码理解证书验证:一个可运行的示例

理解安全公告最好的方式之一,是写一个能够运行的最小程序。

下面这个例子并不试图复现此次漏洞,也不会生成或使用受影响的证书。它展示的是 Go 应用如何通过标准库建立 HTTPS 连接,以及如何在不关闭证书验证的前提下检查验证失败。

将以下内容保存为 main.go:

package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"net/http"
	"os"
	"time"
)

func main() {
	if len(os.Args) != 2 {
		fmt.Fprintf(os.Stderr, "usage: go run . https://example.com\n")
		os.Exit(2)
	}

	url := os.Args[1]

	transport := &http.Transport{
		TLSClientConfig: &tls.Config{
			MinVersion: tls.VersionTLS12,
		},
	}

	client := &http.Client{
		Transport: transport,
		Timeout:   10 * time.Second,
	}

	ctx, cancel := context.WithTimeout(
		context.Background(),
		10*time.Second,
	)
	defer cancel()

	req, err := http.NewRequestWithContext(
		ctx,
		http.MethodGet,
		url,
		nil,
	)
	if err != nil {
		fmt.Fprintf(os.Stderr, "create request: %v\n", err)
		os.Exit(1)
	}

	resp, err := client.Do(req)
	if err != nil {
		fmt.Fprintf(os.Stderr, "HTTPS request failed: %v\n", err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	fmt.Printf("HTTPS request succeeded\n")
	fmt.Printf("URL: %s\n", url)
	fmt.Printf("Status: %s\n", resp.Status)
}

在一个空目录中创建 go.mod:

module certcheck

go 1.26

运行程序:

go run . https://example.com

在网络正常、目标站点证书有效的环境中,程序应当成功建立 HTTPS 连接,并打印 HTTP 状态码。

如果要构建可执行文件:

go build -o certcheck .
./certcheck https://example.com

这个例子究竟验证了什么?

关键在这里:

TLSClientConfig: &tls.Config{
    MinVersion: tls.VersionTLS12,
},

代码只设置了最低 TLS 协议版本,没有设置 InsecureSkipVerify。

因此,Go 仍然执行正常的服务器证书验证,包括证书链与目标主机名等检查。程序没有为了“让连接成功”而跳过安全验证。

在实际排查中,如果目标站点使用了包含被 Go 新版本明确拒绝的中间证书的验证链,那么连接可能因为证书验证失败而中断。

不过,这个示例使用的是外部站点,实际结果取决于站点当前返回的证书链、运行平台的信任库、网络环境以及所使用的 Go 版本。它是一个通用 HTTPS 验证示例,不是对特定漏洞的确定性复现。

不要把 InsecureSkipVerify: true 当成修复方案。它会关闭 crypto/tls 默认的服务器证书验证,除非应用另外实现了正确、完整的验证逻辑,否则可能让攻击者更容易冒充目标服务器。

进一步检查证书验证失败的原因

在实际项目中,可以把错误信息输出到日志中,帮助定位 TLS 握手失败的原因。

例如,前面的代码已经通过:

fmt.Fprintf(os.Stderr, "HTTPS request failed: %v\n", err)

保留了原始错误。

如果错误链中包含证书验证相关信息,就可以继续检查目标站点提供的证书链、运行环境的信任库和实际使用的 Go 版本。

也可以先使用系统工具检查服务器证书链:

openssl s_client \
  -connect example.com:443 \
  -servername example.com \
  -showcerts

该命令可以帮助查看服务器在 TLS 握手中提供的证书,但它的验证行为与 Go 不一定完全相同。不同系统的信任库、验证策略和中间证书处理方式可能存在差异。

因此,OpenSSL 命令成功,不等于 Go 的 crypto/x509 一定会接受同一条证书链。如果问题只在某个 Go 程序中出现,应当使用实际部署的 Go 版本和应用配置进行复测。

最容易被忽视的问题:升级 Go,不等于修复已经运行的程序

如果你在 Mac 或 Linux 开发机上执行:

go version

看到 Go 已经升级到 go1.26.10 或 go1.27.3,是不是就意味着线上服务已经安全了?

答案是否定的。

对于 Go 开发者来说,这次事件最容易暴露的,可能不是对密码学的理解不足,而是对软件交付链路的认识不够完整。

Go 通常会将应用代码、标准库和运行时等编译进最终的可执行文件。与许多依赖独立运行时环境的应用不同,部署一个 Go 程序时,通常不需要在目标服务器上另外安装 Go 编译器。

这让 Go 应用的部署非常方便,却也带来了一个容易被忽略的事实:

已经编译完成的二进制文件,不会因为构建机器升级了 Go,就自动获得新版本标准库中的安全修复。

假设某个团队在 10 月 10 日使用 Go 1.26.9 构建了一个 API 网关,并将它部署到了生产环境。

10 月 19 日,Go 发布了包含证书信任修复的 Go 1.26.10。

即使开发者当天在笔记本电脑上安装了 Go 1.26.10,线上网关仍然运行着旧的可执行文件。除非团队重新构建、发布并部署,否则新版本中的修复并不会自动进入这份旧程序。

先确认构建工具链

检查当前环境:

go version
go env GOTOOLCHAIN
go env GOROOT

如果项目通过 CI 构建,还需要检查 CI 实际使用的工具链,而不是只看开发机。

尤其要注意以下情况:

  • CI 使用固定版本的 Go 容器镜像。
  • 构建任务通过版本管理工具安装 Go。
  • 项目使用 GOTOOLCHAIN 管理工具链。
  • 构建脚本使用绝对路径调用另一套 Go。
  • 多阶段 Docker 构建使用了独立的构建镜像。

例如,项目的 go.mod 可能声明:

module example.com/myservice

go 1.26

这里的 go 1.26 是模块声明的 Go 语言版本要求,并不等于它会自动固定到 go1.26.10。

因此,不能只修改 go.mod 中的版本声明,就认为安全补丁已经生效。

再检查已经构建的二进制文件

Go 提供了一个很实用的命令:

go version -m ./myservice

对于包含 Go 构建信息的二进制文件,这个命令可以展示编译器版本及相关模块信息。

在排查过程中,建议同时记录:

  1. 实际使用的 Go 编译器版本。
  2. CI 构建任务使用的工具链。
  3. 最终产物的构建信息。
  4. 生产容器镜像的摘要和部署版本。
  5. 当前运行的进程是否已经切换到新产物。

需要注意,go version -m 是重要的诊断工具,但不是完整的安全证明。它不能单独证明所有代码都使用了预期的标准库行为,也不能替代对运行环境、依赖和实际证书验证结果的检查。

容器镜像也需要重新构建

考虑一个常见的多阶段 Docker 构建:

FROM golang:1.26.10 AS builder

WORKDIR /src

COPY go.mod ./
COPY main.go ./

RUN CGO_ENABLED=0 go build -o /out/myservice .

FROM scratch

COPY --from=builder /out/myservice /myservice

ENTRYPOINT ["/myservice"]

这只是一个可以用于简单独立程序的最小示例。实际项目可能还需要复制 CA 证书、时区数据、配置文件或者其他运行资源。

这里的关键是:如果构建阶段仍然使用旧版 Go,即使运行阶段采用了最新的基础镜像,最终的 Go 二进制也不会因此自动包含新版标准库的修复。

反过来,如果构建阶段使用了修复版本,但运行阶段使用 scratch,那么应用可能还需要额外配置根证书。编译器版本、应用二进制和运行时信任库,是三个需要分别检查的维度。

对于此次事件,建议使用修复版本重新构建受影响的应用,并通过正常的发布流程替换生产实例。不要把“CI 已升级”当成“线上已修复”。

生产环境应该如何响应?一份可执行的检查清单

安全公告发布之后,真正重要的不是在群里转发一个链接,而是把风险排查落实到每一份实际运行的软件产物上。

以下流程适合使用 Go 构建网络服务、API 网关、微服务和云原生基础设施的团队。

第一步:盘点所有使用中的 Go 工具链

检查开发环境、CI、构建容器、定时任务和独立构建系统。

对于这次更新,至少应确认相关构建流程已经使用:

  • Go 1.26 系列的 Go 1.26.10 或更新的适用安全版本。
  • Go 1.27 系列的 Go 1.27.3 或更新的适用安全版本。

如果项目使用其他 Go 版本,应当根据官方支持策略和对应安全公告选择合适的升级路径,而不是假设版本号更新就一定包含所有相关修复。

官方版本记录:Go Release History。

第二步:盘点已经发布的产物

不要只检查源代码仓库。

可以从以下资产入手:

资产类型 需要确认的事项
生产 Go 二进制 使用的构建工具链及部署版本
Docker 镜像 构建阶段的 Go 版本和镜像摘要
Kubernetes 工作负载 当前运行的镜像是否已经替换
内部工具 是否仍在使用长期未重新构建的旧程序
第三方 Go 程序 是否需要供应商提供安全更新
静态编译产物 是否需要重新编译并重新部署

这一步经常会发现一个问题:团队能够快速升级开发环境,却不知道生产环境到底运行着哪些版本的程序。

第三步:重新构建、测试并部署

建议优先处理承担 HTTPS 客户端职责的组件,例如:

  • 出站 API 调用服务。
  • 服务间通信代理。
  • API 网关和反向代理。
  • 使用自定义证书验证逻辑的程序。
  • 连接第三方支付、身份认证或云服务的 Go 客户端。

这并不意味着这些组件都存在可被利用的漏洞,而是它们通常更直接地依赖证书验证路径,值得在升级过程中优先检查。

构建之后,应执行单元测试、集成测试和必要的端到端测试,重点观察 TLS 握手、证书验证和外部 API 连接是否出现变化。

如果某个业务连接在升级后失败,不要立即通过关闭证书验证来恢复服务。应当先确认失败的证书链、证书颁发方及相关依赖,再与服务提供方协调证书更新。

第四步:验证修复真正进入生产环境

升级流程至少应包含以下验证:

  • 构建日志确认使用了预期的 Go 版本。
  • 发布产物具有可追踪的版本标识。
  • 容器镜像已重新构建,而不是只更新了标签。
  • 部署系统已将流量切换到新实例。
  • 运行中的进程与预期产物一致。
  • 对关键外部依赖执行了真实的 HTTPS 连接测试。

对于大型团队,还可以在 CI 中增加策略检查:如果构建工具链低于当前要求的安全基线,就阻止相关产物进入正式发布流程。

需要强调的是,一次成功的 HTTPS 测试只能证明特定目标、特定时间和特定环境下的连接成功,不能证明所有证书链都安全。工具链版本检查、依赖盘点、构建追踪和运行时验证应当结合使用。

第五步:建立长期的安全更新机制

不要等下一次紧急公告发布之后,才开始寻找生产环境中的旧版本。

建议将 Go 安全更新纳入常规工程流程:

  • 订阅 golang-announce,及时获取官方安全公告。
  • 定期检查 Go 官方漏洞数据库。
  • 为构建镜像和工具链维护明确的版本基线。
  • 让 CI 自动记录 Go 版本、依赖版本和构建产物信息。
  • 为紧急安全更新预留快速构建、测试、审批和发布通道。
  • 对无法立即升级的组件,记录风险、负责人和计划完成时间。

小结:信任不是永久授予的

从表面看,Go 1.26.10 和 Go 1.27.3 只是两个小版本更新。

但如果把视角从版本号移向整个软件交付链路,就会发现这次事件至少带来三点值得长期记住的启示。

第一,密码学正确不等于安全策略正确。

数字签名、证书有效期和证书链验证是必要条件,却不能单独决定一个 CA 是否仍然值得信任。安全体系必须能够在新的风险信息出现后,及时改变信任判断。

第二,安全更新必须覆盖真实运行的软件。

升级编译器只是起点。对于 Go 应用,重建二进制、重新生成镜像、完成部署并验证运行版本,才构成一个真正的更新闭环。源代码仓库中的配置正确,并不意味着生产进程已经获得修复。

第三,安全性与可用性必须一起考虑。

主动拒绝不可信的证书链,可以减少潜在风险,但也可能让依赖旧证书链的连接失败。正确的处理方式不是绕过验证,而是定位证书问题、更新相关证书,并通过受控的发布流程恢复服务。

这次事件也让我们重新认识到 Go 的安全更新策略:标准库不是一成不变的工具集合,它承载着整个生态对安全边界的共同约定。当某项信任假设不再成立时,标准库需要做出明确、可执行的改变。

对于开发者而言,最重要的行动其实很简单:检查自己的 Go 版本,确认构建和部署流程已经更新,并确保生产环境真正运行着包含修复的程序。

不要只升级工具链,要升级整个软件交付链路。

在安全问题面前,这往往比记住某个 CVE 编号更重要。

参考资料

  1. Go 官方安全公告:Go 1.27.3 和 Go 1.26.10 发布
  2. Go issue #82345:针对特定 CA 的安全缓解措施
  3. Go 1.26.10 回移植记录:issue #82348
  4. Go 1.27.3 回移植记录:issue #82349
  5. Go 安全策略
  6. Go 版本发布记录
  7. Go 漏洞数据库
  8. Hacker News:Go 将拒绝包含八个不可信 SPKI 的证书链
  9. golang-nuts:Go 1.27.3 和 Go 1.26.10 安全更新讨论

注:本文依据截至 2026 年 10 月 22 日可查阅的公开资料编写。涉及社区对 CA 风险成因的讨论时,应区分官方已确认的修复内容与社区推测。文中的代码用于演示正常的 HTTPS 证书验证与工程排查流程,不构成对 CVE-2026-111943 的漏洞复现。


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。