Go 1.27.3・1.26.10の緊急更新|特定の中間証明書(鍵8つ)をはじく変更と、x509: no valid chains builtが出たときの確かめ方

Go 1.27.3・1.26.10でつながらないときの確かめ方を示す図。go versionで版を確かめる、上げて作り直す、前の版と新しい版で比べる、確認を止める設定はないの4つ

Go 1.27.3とGo 1.26.10では、証明書の確認(crypto/x509)が、特定の中間証明書8つの鍵を含む証明書チェーンをはじくようになりました。Goで作ったツールやサービスを使っていて、更新後に x509: no valid chains built が出てつながらなくなった人や、自分のサービスが関係あるか気になっている人は、まずGoのバージョンを確かめ、そのあと更新と作り直しに進んでください。

目次

結論:1.27.3か1.26.10に上げて、作り直す

  • 対象:Goの標準ライブラリ crypto/x509(証明書チェーンの確認)。CVE番号は CVE-2026-111943、Go issueは #82345
  • 修正版:Go 1.27.3 と Go 1.26.10(Go公式のリリース履歴では2026年10月19日の公開。日本時間では10月20日)
  • Go公式の扱い:Go issueには、セキュリティ方針の「URGENT」(いちばん急ぐ扱い)だったと書かれています。告知では、すぐに更新することを強く勧めています
  • Go 1.25以前:Goの方針でサポートが終わっていて、この修正は出ていません
  • 止める設定:この変更には、確認を止める設定は入っていません

何が変わったか

Go公式の告知(golang-announce)では、この修正の名前は「特定の認証局に関するセキュリティ上の懸念への対策」です。本文では、運用に関する特定のセキュリティ上の懸念があるため、少数の中間証明書を信頼しないようにした、と説明しています。

Goの変更(CL)を見ると、8つの鍵のSHA-256ハッシュが一覧になっています。Verify が証明書チェーンを組み立てたあと、チェーンの中にこの8つの鍵のどれかを持つ証明書があれば、そのチェーンを外します。証明書そのものではなく鍵で見分けるため、同じ鍵を持つ証明書なら、どこに署名されたものでも外れます。

この確認は、Go自身の確認処理に加えて、macOSとWindowsでOSに確認を任せる処理にも入っています。8つの鍵のせいでチェーンがすべて外れたときは、確認は失敗し、次のエラーになります。ほかの理由で外れたチェーンもあるときは、別のエラー文になったり、後ろに説明が付いたりします。

x509: no valid chains built

HTTPSなどのTLS接続では、前に tls: failed to verify certificate: が付いて表示されます。

tls: failed to verify certificate: x509: no valid chains built

影響を受けるのは誰か

  • Goで作ったプログラムを動かしている人:Go 1.27.3/1.26.10で作り直したプログラムは、確認の結果、8つの鍵を含むチェーンしか残らない接続先には、つながらなくなります。古い版で作ったままのプログラムは、作り直すまで前の動きのままです
  • サービスを運営している人:自分のサイトやAPIの証明書で、この8つの鍵を含むチェーンしか残らないと、新しい版で作られたGoのクライアントからつながらなくなります
  • Goで作られたツールを使っているだけの人:ツールの配布元が新しい版で作り直したものに入れ替える必要があります

自分のGoのバージョンを確かめる

手元の go コマンドが使うバージョンを確かめます。

go version

作り終わったプログラムが、どのGoで作られたかも確かめられます(./mytool は自分のプログラムのパスに置き換えます)。

go version ./mytool

1.27系なら go1.27.3 以降、1.26系なら go1.26.10 以降と出れば、今回の変更が入っています(go1.27.0〜go1.27.2 には入っていません)。開発用のPCだけでなく、CIやコンテナの中で使うGoも同じように確かめてください。

更新して作り直す

Goそのものは、Go公式のダウンロードページ(go.dev/dl)から新しい版を入れます。

モジュールの中では、go get で使うGoの版(toolchain)を指定できます。1.27系なら次のとおりです。

go get toolchain@go1.27.3

1.26系を使い続けるなら、こちらです。

go get toolchain@go1.26.10

go.mod に toolchain の行が足され、このモジュールで go コマンドを使うと、その版が使われるようになります(手元のGoのほうが新しいときは、手元のGoが使われます)。1.26系を指定していても、手元のGoが1.27.0〜1.27.2のときは、そのまま手元の版で作られて修正が入らないので、手元のGoも1.27.3以降に上げてください。

モジュールで使うGoの版は、次のコマンドでも上げられます。

go get go@1.27.3

こちらは go.mod の go の行、つまりそのモジュールを使うのに必要な最低の版が上がります。ほかの人が依存するライブラリでは、使う人全員に1.27.3以上を求めることになるので気をつけてください。

版を上げたら、プログラムを作り直し、作り直したものの版を確かめます。

go build -o mytool .
go version ./mytool

作り直したプログラムを、動いている環境に入れ替えるまでは、前の動きのままです。

エラーが出たときの見分け方

x509: no valid chains built は、証明書ポリシーの条件に合わないときなど、今回の変更とは別の理由でも出ます。そのときは、後ろに理由の説明が付きます。今回の変更が原因かどうかは、前の版と新しい版で作ったプログラムを同じ接続先につないで比べると分かります。GOTOOLCHAIN を付けると、使うGoの版を指定して作れます(1.26系なら go1.26.9 と go1.26.10 にします)。

GOTOOLCHAIN=go1.27.2 go build -o mytool-old .
GOTOOLCHAIN=go1.27.3 go build -o mytool-new .

Go 1.27.3と1.26.10の修正は、この crypto/x509 の1件だけです。前の版で作ったほうはつながり、新しい版で作ったほうだけでこのエラーが出るなら、接続先の証明書チェーンが今回の8つの鍵を通っていると考えられます。なお、go.mod の go の行をすでに1.27.3に上げていると、1.27.2では作れません。

原因が今回の変更だと分かったときの対応は、立場で変わります。

  • 接続先が自分のサービスの場合:今の証明書を発行した認証局に相談し、この8つの鍵を通らない、別の中間証明書から証明書を発行し直してもらいます
  • 接続先が他社のサービスの場合:接続先の運営者に、Go 1.27.3/1.26.10でつながらないことを伝えます

証明書の確認を無効にしてつなぐ回避はしないでください。Goの crypto/tls の説明でも、確認を止める設定(InsecureSkipVerify)を有効にすると、どんな証明書も受け入れてしまい、通信の間に入るなりすまし(中間者攻撃)を防げなくなるとされています。

よくある質問

Go 1.25以前を使っていると、どうなりますか

Goは、新しいメジャー版が2つ出るまでを、そのメジャー版のサポート期間としています。今サポートされているのは1.27系と1.26系で、1.25以前にはこの修正が出ていません。1.26.10以降か1.27.3以降に上げてください。

自分でルート証明書を指定していても、はじかれますか

Goの変更では、Verify が組み立てたチェーンを最後に絞り込む所に、この確認が入っています。そのため、どのルート証明書を信頼するかを自分で指定していても、8つの鍵を通るチェーンは外れます。

参考リンク(Go公式)

確認日:2026年10月21日

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

社内エンジニアとして、SREとセキュリティの仕事をしています。サーバーの構築や運用、クラウド環境の設計にも関わってきました。趣味はゲームと漫画・アニメ。

コメント

コメントする

目次