おまけ
この記事を書いてる最中に「む? またGitHub落ちた?」ってなった。
Google, Amazon, Claude, ChatGPT, Gemini, YouTube はつながる。
GitHub, Slack, ABEMA, TVer そしてこのブログはつながらない。
折角だから追跡してみよう!ということで mtr コマンドを試みた。
# dnf install mtr
Error: Error downloading packages:
Curl error (28): Timeout was reached [Connection timed out after 30001 milliseconds]
チーン。そっちも落ちてた。
気を取り直して本題へ。
TL;DR
GitHubのSSH認証を設定したかっただけなのに、生成AIと検索結果に Fine-grained personal access tokens(PAT)を勧められて遠回りした。
Git操作の認証にPATを使うのはそもそも用途が違った。
結論はSSH鍵一択。
発端
久々に環境を作ってGitリポジトリをcloneしようとしたらID/PASSを聞かれて、入力しても認証失敗。
パスワードは2021年8月に廃止。
じゃあどうすんだっけ?
調べたらPATの情報ばかり。
生成AIに聞いても同じ答え。
新しいからやってみようと思い情報に従う。
認証成功!
・・・と思いきや、clone/pull するたびにID/PASSを聞かれる・・・。
どうしたらいい?
git config --global credential.helper storeで認証キャッシュ
生成AI様の助言に素直に従う。
credential storeの何が問題か
store にした場合、トークンはどこに保存されるんだと疑問に思って調べたら、~/.git-credentials に平文で保存されてた。
https://<username>:<PAT>@github.com
まあ ~/.ssh/id_ed25519(SSH秘密鍵)も平文だし、「秘密情報をローカルファイルに置く」という構造は同じなんだけど…。
~/.git-credentials はファイルパスも形式も規格化されている。つまりマルウェアが狙いやすい。「ここを見ればトークンが取れる」とわかっているファイルが存在するのはなんか気持ち悪い。
それよりなにより、後で知ったんだけどそもそもPATはgit操作の認証に使うものじゃなかった。
正解はSSH鍵だった
生成AIと議論して結局「SSH鍵が最善」という話になった。最初からそう言ってほしかった。
PAT + credential store は「HTTPS必須の環境」「GitHub APIを叩く」「GitHub Actions」のような用途向けの話で、git操作の認証にPATを使うのは本来の使い方じゃない。
でも検索結果も生成AIも、学習データの多数派がそっちなので自然とPAT+HTTPSの話から始めてしまう。
SSH鍵の設定手順
1. SSH鍵を生成
ssh-keygen -t ed25519
ファイル名を聞かれるので、デフォルト(~/.ssh/id_ed25519)のままEnterでOK。
パスフレーズは今回は省略。
2. 公開鍵をGitHubに登録
cat ~/.ssh/id_ed25519.pub
出力された内容(ssh-ed25519 AAAA... から始まる1行)をコピーして、GitHubに登録する。
GitHub > Settings > SSH and GPG keys > New SSH key
| 項目 | 内容 |
|---|---|
| Title | 任意(例:my-pc) |
| Key type | Authentication Key |
| Key | .pubの中身をそのまま貼り付け |
3. 接続テスト
ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
これが出ればOK。
4. SSH URLでclone
git clone git@github.com:username/repo.git
以降、認証を聞かれることはなくなる。
ハマりポイント:~/.ssh/config は自動生成されない
鍵のファイル名をデフォルト(id_ed25519)以外にした場合、~/.ssh/config で「このホストにはこの鍵を使え」と明示的に設定する必要がある。
これを知らずに github_mykey みたいな名前にしたら、gitはデフォルトの id_ed25519 を探して認証失敗した。
~/.ssh/config は 手動で作るもの。ssh-keygen は鍵ペアを作るだけで、configは生成しない。
cat > ~/.ssh/config << 'EOF'
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_mykey
EOF
chmod 600 ~/.ssh/config
素直にデフォルトのファイル名(id_ed25519)にしておけばconfig不要で動く。今となってはそうすればよかったと思う。
まとめ
git clone / git pull したいだけなら、SSH鍵一択。 PATは必要ない。
生成AIに聞くと「PATを発行して〜」という情報が多数派なので同じ答えが返ってくる。でもそれはHTTPS前提の話で、CLIでgit操作するだけなら最初からSSH鍵を使うのが定石だった。

コメント