リモートPCに、SSH(Secure Shell)の公開鍵認証で接続する方法をまとめました。
前の以下記事で、VSCodeからリモートPCのワークスペースを開く方法を紹介した際にSSH接続にも触れたのですが、本題ではなかったこともあって解説を省略したので、その分を本記事でまとめてみました。
- 1.SSH、公開鍵認証とは
- 2.SSH接続(Windows)
- 3.SSH接続(WSL2 Ubuntu)
1. SSH、公開鍵認証とは
SSHは、Secure Shellの略で、以下です。
ネットワークを介してリモートにあるPCに対して、コマンド実行など遠隔操作を行うための通信プロトコル
ネットワークを流れるデータに対して暗号化がかかるため、盗聴されにくく安全です。
同様のことを実現する通信プロトコルにtelnetがありますが、こちらは、暗号化されていない生のデータがネットワークに流れるため、入力したパスワードなどを盗聴されるリスクがあります。なので、現在は、SSHが主流になってます。前の記事で取り上げたVSCodeも、SSHを使って、リモートPCのワークスペースに対する遠隔操作(ビルド、デバッガ実行等)を実現しています。
また、公開鍵認証とは、SSH接続時のユーザー認証方法の1つで、以下です。
公開鍵、秘密鍵という錠前(錠と鍵のセット)を使って行うユーザー認証
「公開鍵」は「鍵」という単語が入ってますが、南京錠のような「錠」に相当します。
「公開鍵」という錠をあらかじめサーバー(リモートPC)に設置して施錠しておき、それを「秘密鍵」で開錠する、といったイメージです(下図)。
ユーザー認証方法として最もポピュラーなのはパスワード認証で、SSHでもサポートしてます。手軽ですが、安易なパスワード(ユーザー名と同じにする等)にすると他人に推測されるリスクがあります。公開鍵認証だと、秘密鍵を推測するのはまず不可能と思われるので、その分安全です。
安全性以外でも、パスワード認証は、接続の際にキー入力を求められますが、公開鍵認証ではそれがないので、自動化に適しています。1時間おきにリモートPCに自動接続してファイルを取ってくる、といったスクリプトも実現しやすいです。
2. SSH接続(Windows)
本章では、Windows PC上でSSHサーバーを起動し、そこに別PCからSSH接続する手順を説明します。やりたいことは下図です。
ローカルPCがMac(しかも古い)なのはうちのPC事情でそうなっただけで、クライアント側の手順にはMac固有の事項がほぼない(フォルダパスぐらい)ので、ローカルPCがWindowsであってもそのまま適用可能です。
やることは以下です。
- 2.1 SSHサーバーインストール&起動(リモートPC)
- 2.2 ポート開放(リモートPC)
- 2.3 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC)
- 2.4 SSH接続(ローカルPC)
SSHは、ローカルPC/リモートPC双方に設定ファイルが点在します。下図に構成ファイルを整理しておきました。色々あるように見えますが、SSHクライアント、SSHサーバーのconfigと、秘密鍵/公開鍵ファイルだけで、割とシンプルです。
2.1 SSHサーバーインストール&起動(リモートPC)
リモートPC(Windows)で、SSHサーバーをインストール&起動するまでを説明します。ここでは以下を実施します。
- OpenSSHサーバーのインストール
- config編集(sshd_config)
- OpenSSHサーバー起動
OpenSSHサーバーのインストール
SSHサーバーは、OpenSSHサーバーがWindows11の機能としてあるので、それをインストールすれば使用できます。インストールは、Windows11の設定アプリから行えます。手順を下図にまとめました。
④のインストールは、すぐに終わるのかと思いきや、割と時間がかかりました。うちのPC環境で約10分ぐらいかかりました。
config編集(sshd_config)
OpenSSHサーバーのconfig(下図赤枠)を編集します。configファイル(sshd_config)の場所は下図記載の通りです。
configファイル(sshd_config)はテキストファイルなので、メモ帳やサクラエディタ等、お好きなテキストエディタで編集できますが、ここで1点注意点があります。
管理者権限で起動したテキストエディタでconfigファイル(sshd_config)をロードし、編集する
筆者はこれを怠り一般ユーザー権限でテキストエディタを起動してconfigファイルを編集してしまったがために、OpenSSHサーバーがconfig設定通りに起動できずDefault状態で起動してしまう、という現象に陥ってしまいました。
configファイルのセーブはちゃんとできていたので、原因がさっぱりわからず、ハマってしまいました。ChatGPTに聞くと色んな解決案を提案してくれるのですが、どれも成功せず、SIDサービスの有効化など、よくわからない回り道をさせられた挙句、OpenSSHサーバーが壊れているので無理、Windowsを再インストールしなさい、という乱暴な結論で締めくくられてしまいました。
Windowsの再インストールを実行する気にはなれなかったので、configファイルが読み込まれてない、という現象に立ち戻り、ググりながら、configファイルを再作成したり色々試行錯誤して、上述の解決案になんとかたどり着きました。
configファイル(sshd_config)を管理者権限のテキストエディタで開いたら、以下編集(編集箇所のみ抜粋)を行い、ポート変更&公開鍵認証の有効化、を行います。
# ポート変更
Port 10022
# 公開鍵認証の有効化
PubkeyAuthentication yes
# 以下行はコメントアウト
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
ポート変更は必須ではなく、何も設定しなければデフォルトポート(22)でSSHサーバーが起動します。ただ、デフォルトポート(22)は、SSHのポートとして広く知られているポート(下記URL参照)であり、狙われるリスクが高いので、安全性を高めるために、変更を行っておいたほうがよいです。上記ポート例(10022)以外でも、10000より上のポート番号は大体空いているので、好きなポートを指定すればよいです。
administrators_authorized_keysは、Windows独自の設定のようですが、よくわからないし、ググると、コメントアウトすべき、という意見が多かったので、コメントアウトしておきました。
OpenSSHサーバー起動
Windows11のサービスアプリからOpenSSHサーバーを起動します。
まず、サービスアプリを起動します。スタートボタンから「サービス」と検索し、出てきたサービスアプリをクリックすれば起動できます。コマンドラインだと、PowerShellやWin+Rから、services.mscを実行すれば起動できます。
サービスアプリ内で、「OpenSSH SSH Server」という項目を探して選択し、左上の「▶」(下図赤丸)をクリックすれば、SSHサーバーを起動できます。
ただし、これだけだと、PC再起動時にSSHサーバーは起動しないため、PC再起動の度にサービスアプリから「▶」をクリックすることになります。下図緑字の手順を追加実行すれば、PC起動時にSSHサーバーも自動起動するようになります。
2.2 ポート開放(リモートPC)
SSHサーバーで使用するポート(2.1節 sshd_configに記入したポート)を開放します。
Windowsの設定アプリから、下図手順で開放できます。
2.3 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC)
ローカルPCで公開鍵/秘密鍵を作成し、公開鍵をリモートPCに設置します(下図赤枠)。
公開鍵/秘密鍵の作成は、ローカルPCのターミナル上でssh-keygenコマンドを実行します。
# ホームフォルダに移動
cd $HOME
# .sshフォルダ作成(※既にある場合は不要)&移動
mkdir .ssh
cd .ssh
# 公開鍵、秘密鍵作成
# 問い合わせにはすべて空入力(リターンのみ)でOK
ssh-keygen -t ed25519
今回は、ローカルPC=Macで行いましたが、WindowsやLinuxでも同じコマンドでOKです。ホームフォルダ($HOME)の場所だけがOS毎に異なります。下表にまとめておきましたが、これを直接入力しなくても、ターミナルには$HOME(もしくは、~)と入力すればよいです。
| OS | ホームフォルダ($HOME)の場所(※xx:ユーザー名) |
|---|---|
| Mac | /Users/xx |
| Windows | c:\Users\xx |
| Linux(WSL2 Ubuntuも含む) | /home/xx |
ssh-keygenを実行するとファイルが2つ出力されますが、
-
id_ed25519が秘密鍵 -
id_ed25519.pubが公開鍵
です。どちらもテキストファイルなので、テキストエディタで中身を見ることができます。秘密鍵には、かなり長い文字の羅列が書き込まれています。公開鍵には、文字の羅列+ローカルPCのユーザー名/PC名が1行で書き込まれてます。
なお、ed25519というのは、デジタル署名アルゴリズムの1つで、従来のRSAより高速かつ安全、とのことなので、これを使っておけば無難かと思われます。
作成した公開鍵をリモートPCに設置します。
リモートPCに設置するのは、公開鍵 です。秘密鍵をリモートPCに「公開」してはいけません。
SSHサーバーは、リモートPCのホームフォルダ/.sshにあるauthorized_keysというファイルに登録されている公開鍵情報を参照するので、ここに、さきほど作成した公開鍵を登録します。authorized_keysファイルがもしなければ、あらかじめ空のテキストファイルとして作成しておきます。
このauthorized_keysファイルに、ローカルPCにある公開鍵ファイル(id_ed25519.pub)の中身をコピーします。
コピーの方法はいろいろありますが、今回は、リモートPCのWindowsエクスプローラ上で公開鍵ファイル(id_ed25519.pub)とauthorized_keysファイルを開いて、テキストエディタ上でコピペする方法をとりました(下図)。この方法だと、何をしているのか、がよくわかります。テキストエディタは一般ユーザー権限でOKです。
なお、コピーは、以下記事のように、ssh-copy-idコマンドを使うのがメジャーなやり方のようです。ただ、これをやる場合は、本記事では有効化していないSSHのパスワード認証を一時的に有効化する必要がありそうです。
2.4 SSH接続(ローカルPC)
ローカルPCのターミナル上でsshコマンド(SSHクライアントソフトの1つ)を実行すれば接続できます。sshコマンドは、Windows/Linuxでも共通です。
Windowsなら、TeraTerm等、他のSSHクライアントソフトを使っても接続できます。
# SSH接続
# ssh -i <秘密鍵> -p <リモートPCのポート> <リモートPCのユーザー名@IPアドレス>
ssh -i $HOME/.ssh/id_ed25519 -p 10022 takamasa@192.168.0.5
ローカルPC=Macでの実行例は下図です。リモートPC(Windows)のホームフォルダに接続できてます。

