Apache + mod_sslビルドが私のOpenSSLビルドにリンクされていません。

Apache + mod_sslビルドが私のOpenSSLビルドにリンクされていません。

私はオンラインで検索するのに時間を費やしましたが、私が見つけたものの何も役に立たないようです。

CentOS 6 64ビットを実行していて、mod_sslを使用してApacheをコンパイルし、それを私のOpenSSLバージョン(OSが提供するものよりも新しいバージョン)に接続しようとしています。

OpenSSL 1.1.0iは次のように構成されています。

./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared

Apache 2.4は次のように構成されています。

./configure --enable-layout=mycustomlayout \
    --prefix=/opt/httpd-2.4.34 \
    --exec-prefix=/opt/httpd-2.4.34 \
    --with-mpm=prefork \
    --enable-so \
    --enable-ssl \
    --with-ssl=/opt/openssl-1.1.0 \
    --enable-cgi \
    --enable-http2 \
    --enable-proxy-http2 \
    --with-included-apr

うまくコンパイルされているようですが、mod_sslはOpenSSL 1.1.0がインストールされている場所を知りません。

[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

したがって、これはどこを見るかを明示的に知らせる場合にのみ機能します。

[root@host .libs]# export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007f069149a000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007f069100a000)

httpdバイナリにmod_sslを静的に構築することさえ--enable-mods-static=ssl役に立ちません。

--enable-ssl、、、--enable-ssl --enable-ssl-staticlib-deps試してみましたが、--enable-ssl --enable-ssl-staticlib-deps --enable-mods-static=sslまだ同じ結果が出ました。

    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

また、運のない次の変数を設定してみました./configure

export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib"

/etc/ld.so.conf.d新しいOpenSSLライブラリを自動ロードする機能を追加したり、Apacheのinitスクリプトを調整してそれを追加できることはわかっていますが、PHPビルドのように機能し、プログラムにLD_LIBRARY_PATH/libssl.soを見つけることをお勧めします。libcrypto.so

[root@host php]# export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib" \
       PHP_PREFIX=/opt/php-7.2.9 \
       EXTENSION_DIR=$PHP_PREFIX/usr/lib64/php/modules
[root@host php]# ./configure […] \
    --with-imap=shared \
    --with-imap-ssl \
    --with-openssl=shared \
    --with-openssl-dir=/opt/openssl-1.1.0/bin

[root@host php]# make
[root@host php]# unset PKG_CONFIG_PATH LD_LIBRARY_PATH LDFLAGS

[root@host modules]# ldd ./openssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007fc2220a6000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007fc221c17000)

私は何が間違っていましたか?これはバグでしょうか?

答え1

LDFLAGS環境変数に以下を追加してみてください。

-Bstatic -lssl -lcrypto

.soまた、openssl libdirにファイルがなく、静的.aファイルのみがあることを確認してください。理想的には、no-sharedopenssl設定にパラメータを渡すことによって行われます。

./configure明示的に静的バージョンを要求しても、リンカーが共有バージョンを好む理由はまだわかりません。ただし、これはhttpdのスクリプトがライブラリの依存関係を処理する方法に関連している可能性があります。

設定スクリプトのパッチはよりきれいになるかもしれません.soが、ファイルがないだけでリンカが静的バージョンを選択するのに十分なようです。

関連情報