SSH:サーバーに接続できなくなったら
使っている秘密鍵や公開鍵、接続先のサーバーのホストキーがRSAかどうか確認しましょう。
OpenSSH 8.8 以降だとデフォルトでは RSA での鍵交換や検証などができなくなっています。
まとめ
~/.ssh/config に以下を追記する
code:config
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
概要
OpenSSH 8.8 からSHA-1のRSA鍵はデフォルトで無効になった Ubuntu 22.04 からは OpenSSH 8.9 がインストールされる そのため古いサーバーへSSHでアクセスしようとしたとき、ホストキーや公開鍵の検証でエラーになる場合がある
RSAのホストキーを持つサーバーに対してアクセスする場合、RSAの公開鍵認証を使ってSSHする場合の2箇所でそれぞれ対策が必要になる。
バージョンの確認
手元の macOS Ventura で OpenSSH のバージョンを確認すると以下のようになった
code:sh
❯ ssh -V
OpenSSH_9.0p1, LibreSSL 3.3.6
また、Ubuntu 22 の Dockerイメージ上で OpenSSH をインストールすると以下のようになった
code:sh
# ssh -V
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
解決方法 (ホストキー編)
ホストキーにRSAを使用している場合は、無効化されたホストキーの検証アルゴリズムに ssh-rsa を追加する必要がある
エラーメッセージとしては「Unable to negotiate with UNKNOWN port 65535: no matching host key type found. Their offer: ssh-rsa,ssh-dss」などがヒントになる
一気に解決するには ~/.ssh/config に以下の記述を追加すると良い
code:config
Host *
HostkeyAlgorithms +ssh-rsa
デフォルトで無効化されるようになった署名方法なので、可能であれば個別に有効化することが良さそう。
code:config
Host <HOSTNAME>
HostkeyAlgorithms +ssh-rsa
別解としては、接続先のサーバーのホストキーの更新を行うと良い。
解決方法 (公開鍵認証編)
公開鍵認証でもRSAを使用している場合、SSHクライアントのバージョンが OpenSSH 8.8 以上になるとホストキー同様 ssh-rsa を明示的に有効にする必要がある。
エラーメッセージとしては ssh -vvvv などで接続時のログを有効にしたときに出力される「send_pubkey_test: no mutual signature algorithm」や「we did not send a packet, disable method」がヒントになる
一気に解決するには ~/.ssh/config に以下の記述を追加すると良い
code:config
Host *
PubkeyAcceptedAlgorithms +ssh-rsa
別解としては、RSAの秘密鍵、公開鍵の組み合わせをやめて ED25519 などのより強固な暗号方式に対応した鍵を使うようにすると良い
関連情報