ローカルPCのconfigファイル(下図赤枠)は、なくても上記で接続できます。ただ、configファイルがあれば、sshコマンドの入力を簡略化できます。
configファイルは、ローカルPCのホームフォルダ/.sshに、以下内容のテキストファイルを作成します。一般ユーザー権限のテキストエディタで作成してOKです。
Host <ホスト名> ※任意の名前
HostName <リモートPCのIPアドレス>
User <リモートPCのユーザー名>
Port <リモートPCのポート>
StrictHostKeyChecking no
PasswordAuthentication no
PreferredAuthentications publickey
IdentityFile <秘密鍵>
IdentitiesOnly yes
Host desk-windows
HostName 192.168.0.5
User takamasa
Port 10022
StrictHostKeyChecking no
PasswordAuthentication no
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
configファイルを作成しておけば、sshコマンドの入力は下記のように簡略化できます。
# SSH接続
# ssh <ホスト名> ※configファイルに入力したホスト名
ssh desk-windows
3. SSH接続(WSL2 Ubuntu)
Windows PC内のWSL2 Ubuntu上でSSHサーバーを起動し、そこに別PCからSSH接続する手順を説明します。やりたいことは下図です。
やることは以下です。2章と比べてやることが多く大変そうですが、3.2節のSSHサーバー絡みでハマりにくく、案外すんなり実行できます。
- 3.1 WSL2ネットワークモード設定(リモートPC(Windows))
- 3.2 SSHサーバーインストール&起動(リモートPC(WSL2))
- 3.3 ポート開放(リモートPC(Windows))
- 3.4 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC(WSL2))
- 3.5 SSH接続(ローカルPC)
構成ファイルは下図です。WSL関連のconfigファイルが増えてます。
3.1 WSL2ネットワークモード設定(リモートPC(Windows))
リモートPC(Windows)上で、WSL2のネットワークモードを、ミラーモード(mirrored)に設定します。
ミラーモードとは以下です。
WSL2の仮想ネットワークを、ホスト(Windows)の物理ネットワークにミラーリング(同一視)するモード
WSL2では、仮想化技術によって、ホスト(Windows)のPC内部に、独立した仮想PCが生成されてます。Ubuntuもその仮想PCにインストールされます。ネットワークも、独立した仮想ネットワークがPC内部に生成されてます。仮想PCはそこにしか接続しておらず、かつ、外部PCから仮想ネットワークが見えないため、外部PCから仮想PCには、通常の手段では接続できません。
なので、ミラーモード登場以前は、外部PCから接続するために、ポートフォワードという処理を別途行う必要がありました。ポートフォワードとは、あるPCのポートへのアクセスを別PCのポートに転送する、という処理です。ホスト(Windows)のポートへのアクセスを、ポートフォワードで仮想PCのポートに転送することで、外部PCから仮想PCへの接続を確立させてました。
ただ、ミラーモードの登場によって、仮想ネットワークと物理ネットワークが同一視される(同一であるように見える)ようになるため、ポートフォワードをする必要がなくなり、外部PCからの接続確立が容易になりました。もっとも、ミラーモードを実現する手段として内部でポートフォワードが行われているのかもしれませんが、これを意識する必要はありません。
ミラーモードの説明がいささか長くなりましたが、ミラーモードに設定する方法は簡単です。
リモートPC(Windows)上にある、WSL2のconfigファイル(c:\Users\xx\.wslconfig)に以下を追記し、リモートPC(Windows)上でWSL2を再起動するだけです。
[wsl2]
networkingMode=mirrored
# WSL再起動
wsl --shutdown
.wslconfigファイルがない場合は、空のテキストファイルとして作成し、テキストエディタで上記を書き込めばOKです。テキストエディタは一般ユーザー権限でよいです。
3.2 SSHサーバーインストール&起動(リモートPC(WSL2))
リモートPC(WSL2 Ubuntu)で、SSHサーバーをインストール&起動するまでを説明します。2章同様、以下を実施します。
- OpenSSHサーバーのインストール
- config編集(sshd_config)
- OpenSSHサーバー起動
OpenSSHサーバーのインストール
OpenSSHサーバーのインストールは、WSL Ubuntuのターミナルから以下コマンドを実行します。
# SSHサーバー(sshd)インストール
sudo apt install openssh-server
config編集(sshd_config)
OpenSSHサーバーのconfig(下図赤枠)を編集します。configファイル(sshd_config)の場所は下図記載の通りです。
configファイル(sshd_config)はテキストファイルなので、お好きなテキストエディタ(vi、nano、gedit、emacs等)で編集可能です。ただし、2章同様、
管理者権限(※)で起動したテキストエディタで編集
(※)ubuntuの管理者権限(sudoを付与してエディタ起動)
する必要があります。
# テキストエディタ(nano)起動例(ubuntu管理者権限)
cd /etc/ssh
sudo nano sshd_config
ただ、2章のWindowsと異なるのは、誤って一般ユーザー権限のテキストエディタで編集した場合、編集結果のセーブがそもそもできないことです(アクセス権限エラーになる)。セーブ時のエラーで誤りに気づけるし、ホームフォルダ以外のファイルを管理者権限で編集する、というのはLinuxの常識ですので、Windowsのときのように原因不明のエラーにハマるリスクは小さいかと思われます。
configファイル(sshd_config)の編集内容は2章とほぼ同様です(以下)。administrators_authorized_keysの行はこちらには元々入ってないので、ケアは不要です。
# ポート変更
Port 20022
# 公開鍵認証の有効化
PubkeyAuthentication yes
OpenSSHサーバー起動
Windowsのサービスアプリに相当するsystemctlコマンドで起動します。ただし、WSL2のUbuntuでは、デフォルトでこのコマンドが無効化されているので、有効化が必要です。
systemctlコマンドの有効化は、WSL2 Ubuntu内の/etcフォルダにあるwsl.confというconfigファイル(テキストファイル)(下図赤枠)を以下内容で作成します。
[boot]
systemd=true
作成後にWSL2を再起動すれば、有効化完了です。
# WSL再起動
wsl --shutdown
それにしても、なんでWSL2の設定ファイルが
.wslconfigとwsl.confの2つに分かれているのか。1つにまとめてくれればいいのに。。
有効化後は、systemctlコマンドでOpenSSHサーバーを起動します。WSL2起動時にSSHサーバーを自動起動する設定もこのコマンドで可能です。
# WSL2起動時にOpenSSHサーバーを自動起動する設定
sudo systemctl enable ssh
# OpenSSHサーバー起動
sudo systemctl start ssh
3.3 ポート開放(リモートPC(Windows))
ポート開放は、リモートPCのWindows上で行います(※WSL2 Ubuntu上ではない)。手順は、2.2節と全く同じですので、そちらを参照いただけたらと思います。
3.4 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC(WSL2))
ここも、2.3節と全く同様の手順で行えます。違いは公開鍵情報(authorized_keys)の格納フォルダだけです(下図)。手順は、2.3節を参照いただけたらと思います。
3.5 SSH接続(ローカルPC)
ここも、2.4節と全く同様の手順です。configファイルの例、および、SSH接続のsshコマンド実行例を抜粋します。詳細は2.4節を参照いただけたらと思います。
Host desk-wsl-ubuntu
HostName 192.168.0.5
User simasaki
Port 20022
StrictHostKeyChecking no
PasswordAuthentication no
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
# SSH接続
# ssh <ホスト名> ※configファイルに入力したホスト名
ssh desk-wsl-ubuntu

















