Ubuntu22.04からOpenSSLが3.0になった。
OpenSSL3.0には後方互換があるようだが、いくつかのライブラリではうまく動かない場合がある。
例えば、Rubyのnet-sshである。
この記事のタイトルにあるとおり、ERROR: OpenSSL::PKey::PKeyError: rsa#set_key= is incompatible with OpenSSL 3.0
というエラーが出てしまう。
幸いながらnet-sshの7.0.0以降で対応しているので、bundle update net-sshすればたいていの場合解決するだろう。
しかし、net-sshのアップデートが容易に行えない場面もあると思う、というかあった。
そこで私が解決した手法についてまとめておく。
前提条件
- Ubuntu 22.04をWSL2上で動かしている
- 生のUbuntu22.04でも同じ方法で回避できると思う
- asdfを使ってRubyをインストールしている
- 再ビルドが必要なのでUbuntu公式パッケージだとめんどくさいかも
- asdfじゃなくてもruby-buildを内部的に使っているパッケージ管理ソフトなら同じことができると思う
手順
大したことはしていないので箇条書き。
- openssl-1.1.1なパッケージをインストールする
- http://ja.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.16_amd64.deb
- http://ja.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl-dev_1.1.1f-1ubuntu2.16_amd64.deb
- 記事を書いている時点での最新バージョンだが、タイミングによってはバージョンが違うかもしれない
- Rubyを再ビルドする
asdf uninstall ruby $RUBY_VERSION && asdf install ruby $RUBY_VERSION
- libssl-devを再インストール
sudo apt remove libssl-dev && sudo apt install -y libssl-dev
- libssl1.1パッケージはlibssl3とは別パッケージなのでバッティングしないが、libssl-devはバッティングしているのでUbuntu標準のパッケージに戻しておいたほうが無難
まとめ
openssl-1.1なパッケージを一時的にインストールすることで件のエラーは回避することができた。 しかし、Rubyのバージョンアップを行うたびにこの手順を踏むのは多少めんどくさい。 素直にnet-sshをアップデートするか、Dockerイメージを作るのが結局手間が少ないのかもしれない。