メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#77865likely_accept

crypto/x509: support SSL\\_CERT\\_FILE/DIR on Darwin and Windows

ステータス変更: active likely_accept

要約

AIによる要約であり、誤りを含む場合があります。

概要

crypto/x509 パッケージにおいて、現在 Darwin(macOS)と Windows で無視されている環境変数 SSL_CERT_FILE および SSL_CERT_DIR を、他の Unix 系プラットフォームと同様にサポートするための提案です。これらの環境変数が設定されている場合、プラットフォーム固有の証明書検証ツール(platform verifier)ではなく、Go ネイティブの検証ツールを使用するようになります。

ステータス変更

activelikely accept
2026年4月29日のProposal Reviewミーティングにおいて「accept寄り」の方向性が示され、2026年5月6日に @aclements がコアチームを代表して "likely accept" と正式に宣言しました。SSL_CERT_FILE がすでに他の Unix プラットフォームでサポートされており、業界標準として定着しているという事実が決め手となりました。WindowsとDarwinを同一に扱うという方針についても @rsc が明示的に支持しました。

技術的背景

現状の問題点

DarwinとWindowsでは、Go は trustd(macOS)や Windows Certificate Store(Windows)などのプラットフォーム固有の証明書検証サービスを利用します。これらのサービスへのアクセスが制限されているサンドボックス環境(例: Claude Codeのsandbox-runtime)では、Goプログラムが TLS 証明書検証に失敗するという問題が発生します。
他の Unix 系プラットフォームでは、SSL_CERT_FILESSL_CERT_DIR を環境変数として設定するだけでカスタム CA 証明書を使用できますが、DarwinとWindows ではこの方法が機能しません。該当するバイナリを直接改変できない場合(例: ghkubectlterraform などのサードパーティ製Goバイナリ)、回避策がほとんどありませんでした。

// 現在の動作(Darwinの場合)
// SSL_CERT_FILE=/path/to/custom-ca.pem を設定しても無視される
// → プラットフォーム検証ツール(trustd)が使われ続ける
// → trustdへのアクセスが制限されているとTLS接続が失敗する

提案された解決策

  • DarwinとWindowsにおいて SSL_CERT_FILE および SSL_CERT_DIR をサポートする。これらが設定されていれば、プラットフォーム検証ツールを使わず、Goネイティブの検証ツールを使って証明書を検証する。
  • 後方互換性のため、新しい GODEBUG 設定 x509sslcertoverrideplatform を導入する。
    • Go 1.27 以降の言語バージョンでビルドされた場合: デフォルト値は 1(新動作を有効化)
    • Go 1.27 より前の言語バージョンでビルドされた場合: デフォルト値は 0(既存動作を維持)
    • 0 に設定すると、DarwinとWindowsで SSL_CERT_FILE/SSL_CERT_DIR を無視する(Go 1.27 以前の動作に戻る)
    • Linux などその他のUnixでは、プラットフォーム検証ツール自体が SSL_CERT_FILE を使用するため、この設定は効果なし

これによって何ができるようになるか

サンドボックス環境、コンテナ、CI/CD パイプライン、企業ネットワークなど、カスタムCA証明書の使用が必要なシナリオで、GoプログラムのバイナリをビルドしなおさずともmacOSとWindowsでも環境変数によって証明書ストアを制御できるようになります。

コード例

// Before: Darwinでは SSL_CERT_FILE を設定しても効果なし
// 環境変数: SSL_CERT_FILE=/etc/myapp/custom-ca.pem
//
// 従来の回避策: バイナリを修正してSetFallbackRootsを呼び出す
pool := x509.NewCertPool()
certData, _ := os.ReadFile("/etc/myapp/custom-ca.pem")
pool.AppendCertsFromPEM(certData)
// GODEBUG=x509usefallbackroots=1 も別途必要
x509.SetFallbackRoots(pool)
// After: Go 1.27以降のDarwinとWindowsで
// 環境変数を設定するだけで動作する
// SSL_CERT_FILE=/etc/myapp/custom-ca.pem
// (バイナリ修正不要、サードパーティ製Goバイナリにも効果あり)

議論のハイライト

  • 対象プラットフォームの拡張: 当初はDarwinのみを対象としていたが、議論の中で @rolandshoemaker と @rsc の主導でWindowsも同一に扱う方針となった。Windowsでも SSL_CERT_FILE を使用するソフトウェアが存在することが確認された。
  • 後方互換性への懸念: SSL_CERT_FILE が意図せず設定されている環境で、これまでプラットフォーム検証ツールを使用していたプログラムの動作が変わるリスクがある。これに対応するため GODEBUG による制御が設計された。
  • 言語バージョンによるデフォルト値の差別化: Go 1.27未満の言語バージョンでビルドされたプログラムはデフォルト 0(旧動作維持)とすることで、既存ユーザーへの影響を最小化する方針が採用された(@rolandshoemaker 提案)。
  • #71924 との関係: FiloSottile はこの提案が「#71924(全プラットフォームでのシステムルート上書き機能)のサブセット」と指摘したが、@rsc は標準的な SSL_CERT_FILE をまず優先してサポートすべきと主張し、本提案を独立して進めることになった。
  • プラットフォーム検証ツールのバイパス条件: SSL_CERT_FILE または SSL_CERT_DIR のどちらか一方でも設定されていれば、プラットフォーム検証ツールをバイパスしてGoネイティブ検証ツールを使用する設計となった。

関連リンク