余りこういうユーザもいないだろうが、
Githubアカウントを複数所持して、使い分けたい事態が起こった。別アカウントを作成したので、
デスクトップ版BitwardenをSSHエージェントとして使用してローカルに秘密鍵を保持せずサーバーログインやGit pushするにあるとおり、Bitwardenの公開鍵をコピーしてssh認証しようとするとエラー(成功することもある)となる。
Geminiに尋ねると
原因はほぼ 「SSHキーの競合(認証されるユーザーの取り違え)」 に絞り込めます。 この問題を確実に解決するには、Linuxコンテナ内の
~/.ssh/configファイルを設定し、「どのアカウント(鍵)を使うか」を明示する必要があります。
公開鍵を指定する
いやいや、端末ごとに鍵ファイルを持ちたくないからBitwardenを使っているのに…と諦めそうになったが、ここで指定するのは公開鍵だけで良い。
git config --local core.sshCommand "ssh -i ~/.ssh/your_key.pub -o IdentitiesOnly=yes"というコマンドを打つことで、gitのsshコマンドを設定することができる。
今まで-iで指定するのは秘密鍵だけだと思っていたが、公開鍵を指定することもできる。
※ 通常 -i は秘密鍵を指定しますが、Agentを使っている場合は公開鍵を指定することで、Agent内の鍵をフィルタリングできます。
実際、man sshで確認すると、
You can also specify a public key file to use the corresponding private key that is loaded in ssh-agent(1) when the private key file is not present locally.
「秘密鍵ファイルがローカル(ディスク上)に存在しない場合、ssh-agent(1) に読み込まれている『対応する秘密鍵』を使用するために、公開鍵ファイルを指定することもできます。
との説明があった。
そして、-o IdentitiesOnly=yesオプションを付けることで、指定した鍵以外は使うな、と強制することができる。
わざわざBitwardenからssh-ed25519 ********************************************************************を貼り付けた公開鍵を端末上に保存しておかなればならない、という点においては残念だが、流出しても問題ないのは嬉しい。
確かに使い始めて数日だが、失敗しないようになった。ちなみにssh -T git@github.comコマンドではgit設定は無視される。
git clone
gitクローンするときに、git clone -c core.sshCommand="ssh -i ~/.ssh/your_key.pub -o IdentitiesOnly=yes" git@github.com:ユーザー名/リポジトリ名.gitとすれば、設定ファイルにそのまま書き込まれる。
そして、自分は勘違いしていたが、git config user.signingkey "ssh-ed25519 AAAA..."の公開鍵の指定は認証には関係がなく、コミットデータにデジタル署名を付けるためのもの。
git config user.name、git config user.emailは任意の値を設定できるので、署名signingkeyがあることで、なりすましでない Verified のバッジが付くとのこと。知らんかった。
パーソナルアクセストークン
あれこれやるより、パーソナルアクセストークン1を発行してgit clone https://ユーザー名:トークン@github.com/ユーザー名/リポジトリ名.gitで取得する方が楽な気もする。
[remote "origin"]
url = https://ユーザー名:トークン@github.com/ユーザー名/リポジトリ名.git
とトークンも平文で保存されてしまうので、セキュリティとしては少し問題かも知れないが確実だし、sshエージェントが、Bitwardenがどうとか悩まなくていい。
というこの記事のタイトルを否定する方法を最後に書くのも自己矛盾だが、管理しやすい方法で使い分けてくれれば良い。
-
GitHubの右上のアイコン → Settings → Developer settings → Personal access tokens → Tokens (classic)から作成できる。そして
repoリポジトリ操作権限だけ付与すれば良い。 ↩︎

