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

要旨

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

SSH設定フォルダ

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

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

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

OS のバージョン(ディストリビューション) ごとに OpenSSH/OpenSSL の世代が異なるため、対応可能な証明書アルゴリズムの形式が異なる。自分がアクセスできるサーバで確認した結果を示す。

OS/VersionリリースSSHパッケージSSLライブラリRSAECDSAEd25519
CentOS 32004年OpenSSH 3.6.1p2OpenSSL 0.9.7a
CentOS 42005年OpenSSH 3.9p1OpenSSL 0.9.7a
CentOS 52007年OpenSSH 4.3p2OpenSSL 0.9.8e
CentOS 62011年OpenSSH 5.3p1OpenSSL 1.0.1e
CentOS 72014年OpenSSH 7.4p1OpenSSL 1.0.2k
CentOS 82019年OpenSSH 8.0p1OpenSSL 1.1.1c
Windows Server 2019 (1809)2018年OpenSSH 7.7p1LibreSSL 2.6.5
Windows 10 (1909)2019年OpenSSH 7.7p1LibreSSL 2.6.5

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

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

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

  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 サーバ

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) と聞かれてしまうことを防止できる。

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 スクリプトが使えないので、ワンライナーコマンドで代用する。

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 で実行すればできそうだが、手段が目的化しそうなのでそこまでは追求しないことにする。