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からリンクするだけなら、そのままで構わないと思いますが何か気持ち悪いと言うかモヤモヤしている方の参考になれば、幸いです。