【Linux】OpenSSLをソースコードからインストールする時の勘所

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

 

 

 

おすすめの記事