Windowsでgit pushのたびにSSH鍵のパスフレーズを聞かれる問題
目次
はじめに
いつもブログをご覧いただきありがとうございます。
ミジンコに転生したIPUSIRONです😀
GitHubにSSHでpushするとき、毎回"Enter passphrase for key '/c/Users/owner/.ssh/id_rsa’:"といったパスフーレズを要求されてうんざりすることはありませんか?
「VSCodeでは聞かれないのに、Git Bashだと毎回要求される」「いつもはパスフレーズを要求されないのに、新しく作ったリポジトリで要求されるようになってしまった」など、あるかもしれません。
本記事では、その原因と、一度登録すれば二度と聞かれない設定方法をまとめます。
【原因】ssh-agentが鍵を覚えていない
Windowsでは、SSHの認証情報を保持するエージェント(ssh-agent
)が別プロセスとして動いています。
このサービスが起動していない/鍵が登録されていないと、毎回パスフレーズを聞かれます。
解決手順まとめ
1:OpenSSH Agentサービスを有効化
管理者権限でPowerShellを起動し、以下のコマンドを実行します。
> Get-Service ssh-agent | Set-Service -StartupType Automatic
> Start-Service ssh-agent
これでWindows起動時にエージェントが自動で立ち上がります。

ステップ2:環境変数を登録(Git Bashからも接続できるように)
PowerShellで次を実行します。
> setx SSH_AUTH_SOCK \\.\pipe\openssh-ssh-agent
VSCodeやGit Bashをいったん閉じて再起動してください。
ステップ3:PowerShellで鍵を登録
PowerShell(管理者でなくてOK)で次を実行します。
> & "$env:WINDIR\System32\OpenSSH\ssh-add.exe" "$env:USERPROFILE\.ssh\id_rsa"
(初回だけパスフレーズを入力)
登録確認できたことを確認します。
> & "$env:WINDIR\System32\OpenSSH\ssh-add.exe" -l
4096 SHA256:abcd1234... XXXXXXXXXXXXXXXXXXXX (RSA) ←このように出れば鍵がエージェントに登録されたことを意味する。

動作確認(Git Bash/VSCode)
Git BashまたはVSCodeのターミナルで以下を実行します。
$ git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
$ ssh -T git@github.com
Hi XXXX! You've successfully authenticated, but GitHub does not provide shell access. ←これが出れば成功。
以後はgit pushしてもパスフレーズは一切聞かれません。
補足:一度設定すれば永続化される
- ssh-agent は自動起動に設定済み。
- 鍵はエージェントに保持され、Windows再起動後も維持されます。
- GitがWindows標準のOpenSSHを使うように指定したので、VSCode・Git Bashどちらでも統一。
トラブルメモ
症状 | 対処 |
---|---|
Could not open a connection to your authentication agent | ssh-agent サービスが起動していない → PowerShellで Start-Service ssh-agent |
Device or resource busy | Git Bashのssh-addを使っている → Windows版 ssh-add.exe で登録 |
The agent has no identities. | 鍵未登録 → PowerShellで ssh-add 再実行 |
Enter passphrase... が再び出る | Gitが別のSSH実装を参照している → git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe" |

【補足】where ssh-addで確認する方法
Git BashとWindowsの両方にssh-add.exeが存在するため、どちらを使っているかで挙動が変わります。
とくに"Device or resource busy"や"posix_spawnp: Unknown error"が出る場合は、別のssh-add を呼んでいる可能性があります。
以下のコマンドで確認してみてください。
$ where ssh-add
C:\Windows\System32\OpenSSH\ssh-add.exe ←出力。
C:\Program Files\Git\usr\bin\ssh-add.exe ←出力。
上のパスが Windows標準版(正しい方)、下のパスが Git for Windows 同梱版(エラーを起こしやすい方) です。
もしGit Bashで実行してもうまくいかない場合は、PowerShellで次のように直接Windows版を呼び出してください。
> & "$env:WINDIR\System32\OpenSSH\ssh-add.exe" "$env:USERPROFILE\.ssh\id_rsa"
これで確実に正しいエージェント(OpenSSH Authentication Agent)に鍵が登録されます。
ポイントまとめ
- ssh-addが複数存在するのは仕様。
- Windows環境ではPowerShellからWindows版ssh-addを使うのがもっとも安定。
- where sshコマンドでも同様に、複数のssh.exeがあることを確認できる。
- Git Bashのssh-addはMSYS2互換層で動くため、Windowsサービスのssh-agentと通信できずエラーになる。
おわりに
私も最初は"Device or resource busy"や"posix_spawnp: Unknown error"といったエラーでハマりました。
最終的に分かったのは、鍵の登録はPowerShellでやるのが確実ということです。
これさえ覚えておけば、もうパスフレーズに悩まされることはなさそうです。