skip to content
barorin&

WindowsのOpenSSHでssh-agentを使っているのに毎回パスフレーズを聞かれた話

/ 5 min read

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の設定を行いました。

  1. OpenSSHクライアントのインストール(必要なら)
    Windows 11では「オプション機能」の「OpenSSH クライアント」を有効化します。
  2. ssh-agentサービスの有効化
    管理者権限のPowerShellで、次を実行します。
Terminal window
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent

StatusRunningになっていればOKです。

  1. 鍵をssh-agentに登録
    普段使いのPowerShell(非管理者)で、次を実行します。
Terminal window
ssh-add $env:USERPROFILE\.ssh\id_rsa
ssh-add -l

ここで、登録した鍵のフィンガープリントが1行表示されることを確認します。

  1. sshコマンドの場所を確認
    PowerShellではwhereWhere-Objectのエイリアスなので、外部コマンド検索にはwhere.exeを使います。
Terminal window
where.exe ssh
where.exe ssh-add

ここで、以下のように表示されていれば、Windows標準のOpenSSHを使えている状態です。

C:\Windows\System32\OpenSSH\ssh.exe
C:\Windows\System32\OpenSSH\ssh-add.exe

それでも毎回パスフレーズを聞かれる

ここまで設定しても、次のようにパスフレーズを聞かれていました。

Terminal window
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 yes

IdentitiesOnly 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で次を実行します。

Terminal window
ssh-add $env:USERPROFILE\.ssh\id_rsa
ssh-add -l
ssh vps

これで、sshがssh-agent上の鍵も候補として使うようになり、パスフレーズが一度も聞かれずにVPSへ接続できるようになりました。

補足:IdentitiesOnly yesを使いたい場合

IdentitiesOnly yes自体は悪者ではなく、「agentに大量の鍵が載っていて毎回全部試されて遅い」「特定のHostではこの鍵だけを使ってほしい」といった用途で有効なオプションです。

今回の教訓としては、

  • ssh-agentを活用したいHostでは、IdentitiesOnly yesを付けない
  • どうしても使う場合は、そのHostに対して「agentに載せる鍵」と「IdentityFileの指定」をきちんと揃える

あたりを意識しておくと、ハマりにくくなります。