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

Go Proposal Weekly Digest

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

#77865accepted

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

ステータス変更: likely_accept accepted

要約

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

概要

crypto/x509 パッケージにおいて、DarwinおよびWindows上でも SSL_CERT_FILESSL_CERT_DIR 環境変数をサポートするよう変更するproposalです。従来はDarwinとWindowsでこれらの環境変数が無視されていましたが、他のUnixプラットフォームと同様に扱えるようにします。

ステータス変更

likely_acceptaccepted
2026年5月13日のProposal Review Meeting(@aclements、@adonovan、@bradfitz、@cherrymui、@griesemer、@ianlancetaylor、@neild、@rolandshoemaker出席)において、前回のlikely accept以降コンセンサスに変更がなかったとして正式に承認されました。実装CL(go.dev/cl/776940)がすでに提出されており、機が熟していたと判断されました。

技術的背景

現状の問題点

GoはDarwinでは trustd というシステムデーモン(Appleのプラットフォーム証明書検証API)、Windowsではシステムの証明書ストアを使って証明書を検証します。これらのプラットフォームでは SSL_CERT_FILE / SSL_CERT_DIR 環境変数が意図的に無視されるよう実装されており、公式ドキュメントにも「Darwinでは使用されない」と明記されていました。
一方、Linuxなど他のUnixプラットフォームでは SSL_CERT_FILE / SSL_CERT_DIR が証明書ストアの上書きに使用できます。この非対称性により、以下のような問題が生じていました。

  • Goプログラムをサンドボックス環境で動かす際、trustd へのアクセスを制限するとTLS接続が機能しなくなる
  • バイナリを直接改変せずに信頼するルート証明書を切り替えたい(テスト・インテグレーション用途)場合に手段がない
  • ghglab などのGoバイナリをmacOS/Windowsのサンドボックス内で使用しているユーザーが影響を受けていた

提案された解決策

DarwinおよびWindowsでも SSL_CERT_FILE または SSL_CERT_DIR が設定されている場合に、プラットフォームの証明書検証器(platform verifier)の代わりにGoネイティブの証明書検証器を使用するよう変更します。
後方互換性のため、GODEBUG 変数として x509sslcertoverrideplatform を追加します。

  • Go 1.27以降の言語バージョンでビルド: デフォルト 1(環境変数を有効にする)
  • Go 1.27より前の言語バージョンでビルド: デフォルト 0(旧来の動作、環境変数を無視する)
  • Linux等プラットフォーム検証器がないOSでは、この変数は効果なし

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

DarwinとWindowsでも環境変数によって証明書ストアを柔軟に上書きできるようになります。
ユースケース1: macOSサンドボックス環境での動作
Claude CodeやGitHub CLIなどのGoバイナリをmacOSのサンドボックスで動かす場合、trustd へのアクセスが制限されることがある。今後は SSL_CERT_FILE に信頼する証明書を指定してGoプログラムを動作させられる。
ユースケース2: テスト時の自己署名証明書の使用
テスト環境やCIで自己署名証明書を使う場合、バイナリを改変することなく環境変数で対応できる。
ユースケース3: 企業内プロキシやカスタムCAの注入
Windowsのエンタープライズ環境でも、OSのシステム証明書ストアに依存せず独自のCA証明書セットを指定できる。

コード例

// Before: DarwinではSSL_CERT_FILEが無視され、trustdが使われる
// 環境変数を設定しても効果なし
// $ SSL_CERT_FILE=/path/to/my-ca.pem ./myapp
// → trustd経由でシステム証明書が使われる(SSL_CERT_FILEは無視)
// After: Go 1.27以降でビルドされたバイナリはSSL_CERT_FILEを尊重
// $ SSL_CERT_FILE=/path/to/my-ca.pem ./myapp
// → /path/to/my-ca.pemのCA証明書でTLS検証が行われる
// 旧動作に戻したい場合はGODEBUGで制御
// $ GODEBUG=x509sslcertoverrideplatform=0 SSL_CERT_FILE=/path/to/my-ca.pem ./myapp
// → SSL_CERT_FILEが無視され、trustd/Windowsストアが使われる

議論のハイライト

  • スコープの拡大(DarwinのみからWindowsも含む): 当初proposalはDarwinのみを対象としていたが、@rolandshoemaker と @rsc の議論を経て、プラットフォーム検証器を持つ全OS(DarwinおよびWindows)に拡大することが決定された。Windowsでも SSL_CERT_FILE を利用するサードパーティソフトウェアが存在することが理由の一つ。
  • #71924 との関係: @FiloSottile は本proposalが「全プラットフォームでユーザーによるシステムルートの上書きを許可する」というより広い#71924のサブセットだと指摘したが、@rsc は「業界標準として SSL_CERT_FILE はサポートすべき」として独立したproposalとして進めることを支持した。
  • 既存コードへの影響と後方互換性: Darwinユーザーの中には SSL_CERT_FILE が別目的で設定されている場合があり、急にGoの動作が変わると問題になりうる。そのため、Go 1.27より前の言語バージョンでは GODEBUG のデフォルトを 0 とし、旧来の動作を維持することが決定した。
  • SSL_CERT_DIR の同時サポート: SSL_CERT_FILE だけでなく SSL_CERT_DIR も合わせてサポートすべきとの意見があり(@aclementsより「unfortunately」という注記付きで)、両者がセットで対応されることになった。
  • 実装CL提出済み: 2026年5月11日の時点で実装CL(go.dev/cl/776940)がすでに提出されており、crypto/x509: honor SSL_CERT_{FILE,DIR} on windows/darwin というタイトルで実装が進んでいる。

関連リンク