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 | ✔ | ✔ | ✔ |
※いずれも最終アップデートまで更新した時点のもの
キーのアルゴリズムの選択
接続キーのアルゴリズムは下記の順で選択する。
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 で実行すればできそうだが、手段が目的化しそうなのでそこまでは追求しないことにする。