前回
https://qiita.com/s_mitu/items/2efa89458cad6b9db440
に引き続き、FreeBSD 15.0-RELEASE で困ったことについて (実際に困ったときは 15.0-PRERELEASE の時分でしたが)。
OpenSSH で DSA ホストキーしか無いマシンに接続できない
前回でも触れましたが、FreeBSD 15.0-RELEASEから OpenSSH は DSA が無効化されてビルドされるようになりました。
そのため、ホスト鍵として DSA のみしか生成していない古い ssh サーバーマシンには接続できなくなります。
最近の OpenSSH では、DSA はビルドはされていても非推奨で、デフォルトの接続では ssh 接続のときの暗号化の候補から外されています。無理やり DSA を使った接続をさせたいときは、オプションで
% ssh -o HostKeyAlgorithms=+ssh-dss very_oldhost
などとします。
また、決まった接続先だけ DSA 接続させたい場合は ~/.ssh/config に
Host very_oldhost
User user
HostKeyAlgorithms +ssh-dss
HostName xxx.org
と設定しておくと、オプションを省略することができました。
しかし、DSA のコードがビルドすらされなくなった 15.0-RELEASE からは、オプションしていでも config 指定でも
home/user/.ssh/config line 50: Bad key types '+ssh-dss'.
などと怒られてしまいます。
サーバーをいじれるならば RSA ホストキーを追加
サーバーの設定がいじれるならば、RSA 鍵は使えるので、 RSA ホスト鍵など他の種類の鍵を生成すれば接続できるようになります。
HostKey /etc/ssh/ssh_host_rsa_key
古い sshd でも RSA なら対応してるので、むりやり切られた暗号化を何とかするよりは健全といえるでしょう。
しかしサーバーが自分でいじれるとは限らないわけで、諸事情で設定変更が叶わないということもあります。
古い FreeBSD の OpenSSH sshd のデフォルトは、DSA 鍵しか生成しない設定になっていて、そこから動かせないという状況もあったりします。組み込みマシンで接続はデバッグ用途のみとかそんな状況です。
そんな状況で困っている人はあまり多くはないとは思うのですが、まぁ一応私なりの解決法を。
ports の OpenSSH-portable を 10.0p1 の時代に戻す
OpenSSH は pkg/ports にも openssh-portable という名前で入っています。しかし現在の ports は base よりも新しいバージョン(2025/12 時点では10.2p1、base は 10.0p2)となっていて、ソースコードから完全に DSA が消えています。
ソースに DSA のコードが残っているのは 10.0p1 までです。そこで、まずは openssh-portable の ports を 10.0p1 まで戻します。
cgit.freebsd.org で git バージョン管理されている公式 ports ツリーでは、hash 値 8f4607278deeb9e12b2f444a478a488ac733af65 が 10.0p1 の最後のバージョンなので、
% git clone https://git.FreeBSD.org/ports.git
% cd ports
% git checkout 8f4607278deeb9e12b2f444a478a488ac733af65
で、 10.0p1 の頃の ports tree を取得します。
そのまま make しても、DSA はビルドされませんし、make config の設定にもありません。
OpenSSH のソースの中では WITH_DSA が定義されているかで DSA 関連のソースをビルドするか決まっているので、WITH_DSA を define 指定してビルドしないと DSA は有効となりません。
そこで環境変数 CFLAGS に -DWITH_DSA を指定して、cc が WITH_DSA を定義しながらコンパイルされるようにします。
% cd security/openssh-portable
% sudo env CFLAGS=-DWITH_DSA make install
これで /usr/local/bin/ssh に DSA が使える ssh がインストールされます。
ちなみに、make 前にmake config で BLACKLISTD にうっかりチェックを入れてしまうとビルドできません。このバージョンの ports は BLACKLISTD 用パッチがおかしいため、パッチに失敗してビルドできなくなってしまいます。今回のような場合には不要なオプションなので、外しておきましょう。
隔離環境に入れたほうが良いかも
このような独自ビルドの pkg/ports は勝手に更新されては困るので、 pkg lock openssh-portable などとするのですが、依存している pkgの更新が道連れで更新されなくなってしまいます。
そもそも弱い暗号化を有効にしているようなコマンドをメイン環境に入れてしまうのは気持ち悪いので、jail や VM などの隔離環境に入れるのが良いかもしれません。
