当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題の表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Windowsでgit pushのたびにSSH鍵のパスフレーズを聞かれる問題

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 agentssh-agent サービスが起動していない → PowerShellで Start-Service ssh-agent
Device or resource busyGit 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でやるのが確実ということです。
これさえ覚えておけば、もうパスフレーズに悩まされることはなさそうです。

WindowsGitHubWindows

Posted by ipusiron