Edited at

LinuxにApacheとOpenSSLをソースからビルドしてインストールする

More than 3 years have passed since last update.

こちらの記事がとても良記事だったので、ビルドの勉強のために自分でやってみました。

Apache HTTP Serverのビルドを始めよう

自分でソールからビルドしてみると、共有ライブラリ(=ダイナミックリンクライブラリ,シェアードライブラリ)や.soファイルの仕組みがよくわかるようになります。


環境

CentOS 6.5

httpd 2.2.29

openssl 1.0.1j

他のディストリビューションでもやり方はほとんど同じだと思います。


ターゲット構成

/opt/openssl/ にopensslをインストール

/opt/httpd/ にApacheをインストール


準備

ビルドに必要なパッケージを入れます。

# コンパイルするのに必要

$ sudo yum instal -y gcc make
# opensslをビルドするのに必要
$ sudo yum install perl zlib-devel


opensslをソースからビルドしてインストール

$ wget https://www.openssl.org/source/openssl-1.0.1j.tar.gz

$ tar xvfz openssl-1.0.1j.tar.gz
$ cd openssl-1.0.1j
$ ./config --prefix=/opt/openssl shared zlib
$ make
$ sudo make install

確認

$ /opt/openssl/bin/openssl version

OpenSSL 1.0.1j 15 Oct 2014
$ ldd /opt/openssl/bin/openssl
linux-vdso.so.1 => (0x00007fff236db000)
libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0x00007f5237454000)
libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0x00007f5237076000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5236e6e000)
libz.so.1 => /lib64/libz.so.1 (0x00007f5236c58000)
libc.so.6 => /lib64/libc.so.6 (0x00007f52368c3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f52376bf000)

libssl.soとlibcrypto.soが、自分で入れた/opt/opensslにリンクされていることを確認します。


Apacheをソースからビルドしてインストール

$ wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.29.tar.gz

$ tar xvfz httpd-2.2.29.tar.gz
$ cd httpd-2.2.29
$ ./configure --prefix=/opt/httpd --enable-mods-shared=all --enable-ssl --with-ssl=/opt/openssl
$ make
$ sudo make install

./configure --with-ssl=/opt/opensslと、自前でいれたopensslにリンクするように指示するのがポイントです。


mod_ssl.soの動的リンクを確認

mod_ssl.soがちゃんとopensslライブラリにリンクしているか確認します。

$ ldd /opt/httpd/modules/mod_ssl.so

linux-vdso.so.1 => (0x00007fff04d4e000)
libssl.so.1.0.0 => not found
libcrypto.so.1.0.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffc9b03b000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffc9aca7000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffc9b48c000)

はい、リンクされていません。

このままではmod_sslが動きません。


opensslのライブラリパスを通す

$ export LD_LIBRARY_PATH=/opt/openssl/lib

または

$ sudo sh -c 'echo /opt/openssl/lib > /etc/ld.so.conf.d/openssl.conf'

$ sudo ldconfig

確認

$ ldd /opt/httpd/modules/mod_ssl.so

linux-vdso.so.1 => (0x00007fff94dff000)
libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0x00007f830f748000)
libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0x00007f830f36a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f830f14d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f830edb9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f830ebb5000)
libz.so.1 => /lib64/libz.so.1 (0x00007f830e99e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f830fbe5000)

できました!

これでApacheを起動すれば、自前ビルドしたopensslを使ってSSL通信ができるようになります。