
1.1.1系のOpenSSLはサポートが切れているので、外部に解放するApacheは最新のOpenSSLとリンクさせたいって時はありませんか?
通常、ソースコードをダウンロードして、コンパイルしてインストールしてApacheのソースコードをダウンロード~の流れになると思うのですが、ちょっと待って下さい。
何も考えずにコンパイル・インストールすると・・・
何も考えずにOpenSSLをコンパイルしてインストールするとopensslコマンド実行時に以下のように怒られます。
./openssl version ./openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
ちなみに、このOpenSSLをコンパイルした時の構成コマンドで設定した値は以下のようになります。
./Configure --prefix=/usr/local/lib/openssl shared zlib
ただ、インストール先を指定して、インストールしているだけなのですが、自分自身で持っているシェアードライブラリを認識してくれない現象が発生します。
一応確認のためにシェアードライブラリの一覧を見てみます。
ls -l /usr/local/lib/openssl/lib64 drwxr-xr-x 3 root root 4096 Dec 11 21:01 cmake drwxr-xr-x 2 root root 4096 Dec 29 12:46 engines-3 -rw-r--r-- 1 root root 10776734 Dec 29 12:46 libcrypto.a lrwxrwxrwx 1 root root 14 Dec 29 12:46 libcrypto.so -> libcrypto.so.3 -rwxr-xr-x 1 root root 6287784 Dec 29 12:46 libcrypto.so.3 -rw-r--r-- 1 root root 2019198 Dec 29 12:46 libssl.a lrwxrwxrwx 1 root root 11 Dec 29 12:46 libssl.so -> libssl.so.3 -rwxr-xr-x 1 root root 1227144 Dec 29 12:46 libssl.so.3 drwxr-xr-x 2 root root 4096 Dec 29 12:46 ossl-modules drwxr-xr-x 2 root root 4096 Dec 11 21:01 pkgconfig
ファイル自体はあるので、opensslがシェアードライブラリの配置場所を見失っているように見えます。
リンカにシェアードライブラリの検索パスを渡す
そこで、新たに構成コマンドを再度実行するのですが、新たにオプションを付与します。以下のようになります。
LDFLAGS="-Wl,-rpath=/usr/local/lib/openssl/lib64" \ ./Configure --prefix=/usr/local/lib/openssl shared zlib
リンカオプションとしてLDFLAGS変数に-Wl,-rpathを設定しています。
これは、実行時シェアードライブラリを探しに行くパスを実行バイナリに埋め込むパラメータになります。
このような指定をすることでopensslコマンドにシェアードライブラリを探しに行くパスを明示的に示すことができるようになります。
上記構成コマンドで設定し、コンパイル・インストールするとシェアードライブラリと正しくリンクできるようになり、コマンドも以下のように正しく実行できるようになります
./openssl version OpenSSL 3.3.2 3 Sep 2024 (Library: OpenSSL 3.3.2 3 Sep 2024)
実行バイナリの中身を確認する
では、LDFLAGSに設定した-Wl,-rpathの設定値はどのように埋め込まれているか確認してみましょう。
確認はreadelfコマンドで行えます。実際は以下のようになります。
readelf -d ./openssl Dynamic section at offset 0xd3d60 contains 30 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libssl.so.3] 0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.3] 0x0000000000000001 (NEEDED) Shared library: [libz.so.1] 0x0000000000000001 (NEEDED) Shared library: [libdl.so.2] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000f (RPATH) Library rpath: [/usr/local/lib/openssl/lib64] 0x000000000000000c (INIT) 0x41ca70 0x000000000000000d (FINI) 0x494df8 0x0000000000000019 (INIT_ARRAY) 0x6d3690 0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) 0x000000000000001a (FINI_ARRAY) 0x6d3698 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) 0x000000006ffffef5 (GNU_HASH) 0x400298 0x0000000000000005 (STRTAB) 0x409e68 0x0000000000000006 (SYMTAB) 0x400400 0x000000000000000a (STRSZ) 33629 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x6d4000 0x0000000000000002 (PLTRELSZ) 39312 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x4130e0 0x0000000000000007 (RELA) 0x412fa8 0x0000000000000008 (RELASZ) 312 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x412ea8 0x000000006fffffff (VERNEEDNUM) 4 0x000000006ffffff0 (VERSYM) 0x4121c6 0x0000000000000000 (NULL) 0x0
まとめ
上記のようにLibrary rpathとして、OpenSSLのディレクトリを参照するように設定されていることがわかると思います。
シェアードライブラリとしては正しくコンパイル・インストールできているのでApacheからリンクするだけなら、そのままで構わないと思いますが何か気持ち悪いと言うかモヤモヤしている方の参考になれば、幸いです。