結論
原因: ~/.ssh/config の IdentitiesOnly yes。
IdentityFile を指定していない状態でこれがあると、1Password エージェントの鍵がすべてスキップされ、デフォルトの ~/.ssh/id_rsa だけが試されて GitHub 認証に失敗する。
対処: GitHub 用の Host ブロックから IdentitiesOnly yes の行を削除する。
Host github.com
HostName github.com
User git
IdentityAgent "/Users/xxx/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
# IdentitiesOnly yes ← この行を削除
これで ssh -T git@github.com が通るようになる。
はじめに
1Password の SSH エージェントで GitHub に繋ぎたいのに、次のような状態になっていませんか?
- 公開鍵は GitHub に登録済み
-
ssh-add -lではエージェントに鍵が載っている - それなのに
ssh -T git@github.comだけPermission denied (publickey)で失敗する
以下、そのときの症状と切り分け手順を書きます。
症状
エージェント経由で鍵が認識されていることは確認できている。
# 1Password のエージェントソケットを指定して鍵一覧を表示
SSH_AUTH_SOCK="/Users/.../Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" ssh-add -l
# → 256 SHA256:... id_ed25519_github (ED25519)
しかし GitHub への接続だけ失敗する。
SSH_AUTH_SOCK=".../agent.sock" ssh -T git@github.com
# → git@github.com: Permission denied (publickey).
「鍵はあるのになぜ?」という状態でした。
切り分け:verbose で何が起きているか見る
ssh -v(または -vv)で接続すると、どの鍵が実際にサーバーに送られているか分かります。
ssh -vT git@github.com 2>&1 | grep -E "Offering|Authentications"
ここで id_ed25519_github が一切 "Offering" されていなかった ことが判明しました。代わりに次のような出力でした。
debug1: Offering public key: /Users/xxx/.ssh/id_rsa RSA SHA256:...
debug1: Authentications that can continue: publickey
つまり、1Password エージェントが持っている ED25519 鍵ではなく、従来の ~/.ssh/id_rsa だけが試されていた、という状態です。
原因の詳細:IdentitiesOnly の挙動
~/.ssh/config で IdentitiesOnly yes を指定していると、SSH クライアントは「設定に書かれた鍵だけ」を使おうとします。
-
IdentityFileを何も書いていない場合、デフォルトの~/.ssh/id_rsaなどだけが対象になる - 1Password エージェントが提供する鍵は「設定に明示されていない」ため、すべてスキップされる
その結果、エージェントには鍵が載っているのに、接続時には使われず Permission denied になっていました。
補足:IdentitiesOnly を使いたい場合
複数の鍵を持っていて「この Host ではこの鍵だけ使いたい」と制限したい場合は、IdentityFile を明示する必要があります。
1Password の鍵をファイルとして書き出さずエージェントだけで使う場合、多くの環境では「エージェントに登録されている鍵をすべて試す」形にするため、IdentitiesOnly を付けない運用が無難です。
別の鍵(例:自前サーバー用の id_rsa)だけを使いたい Host では、その Host ブロックに IdentityFile ~/.ssh/server_key と IdentitiesOnly yes をセットで書く、といった使い分けができます。
環境: macOS、1Password(SSH エージェント有効)、~/.ssh/config で IdentityAgent を 1Password のソケットに指定済み。