SSH用キーの作り方と登録方法まとめ

目次

要旨

Linux および Windows で OpenSSH の公開鍵・秘密鍵ペアを作成する際の手順をまとめておく。

SSH設定フォルダ

クライアント接続用の秘密鍵・公開鍵・その他各種設定ファイルがデフォルトで配置される。

OS シェル 設定ベースフォルダ(シェル表記)
Linux bash ~/.ssh/ /home/USER1/.ssh/
Windows PowerShell ${env:USERPROFILE}\.ssh\ \Users\USER1\.ssh\

使用可能な証明書アルゴリズム

OS のバージョン(ディストリビューション) ごとに OpenSSH/OpenSSL の世代が異なるため、対応可能な証明書アルゴリズムの形式が異なる。

OS/Version リリース SSHパッケージ SSLライブラリ RSA ECDSA Ed25519
CentOS 3 2004年 OpenSSH 3.6.1p2 OpenSSL 0.9.7a
CentOS 4 2005年 OpenSSH 3.9p1 OpenSSL 0.9.7a
CentOS 5 2007年 OpenSSH 4.3p2 OpenSSL 0.9.8e
CentOS 6 2011年 OpenSSH 5.3p1 OpenSSL 1.0.1e
CentOS 7 2014年 OpenSSH 7.4p1 OpenSSL 1.0.2k
CentOS 8 2019年 OpenSSH 8.0p1 OpenSSL 1.1.1c
CentOS Stream 8 2020年 OpenSSH 8.0p1 OpenSSL 1.1.1?
CentOS Stream 9 2021年 OpenSSH 8.7p1 OpenSSL 3.0.?
Rocky Linux 9 2022年 OpenSSH 8.7p1 OpenSSL 3.0.7
Windows Server 2019 (1809) 2018年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows Server 2022 (21H2) 2022年 OpenSSH 8.1p1 LibreSSL 3.0.2
Windows 10 (1803) 2018年 OpenSSH 7.6p1 LibreSSL 2.6.4
Windows 10 (1809) 2018年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows 10 (1903) 2019年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows 10 (1909) 2019年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows 10 (2009) 2020年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows 10 (20H2) 2020年 OpenSSH 7.7p1 LibreSSL 2.6.5
Windows 10 (21H1) 2021年 OpenSSH 8.1p1 LibreSSL 3.0.2
Windows 10 (21H2) 2021年 OpenSSH 8.1p1 LibreSSL 3.0.2
Windows 10 (22H2) 2022年 OpenSSH 8.1p1 LibreSSL 3.0.2
Windows 11 (21H2) 2021年 OpenSSH 8.1p1 LibreSSL 3.0.2
Windows 11 (22H2) 2022年 OpenSSH 8.6p1 LibreSSL 3.4.3
Windows 11 (23H2) 2023年 OpenSSH 9.5p1 LibreSSL 3.8.2
macOS 10.10 Yosemite 2014年 OpenSSH 6.2p2 OSSLShim 0.9.8r
macOS 10.11 El Capitan 2015年 OpenSSH 6.9p1 LibreSSL 2.1.7
macOS 10.12 Sierra 2016年 OpenSSH 7.2p2 LibreSSL 2.4.1
macOS 10.13 High Sierra 2017年 OpenSSH 7.7p1 LibreSSL 2.6.2
macOS 10.14 Mojave 2018年 OpenSSH 7.9p1 LibreSSL 2.7.3
macOS 10.15 Catalina 2019年 OpenSSH 8.1p1 LibreSSL 2.7.3
macOS 11.x Big Sur 2020年 OpenSSH 8.1p1 LibreSSL 2.7.3
macOS 12.x Monterey 2021年 OpenSSH 8.6p1 LibreSSL 2.8.3
macOS 13.x Ventura 2022年 OpenSSH 9.01p1 LibreSSL 3.3.6
macOS 14.4以降 Sonoma 2023年 OpenSSH 9.6p1 LibreSSL 3.3.6

※いずれも最終アップデートまで更新した時点のもの

キーのアルゴリズムの選択

接続キーのアルゴリズムは下記の順で選択する。

  1. Ed25519
  2. ECDSA (521bit)
  3. RSA (SSH2-RSA 2048bit以上)
  4. DSA (非推奨)

OpenSSH/OpenSSL のバージョンによって利用できるアルゴリズムが異なる。クライアント側は Ed25519, ECDSA, RSA の3種類のキーペアを作っておき、接続先がサポートするもっとも推奨順の高いアルゴリズムのキーを使うのが望ましい。

キーペア作成方法

RSA, ECDSA, Ed25519 形式のキーペア (秘密鍵+公開鍵) をそれぞれ一発作成するコマンド。

