TL;DR: 30秒でわかる解決策
このエラーは、プログラムがシステムの検索パス内に存在しない特定のライブラリバージョンを探しているために発生します。Ubuntu 22.04 でよく発生する libssl.so.1.1 の問題に対する最も速い解決策は以下の通りです:
# 1. 不足しているリンクを特定する
ldd /path/to/your/binary | grep "not found"
# 2. Ubuntu 22.04 に libssl1.1 を手動でインストールする(デフォルトでは含まれていません)
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb
# 3. ライブラリキャッシュを更新する
sudo ldconfig
発生原因
Linux は ld.so と呼ばれるダイナミックリンカーを使用して、プログラムの実行に必要な共有オブジェクト(.so ファイル)を特定します。/lib や /usr/lib などの標準パスに必要なファイルが見つからない場合、アプリケーションは即座に終了します。
libssl.so.1.1 エラーは、バージョンギャップの典型的な例です。Ubuntu 22.04 や Fedora 36 などの最新ディストリビューションは OpenSSL 3.0 にアップグレードされました。デフォルトのリポジトリから 1.1 バージョンが削除されたため、1.1 への依存関係がハードコードされている古いバイナリは起動に失敗します。
ステップバイステップのトラブルシューティング
1. 不足している依存関係をマッピングする
どのファイルが不足しているか推測する必要はありません。ldd ツールを使用すると、プログラムが期待するすべての依存関係をリストアップし、どこでチェーンが切れているかを正確に示してくれます。
ldd $(which your_command_name)
出力から not found というラベルを探してください。これにより、追跡する必要がある具体的な .so ファイル名が確認できます。
2. 提供パッケージを見つける
ファイル名はわかっているがパッケージ名がわからない場合は、Debian 系システムでは apt-file を使用します。これはリポジトリの検索エンジンのように機能します。
sudo apt update
sudo apt install apt-file
sudo apt-file update
apt-file search libssl.so.1.1
RHEL、CentOS、または Fedora では、dnf ツールが標準でこれを処理します:
dnf provides libssl.so.1.1
3. レガシーライブラリの取り扱い
使用している OS のバージョンでは、必要なライブラリが公式に「廃止」されていることがあります。例えば Ubuntu 22.04 では libssl1.1 が完全に削除されました。このような場合、セキュリティアーカイブから古いパッケージを手動で取得する必要があります。
セキュリティ上のヒント: ダウンロードしたファイルは必ず検証してください。私は ToolCraft のハッシュジェネレーター を使用して、.deb ファイルの SHA-256 ハッシュを公式のマニフェストと比較しています。64文字の文字列をチェックすることで、ダウンロード中にライブラリが改ざんされたり破損したりしていないことを確認できます。
4. 新しいライブラリパスを登録する
ライブラリが /usr/local/lib に存在していても、システムがそれを無視している場合があります。リンカーがどこを探すべきかを知るために、そのディレクトリを「登録」する必要があります。
# カスタム設定ファイルを作成する
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/custom-libs.conf
# リンカーキャッシュを再読み込みする
sudo ldconfig
5. 環境変数による回避策を使用する
root 権限がない場合や、一時的な修正のみが必要な場合は、LD_LIBRARY_PATH を使用します。これにより、システムは他の場所を探す前に特定のフォルダーをチェックするよう強制されます。
export LD_LIBRARY_PATH=/home/user/my_libs:$LD_LIBRARY_PATH
./your_binary
検証
最後にもう一度バイナリに対して ldd を実行します。以前 not found と表示されていた行に、有効なシステムパスとメモリアドレスが表示されるはずです:
$ ldd /usr/bin/openssl
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f8a...)
パスが解決されていれば、アプリケーションは正常に起動します。
予防策とベストプラクティス
- 静的リンク: ソフトウェアを開発する場合は、重要な依存関係に対して静的リンクを検討してください。これによりライブラリがバイナリに同梱され、異なる OS バージョン間でのポータビリティが向上します。
- コンテナ化: Docker を使用してレガシーアプリを隔離します。Ubuntu 20.04 ベースのイメージには
libssl1.1が標準で含まれているため、最新のホスト OS との競合を防ぐことができます。 - 「偽の」シンボリックリンクを避ける: 新しいバージョン(
libssl.so.3など)を古い名前(libssl.so.1.1)にリンクしないでください。これは通常、セグメンテーション違反(Segmentation fault)を引き起こします。内部 API が変更されているため、プログラムが関数を呼び出した瞬間にクラッシュします。

