はじめに
こんにちは
新政水墨です。
突然ghコマンドで認証が切れてますとなったので解消法をご紹介します。
結論的にはMac OSをTahoeにアップデートしたのが原因のようでした。
TL;DR
macOSアップデート後、gh コマンドが急に動かなくなった。
curl は問題ないのに gh だけ失敗する場合、キーチェーンのCA信頼設定が原因の可能性が高い。
症状
ある朝突然、gh コマンドがすべてこのエラーで失敗するようになった。
$ gh pr view 123
Post "https://github.your-company.com/api/graphql": tls: failed to verify certificate: x509: OSStatus -26276
gh auth status を確認すると、こんな表示も。
$ gh auth status
github.your-company.com
X Failed to log in to github.your-company.com account your-account (keyring)
- The token in keyring is invalid.
「トークンが無効?パスワード変えたっけ?」と思って再ログインを試みるも、同じTLSエラーで失敗。
なぜ curl は動くのに gh だけ失敗するのか
$ curl https://github.your-company.com
# → 問題なく接続できる
$ gh pr view 123
# → TLSエラーで失敗
この違いは証明書の検証方法にある。
| ツール | 証明書の検証方法 |
|---|---|
curl |
/etc/ssl/cert.pem(OpenSSL/LibreSSL) |
gh(Goバイナリ) |
macOS Security フレームワーク(キーチェーン) |
gh は Go 製バイナリのため、macOS の Security フレームワークを通じてキーチェーンの信頼設定で証明書を検証する。そのため、curl では問題なくても gh だけ失敗するケースが起きる。
原因
macOS のアップデートによって、USERTrust RSA Certification Authority(Sectigo 証明書のルートCA)がキーチェーンで信頼されていない状態になっていた。
OSStatus -26276 は macOS Security フレームワークの errSecNotTrusted(証明書が信頼されていない)に対応するエラーコード。
「token invalid」は罠
gh auth statusの「The token in keyring is invalid」はトークンの問題ではなく、TLSエラーで GitHub に接続できないためghが検証失敗と誤判断していただけ。トークンを再発行しても解決しない。
解決方法
手順
-
キーチェーンアクセスを開く
- Spotlight(
⌘ + Space)→「キーチェーンアクセス」と入力
- Spotlight(
-
検索ボックスに
USERTrustと入力 -
「USERTrust RSA Certification Authority」をダブルクリック
-
「信頼」セクションを展開
-
「この証明書を使用するとき」を「常に信頼」に変更
-
ウィンドウを閉じる → 管理者パスワードを入力して確定
-
ターミナルを再起動して確認
$ gh auth status
github.your-company.com
✓ Logged in to github.your-company.com account your-account
補足
USERTrust ECC Certification Authority も同様に「常に信頼」にしておくと安心。
なぜ macOS アップデート後に起きるのか
macOS のセキュリティアップデートにより、一部ルートCAの信頼設定が「システムデフォルトを使用」にリセットされることがある。「システムデフォルト」では Apple が明示的に信頼リストに含めていない CA は検証できないため、Go の Security フレームワーク経由の TLS
検証が失敗する。
curl はキーチェーンを使わないため影響を受けない。
影響を受けるケース
同じ原因で gh 以外にも影響が出る可能性がある。
- Go 製の CLI ツール全般(macOS Security フレームワークを使うもの)
- GitHub Enterprise / GitLab などのオンプレミス環境(Sectigo 証明書を使っている場合)
まとめ
- macOS アップデート後に
ghがx509: OSStatus -26276で失敗したら、キーチェーンのCA信頼設定を疑う -
curlは動くのにghだけ失敗する場合、OpenSSL とキーチェーンの違いが原因 -
gh auth statusの「token invalid」は TLS エラーの誤検知の可能性あり - キーチェーンアクセスで USERTrust RSA CA を「常に信頼」にすれば解決