GitHub用SSH鍵を作ろう<Win11, 23H2 - PowerShell版>
GitHub用にSSH鍵を生成するときWindows版Git Bashは大抵はすんなり設定できるが、PowerShellはOpenSSHが入っていなかったりSSHエージェント自動起動がオフになっていたり、何かと初見殺しのトラップが多い。
本記事は、Windows版PowerShellでSSH鍵を生成し、GitHub接続まで行う手順をまとめた。初期設定のままだとWindows版VSCodeではPowerShellが起動する。Windows版Git Bashとコマンドが違うため本記事では差分を整理しておく。
【重要】PowerShellは「管理者権限」で起動すること。
0. "~/.ssh"ディレクトリを用意する
"~/.ssh" は Windows標準環境の場合、下記のパスとなる。
C:\Users\<Windowsユーザー名>\.ssh\
下記コマンドがエラーになればディレクトリが作成できていない。
cd ~/.ssh
.sshディレクトリがない場合は下記コマンドで作成しておこう。
mkdir ~/.ssh
1.PowerShellにSSHがインストールされているか?
ssh -V
上記コマンドがエラーになる場合、SSHがそもそもインストールされていない。Windowsアプリのオプション機能より「OpenSSHクライアント」を追加インストールしておこう。
インストールされているなら下記のような応答がある。
OpenSSH_for_Windows_8.6p1, LibreSSL 3.xx.xx
…Windows_8.6 の数字部分がOpenSSHのバージョンである。6.5未満だとed25519というアルゴリズムでのSSH鍵が作れないので注意しよう。
2.SSHエージェントを自動起動にする
SSHエージェントが自動起動の設定になっていないことがある。
下記コマンドでPC起動時にSSHエージェントが自動起動するようになる。
Set-Service -Name ssh-agent -StartupType Automatic
上記だけでは「自動起動」の設定なので、SSHエージェントを即起動させるコマンドも併記しておく。Set-Serviceのあとに実行しておくと確実だ。
Start-Service ssh-agent
3.SSHエージェントに登録済SSH鍵の管理
3-1.既に登録されているSSH鍵がないか?の確認
ssh-add -l
3-2.登録されているSSH鍵を消す場合
特定の鍵のみ消す場合
ssh-add -d <秘密鍵のファイルパス>
全て消す場合
ssh-add -D
上記コマンドはPowerShellで動いているSSHエージェントからの論理削除であって、SSH鍵そのものはPC本体に残っている。SSH鍵を物理削除は別途行う必要がある。
4.SSH鍵の生成
OpenSSHではバージョン6.5以降ならed25519というアルゴリズムでSSH鍵を生成が良いが、古いサービスやPCではRSAしか使えない場合がある。
RSA:長年に渡り使用されてきたアルゴリズムのため互換性が高く広く普及している。ed25519よりも鍵生成や認証に時間がかかる。
ed25519:比較的新しい後発のアルゴリズムで、RSAからed25519へ移行を推奨するサービスが増えている。古い環境は対応していない場合がある。
4-1.ed25519で鍵を作る場合
# ed25519でSSH鍵を生成する場合 ※"github_ed25519"というファイル名で生成する場合
ssh-keygen -t ed25519 -C "your_email@example.com" -f github_ed25519
4-2.RSAで鍵を作る場合
# RSAでSSH鍵を生成する場合 ※"github_rsa"というファイル名で生成する場合
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f github_rsa
5.公開鍵と秘密鍵について
ssh-keygen コマンドを実行すると、秘密鍵(private-key)と公開鍵(public-key)という二種類のSSH鍵が生成される。ファイル名の末尾に".pub"とついているファイルが公開鍵だ。
秘密鍵はあなたのPC内のSSHエージェントに登録する鍵だ。下記コマンドで登録する。
5-1.秘密鍵の登録
~/.ssh/github_ed25519 を登録する場合は下記のようになる。
ssh-add ~/.ssh/github_ed25519
"Could not open a connection to your authentication agent."といった応答が返ってくる場合はSSHエージェントが起動していない可能性があるので手順2を再確認しよう。
下記のような応答があれば登録が成功だ。
Identity added: ~/.ssh/github_ed25519 (your_email@example.com)
念のため、登録済のSSH鍵リストも確認しておこう。
ssh-add -l
5-2.GitHubアカウントに公開鍵を登録する
SSH公開鍵は、あなたのGitHubアカウントに登録しよう。まず、SSH公開鍵をPowerShellでクリップボードにコピーしよう。
公開鍵が"~/.ssh/github_ed25519.pub"に存在する場合は、下記コマンドで実行できる。
Get-Content ~/.ssh/github_ed25519.pub | clip
GitHubアカウント管理画面のSSH鍵登録画面にコピーした鍵内容を登録すれば完了する。Webブラウザ上の作業になるので、詳しくは公式サイトのリファレンスを確認しよう。
6.GitHubサーバへSSH鍵を使って接続できるかテストする
手順5の作業を完了した時点で、SSH鍵を使用した接続ができるようになっているはずだ。接続テストを行おう。
下記コマンドで接続テストが行える。
ssh -T git@github.com
GitHubへの初回接続は下記のような確認メッセージが発生する。
"This key is not known by any other names."
"Are you sure you want to continue connecting (yes/no/[fingerprint])?"
接続先のタイプミスがないか確認の上、yesを入力しよう。
6-1.GitHubへSSH鍵を使って接続に成功した時
SSH鍵の認証に成功すると、GitHubサーバーから下記のような応答が返ってくる。
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
6-2.GitHubへSSH鍵を使って接続に失敗した例
設定を間違えていると、下記のような認証失敗の応答が返ってくる。
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
7.SSH鍵の細かいオプション設定
~/.ssh/config はSSH設定ファイルになる。
このファイルを作成しておくことで複数のSSH鍵を使い分けたり、データ転送時の圧縮有無などを指定できるようになる。
最小限として下記設定をしておくと便利だ。※各行の#以降~行末部分はコメントなので理解できたなら削除して問題ない。
# ~/.ssh/config
Host github.com
IdentityFile ~/.ssh/github_ed25519 #使用する鍵のファイルパス
User <UserName> #あなたのユーザー名を記述
IdentitiesOnly yes # IdentityFile で指定した秘密鍵でのみ認証を試みる
Compression yes # Git でのファイル転送時に常時圧縮する(大容量の単一のファイルがアップ時はOFFが良い)
8.WSLやWindows版Git Bashを使う場合
PowerShell内で動くSSHエージェントとWindows版Git BashやWSL内のBASHで動くSSHエージェントは別アプリケーションである。Windows版Git Bashを使う場合、そちらでも改めてSSH鍵を登録する必要がある。
SSHの秘密鍵は、使いまわせる。
すなわち、PowerShellでSSH鍵を生成後、生成した秘密鍵はWindows版Git BashやWSL内のBashでも流用してよいし、逆にBashで生成済のSSH鍵があるならPowerShellでもそのまま登録するだけで良い。
PowerShellとBashでわざわざ異なるSSH鍵を生成し、個別管理することもできるが非常に面倒くさいので個人レベルの使用なら、共用を推奨する。
SSH鍵は使いまわせるが、PowerShellとBashはコマンド体系が異なるので注意しよう。
BASHは公式サイトのリファレンスが充実している。