コメントに「作成したユーザーとホスト名」を入れ、パスフレーズ「なし」の場合。

Linux OpenSSH (bash)

ssh-keygen -t ed25519 -q -N "" -C ${USER}@${HOSTNAME} -f ~/.ssh/id_ed25519
ssh-keygen -t ecdsa -b 521 -q -N "" -C ${USER}@${HOSTNAME} -f ~/.ssh/id_ecdsa
ssh-keygen -t rsa -b 2048 -q -N "" -C ${USER}@${HOSTNAME} -f ~/.ssh/id_rsa

Windows OpenSSH (PowerShell)

Windows コマンドラインでは「空の文字列」を指定するのに特殊な表記が必要。

ssh-keygen -t ed25519 -q -N '""' -C "${env:USERNAME}@${env:COMPUTERNAME}" -f ${env:USERPROFILE}/.ssh/id_ed25519
ssh-keygen -t ecdsa -b 521 -q -N '""' -C "${env:USERNAME}@${env:COMPUTERNAME}" -f ${env:USERPROFILE}/.ssh/id_ecdsa
ssh-keygen -t rsa -b 2048 -q -N '""' -C "${env:USERNAME}@${env:COMPUTERNAME}" -f ${env:USERPROFILE}/.ssh/id_rsa

接続先サーバに公開鍵を登録

接続先の SSH サーバに作成したキーを登録するには、接続先サーバの

(ホームディレクトリ)/.ssh/authorized_keys

に接続元の ./ssh/id_xxx.pub の内容を追記する。が、この作業が意外と手間なので、オリジナル OpenSSH パッケージには専用のスクリプトが同梱されている。authorized_key ファイルが存在しなければ作成し、パーミッションも正しく設定される。

Linux (CentOS 5/6) クライアント → Linux サーバ

REMOTEUSER=xxxx
REMOTEHOST=x.x.x.x
ssh-copy-id -i ${HOME}/.ssh/id_ed25519.pub ${REMOTEUSER}@${REMOTEHOST}
ssh-copy-id -i ${HOME}/.ssh/id_ecdsa.pub ${REMOTEUSER}@${REMOTEHOST}
ssh-copy-id -i ${HOME}Administrat/.ssh/id_rsa.pub ${REMOTEUSER}@${REMOTEHOST}

Linux (CentOS 7/8) クライアント → Linux サーバ

CentOS 7 以降搭載の OpenSSH では、(yes/no) と聞かれてしまうことを防止できる。

REMOTEUSER=xxxx
REMOTEHOST=x.x.x.x
ssh-copy-id -o StrictHostKeyChecking=no -i ${HOME}/.ssh/id_ed25519.pub ${REMOTEUSER}@${REMOTEHOST}
ssh-copy-id -o StrictHostKeyChecking=no -i ${HOME}/.ssh/id_ecdsa.pub ${REMOTEUSER}@${REMOTEHOST}
ssh-copy-id -o StrictHostKeyChecking=no -i ${HOME}/.ssh/id_rsa.pub ${REMOTEUSER}@${REMOTEHOST}

Windows OpenSSH クライアント → Linux サーバ

Windows (SSHクライアント) → Linux (SSHクライアント) の場合

Windows は ssh-copy-id のような bash スクリプトが使えないので、ワンライナーコマンドで代用する。

$REMOTEUSER = "xxx"
$REMOTEHOST = "x.x.x.x"
Get-Content ${env:USERPROFILE}/.ssh/id_ed25519.pub | ssh ${REMOTEUSER}@${REMOTEHOST} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
Get-Content ${env:USERPROFILE}/.ssh/id_ecdsa.pub | ssh ${REMOTEUSER}@${REMOTEHOST} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"
Get-Content ${env:USERPROFILE}/.ssh/id_rsa.pub | ssh ${REMOTEUSER}@${REMOTEHOST} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"

※エラーハンドリングはないので注意

接続先ホストが Windows sshd でAdministrator 権限で接続

特別なファイルに公開鍵を登録する必要がある。

${env:ProgramData}/ssh/administrators_authorized_keys

GUI で登録する場合は、管理者権限でメモ帳で開いてから貼り付ける。

notepad ${env:ProgramData}/ssh/administrators_authorized_keys

課題

  • Windows SSH クライアント → Windows SSH サーバ
  • Linux SSH クライアント → Windows SSH サーバ

の組み合わせで、ssh-copy-id のような一発登録する方法は現段階段階では不明。

双方に PowerShell 7 を入れて Remote-Sesion で接続してから PowerShell で実行すればできそうだが、手段が目的化しそうなのでそこまでは追求しないことにする。