crypto/x509: support SSL\\_CERT\\_FILE/DIR on Darwin and Windows
要約
概要
crypto/x509 パッケージにおいて、DarwinおよびWindows上でも SSL_CERT_FILE と SSL_CERT_DIR 環境変数をサポートするよう変更するproposalです。従来はDarwinとWindowsでこれらの環境変数が無視されていましたが、他のUnixプラットフォームと同様に扱えるようにします。
ステータス変更
likely_accept → accepted
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接続が機能しなくなる - バイナリを直接改変せずに信頼するルート証明書を切り替えたい(テスト・インテグレーション用途)場合に手段がない
gh、glabなどの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というタイトルで実装が進んでいる。