WindowsのWSL2でkeychainを使ってSSH鍵のパスフレーズを自動入力する
WindowsのWSL2環境で、サーバー接続やGit操作のたびに聞かれるSSH鍵のパスフレーズ入力を自動化する方法を解説します。keychainというツールを使い、ターミナル起動時に一度入力するだけで、その後の入力を省略できます。これにより、面倒なパスフレーズ入力の手間を省き、開発作業の効率を向上させます。
開発環境
- OS: Windows11
- Editor: Visual Studio Code
- WSL: Ubuntu 24.04 LTS
keychainのインストール
keychainは、SSHエージェント(ssh-agent)の管理を簡単にするためのツールです。SSH接続に使用する秘密鍵のパスフレーズ入力を簡略化し、ターミナルを一度閉じてもパスフレーズを記憶させ続けることができます。これにより、何度もサーバーへ接続する際のパスフレーズ入力の手間を省き、作業効率を向上させます。
以下のコマンドは、keychainをシステムにインストールするために使用します。
sudo: コマンドを管理者権限(スーパーユーザー権限)で実行するための命令です。ソフトウェアのインストールなど、システム全体に関わる変更を行う際に必要となります。apt-get: DebianやUbuntuなどのLinuxディストリビューションで利用されるパッケージ管理ツールです。ソフトウェアのインストール、アップデート、削除を簡単に行うことができます。install keychain:apt-getに対して、keychainという名前のパッケージをインストールするよう指示しています。
このコマンドを実行することで、お使いのシステムにkeychainがインストールされます。
1sudo apt-get install keychain
keychainの初回実行
keychainは、SSH接続で利用する秘密鍵のパスフレーズ入力を効率化するためのツールです。通常、サーバーへSSH接続するたびにパスフレーズの入力が必要ですが、keychainを使うと、ログイン中に一度だけ入力すれば、その後の入力が不要になり大変便利です。
以下のコマンドは、keychainを初めて実行する際の例です。id_ed25519という名前の秘密鍵をkeychainに登録します。
1/usr/bin/keychain -q --nogui ~/.ssh/id_ed25519
-q: 実行中のメッセージを抑制し、静かに処理を行うためのオプションです。--nogui: GUI(グラフィカルな画面)を使用しないことを明示するオプションです。サーバーなど、CUI(コマンド入力)のみの環境で動作させる場合に指定します。~/.ssh/id_ed25519:keychainに登録したい秘密鍵のファイルパスを指定しています。
このコマンドを実行すると、以下のように秘密鍵に対応するパスフレーズの入力を求められます。この操作は、PCを起動してから最初にkeychainを利用するときに一度だけ行います。
1Enter passphrase for /home/username/.ssh/id_ed25519:
ここで正しいパスフレーズを入力すると、その情報がSSHエージェントに登録されます。これにより、以降ターミナルを閉じるまで、SSH接続時にパスフレーズを再入力する必要がなくなります。
keychainスクリプトの生成確認
keychainのセットアップが正常に完了すると、設定を読み込むためのスクリプトファイルが生成されます。以下のコマンドを実行して、それらのファイルが正しく作成されているかを確認します。
1ls -la ~/.keychain/ | grep username
このコマンドは、2つのコマンドを|(パイプ)でつないでいます。それぞれの役割は以下の通りです。
ls -la ~/.keychain/: ホームディレクトリにある.keychainという隠しディレクトリの中のファイルやディレクトリを、詳細情報付きで一覧表示します。| grep username: 左側のコマンドの実行結果の中から、usernameという文字列が含まれる行だけを絞り込んで表示します。
コマンドを実行すると、以下のような結果が表示されます。
出力結果1drwx------ 2 username username 4096 Dec 12 17:35 . 2drwxr-x--- 5 username username 4096 Dec 12 17:32 .. 3-rw------- 1 username username 82 Dec 12 17:32 username-csh 4-rw------- 1 username username 132 Dec 12 17:32 username-fish 5-rw------- 1 username username 112 Dec 12 17:32 username-sh
この出力結果の中で特に重要なのは、以下の3つのファイルです。
username-cshusername-fishusername-sh
これらは、csh、fish、shといった、利用するシェルの種類に応じてkeychainの情報を読み込むためのスクリプトファイルです。これらのファイルが生成されていれば、keychainの初期設定は成功しています。
keychainスクリプトの読み込み
1source ~/.keychain/username-sh
このコマンドは、keychainというツールが生成した設定ファイルを現在のターミナルに読み込ませるためのものです。
sourceコマンドを実行すると、keychainはssh-agentというプログラムがすでに動いているかを探します。ssh-agentは、SSH接続で使う秘密鍵のパスフレーズを一時的に記憶してくれるプログラムです。
もしssh-agentがまだ起動していなければ、keychainが新しく起動します。すでにssh-agentが動いている場合は、新しく起動するのではなく、既存のssh-agentに接続します。
この仕組みにより、ターミナルを開くたびにssh-agentが複数起動するのを防ぎ、効率的にパスフレーズを管理できます。結果として、一度パスフレーズを入力すれば、その後はターミナルを閉じない限り再入力が不要になります。
ssh-agentの起動確認
ssh-agentが現在システム上で動いているか(起動しているか)を確認するためのコマンドです。ssh-agentは、SSH接続で利用する秘密鍵のパスフレーズを一時的に記憶してくれる便利なプログラムです。
pidofコマンドは、指定したプログラム名の「プロセスID(PID)」を表示します。プロセスIDとは、コンピュータ上で動作している各プログラムに割り当てられる、一意の識別番号のことです。
以下のコマンドを実行することで、ssh-agentのプロセスIDを調べることができます。
1pidof ssh-agent
出力結果13656
上記のように数字が表示された場合、それがssh-agentのプロセスIDです。これは、ssh-agentが正常に起動していることを意味します。この数字は環境や起動するたびに変わります。
もしコマンドを実行しても何も表示されなかった場合は、ssh-agentが起動していないことを示します。
bash起動時にkeychainを有効化する設定
これは、ターミナル(Bash)が起動するたびに読み込まれる設定ファイルである .bashrc を編集するためのコマンドです。このファイルに設定を記述することで、ターミナル起動時に特定のコマンドを自動で実行させることができます。
sudo: コマンドを管理者権限で実行します。ファイルの編集に管理者権限が必要な場合に使用します。vim: テキストエディタの一つで、ファイルの内容を編集するために使用します。~/.bashrc: ホームディレクトリにあるBashの設定ファイルです。
1sudo vim ~/.bashrc
上記のコマンドでファイルを開いたら、以下の1行をファイルの末尾に追記します。
これはkeychainというツールを使い、SSH接続時の秘密鍵のパスフレーズ入力を簡略化するための設定です。この設定により、ターミナルセッションで最初の1回だけパスフレーズを入力すれば、その後は再入力が不要になります。
eval: 後ろのコマンドが生成した文字列を、さらにコマンドとして実行します。keychain --eval ~/.ssh/id_ed25519: 指定したSSH秘密鍵 (~/.ssh/id_ed25519) をSSHエージェントに登録し、そのために必要な環境変数を設定するコマンドを生成します。
この一行を.bashrcに追記することで、ターミナルを起動するたびにkeychainが自動で実行され、SSHの認証が便利になります。
1eval `keychain --eval ~/.ssh/id_ed25519`
WSL再起動による動作確認
設定変更などを反映させるために、WSL(Windows Subsystem for Linux)を再起動して動作を確認する方法を説明します。
まず、以下のコマンドを実行して、対象のLinuxディストリビューション(この例ではUbuntu-24.04)を完全に停止させます。
1wsl --terminate Ubuntu-24.04
次に、以下のコマンドで、停止させたディストリビューションを再度起動します。これにより、新しいターミナルウィンドウが開きます。
1wsl -d Ubuntu-24.04
WSLを起動した際、SSHの接続情報を管理するssh-agentというプログラムがまだ起動していない、またはSSH鍵の情報を読み込んでいない状態です。そのため、以下のようにSSH鍵に設定したパスフレーズの入力を求められることがあります。
出力結果1 * keychain 2.8.5 ~ http://www.funtoo.org 2 * Waiting 5 seconds for lock... 3 * Found existing ssh-agent: 623 4 * Adding 1 ssh key(s): /home/username/.ssh/id_ed25519 5Enter passphrase for /home/username/.ssh/id_ed25519:
このプロンプトで一度正しいパスフレーズを入力すると、その情報はssh-agentに記憶されます。そのため、このWSLセッションが起動している間は、GitHubへのアクセスなどで再度パスフレーズを聞かれることはなくなり、スムーズに作業を進めることができます。
VS Codeのコマンドパレット経由でGit操作する場合の設定
VS Codeのコマンドパレットから git push などのGit操作を行う際に、SSHキーのパスフレーズを毎回入力する手間を省くための設定です。この設定には、パスフレーズを記憶してくれる keychain というツールを利用します。
まず、ユーザーがログインする際に自動的に読み込まれる設定ファイル ~/.profile を編集します。以下のコマンドは、vim というエディタを使ってこのファイルを開くためのものです。
1sudo vim ~/.profile
次に、開いた ~/.profile ファイルの末尾に、以下の2行を追記します。この記述により、ログイン時に keychain が自動で起動し、SSHキーを登録するようになります。
1eval `keychain --eval $HOME/.ssh/id_ed25519` 2eval `keychain --eval ~/.ssh/id_ed25519`
このコマンドは、SSHキーの情報を一時的に記憶・管理してくれるプログラム(SSHエージェント)に、指定したSSHキー (~/.ssh/id_ed25519) を登録し、その設定を現在の環境に反映させるためのものです。$HOME と ~ はどちらもユーザーのホームディレクトリを指すため、基本的には同じ設定を記述しています。
この設定をファイルに保存してターミナルを再起動するか、PCに再ログインすると設定が有効になります。これで keychain の設定が引き継がれます。結果として、VS CodeのようなGUIアプリケーションからGitを操作する場合でも、SSHキーのパスフレーズを何度も入力する必要がなくなります。
トラブルシューティング
keychainでエラーが発生する場合
SSHエージェントにSSHキーを登録しようとした際に、以下のようなエラーメッセージが表示されることがあります。これは、SSHキーの追加に失敗したことを示しています。
出力結果1 * Error: Problem adding; giving up
このエラーは、多くの場合、SSH秘密鍵ファイルの権限設定が原因です。
SSH秘密鍵の権限確認
SSH秘密鍵は、サーバーへ安全に接続するための非常に重要なファイルです。そのため、ファイルの所有者本人だけが読み書きできるように、権限を厳しく設定する必要があります。
現在の権限設定を確認するには、ターミナルで以下のコマンドを実行します。ls -lは、ファイルやディレクトリの詳細情報を表示するコマンドです。
1ls -l ~/.ssh/id_ed25519
コマンド実行後、先頭の文字列が以下のように-rw-------となっていれば、権限は正しく設定されています。これは「ファイルの所有者だけが読み書き可能」という意味です。
出力結果1-rw------- 1 username username 464 Dec 4 13:13 /home/username/.ssh/id_ed25519
もし、以下のように-rw-r--r--と表示された場合、権限が緩すぎるためエラーの原因となっています。この設定は「所有者以外もファイルを読み取れる」状態を意味しており、セキュリティ上問題があります。
出力結果1-rw-r--r-- 1 username username 464 Dec 4 13:13 /home/username/.ssh/id_ed25519
権限の修正方法
ファイルの権限を修正するには、chmodコマンドを使用します。以下のコマンドを実行することで、SSH秘密鍵の権限を「所有者だけが読み書き可能」な状態に変更できます。
1chmod 600 ~/.ssh/id_ed25519
600という数字は、所有者に読み取り(4)と書き込み(2)の権限を与え、その他のユーザーには一切権限を与えない(0)という設定を意味します。このコマンド実行後、再度keychainへの登録を試してください。
おわりに
この記事では、keychainを導入し、WSL2環境でSSH鍵のパスフレーズ入力を自動化する方法を解説しました。.bashrcなどの設定ファイルにコマンドを追記することで、ターミナル起動時に一度パスフレーズを入力するだけで、その後の入力を省略できます。この設定により、サーバー接続やGit操作のたびに発生していた手間が省かれ、開発の効率が大きく向上します。もしエラーが出た場合は、解説したようにSSH秘密鍵の権限設定を見直してみてください。