Table of Contents
はじめに
WindowsのPowerShellやVSCodeからVPSにSSH接続するとき、秘密鍵にパスフレーズを設定していると、毎回入力するのがとても面倒です。
そこで、Windows標準のOpenSSHが提供するssh-agentに鍵を登録し、パスフレーズ入力を省略する構成にしていました。
ところが、ssh-add -lで鍵が見えているにもかかわらず、どうしてもSSH接続のたびにパスフレーズを聞かれるという謎の状態にはまりました。
最終的な原因は.ssh/configに書いていたIdentitiesOnly yesで、これがssh-agentの鍵を完全に無視させていた、というのが今回の教訓です。
解決策
前提環境
- OS: Windows 11
- SSHクライアント: Windows標準のOpenSSH
- 実体は
C:\Windows\System32\OpenSSH\ssh.exe
- 実体は
- シェル: PowerShell(VSCodeの統合ターミナル含む)
- VPS: Ubuntu
- 秘密鍵:
C:\Users\<ユーザー名>\.ssh\id_rsa(パスフレーズ付き)
ssh-agentの設定
まずは、一般的なssh-agentの設定を行いました。
- OpenSSHクライアントのインストール(必要なら)
Windows 11では「オプション機能」の「OpenSSH クライアント」を有効化します。 - ssh-agentサービスの有効化
管理者権限のPowerShellで、次を実行します。
Set-Service ssh-agent -StartupType Automatic Start-Service ssh-agent Get-Service ssh-agentStatusがRunningになっていればOKです。
- 鍵をssh-agentに登録
普段使いのPowerShell(非管理者)で、次を実行します。
ssh-add $env:USERPROFILE\.ssh\id_rsa ssh-add -lここで、登録した鍵のフィンガープリントが1行表示されることを確認します。
- sshコマンドの場所を確認
PowerShellではwhereがWhere-Objectのエイリアスなので、外部コマンド検索にはwhere.exeを使います。
where.exe ssh where.exe ssh-addここで、以下のように表示されていれば、Windows標準のOpenSSHを使えている状態です。
C:\Windows\System32\OpenSSH\ssh.exe C:\Windows\System32\OpenSSH\ssh-add.exeそれでも毎回パスフレーズを聞かれる
ここまで設定しても、次のようにパスフレーズを聞かれていました。
ssh <vpsサーバー># → 毎回「Enter passphrase for key 'C:\Users\...\id_rsa':」と聞かれる一方で、ssh-add -lは期待どおり鍵を表示しており、「ssh-agentに鍵は入っているのに無視されている」ような動きになっていました。
原因
原因は、~/.ssh/configに自分で書いていたIdentitiesOnly yesでした。
Host vps HostName xxx.xxx.xxx.xxx User ubuntu IdentityFile ~/.ssh/id_rsa IdentitiesOnly yesIdentitiesOnly yesは、「ssh-agentに登録されている鍵や他の候補を無視して、ここで指定したIdentityFileだけを使う」という挙動を強制します。
その結果、sshは毎回~/.ssh/id_rsaをファイルから直接読みに行き、そのたびにパスフレーズを聞いていた、というわけです。
解決策
対処はシンプルで、VPS用のHostセクションからIdentitiesOnly yesをコメントアウトまたは削除するだけでした。
Host vps HostName xxx.xxx.xxx.xxx User ubuntu IdentityFile ~/.ssh/id_rsa # IdentitiesOnly yes ← 削除 or コメントアウト設定を保存したあと、再度PowerShellで次を実行します。
ssh-add $env:USERPROFILE\.ssh\id_rsassh-add -lssh vpsこれで、sshがssh-agent上の鍵も候補として使うようになり、パスフレーズが一度も聞かれずにVPSへ接続できるようになりました。
補足:IdentitiesOnly yesを使いたい場合
IdentitiesOnly yes自体は悪者ではなく、「agentに大量の鍵が載っていて毎回全部試されて遅い」「特定のHostではこの鍵だけを使ってほしい」といった用途で有効なオプションです。
今回の教訓としては、
- ssh-agentを活用したいHostでは、
IdentitiesOnly yesを付けない - どうしても使う場合は、そのHostに対して「agentに載せる鍵」と「IdentityFileの指定」をきちんと揃える
あたりを意識しておくと、ハマりにくくなります。