最近の定番パターンですが、若手があれこれ苦労していたので、一緒になってハマってみたログです。
タイトル通りですが、DSO(Dynamic Shared Object)サポートが有効になっているApacheに、後からmod_sslを追加しようとしたのですが、どうも apxs の実行で失敗して悩んでいるとの事。
ちなみに、環境はCentOS 6.2に、Apache 2.2.23。
どれどれ、と見てみると、、、
error: #error "Unrecognized SSL Toolkit!"
# cd (Apacheのソースディレクトリ)/modules/ssl/ # /usr/local/apache2/bin/apxs -c -i -a *.c /usr/local/apache2/build/libtool --silent --mode=compile gcc -prefer-pic -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pth read -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apache2/include -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo In file included from ssl_private.h:60, from mod_ssl.c:27: ssl_toolkit_compat.h:261:2: error: #error "Unrecognized SSL Toolkit!" In file included from ssl_private.h:67, from mod_ssl.c:27: ssl_util_ssl.h:78: error: expected ‘)’ before ‘*’ token ssl_util_ssl.h:79: error: expected ‘)’ before ‘*’ token ssl_util_ssl.h:80: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token ・・・・・省略・・・・・ ssl_private.h:601: error: declaration for parameter ‘ssl_init_ModuleKill’ but no such parameter ssl_private.h:600: error: declaration for parameter ‘ssl_init_Child’ but no such parameter mod_ssl.c:567: error: expected ‘{’ at end of input apxs:Error: Command failed with rc=65536 .
こんな感じでエラーが出ておりました。というわけで、さっぱりわからないので、
ssl_toolkit_compat.h:261:2: error: #error "Unrecognized SSL Toolkit!"
ここ(ssl_toolkit_compat.h:261)を見てみることにします。
259 #else /** ! HAVE_OPENSSL && ! HAVE_SSLC */ 260 261 #error "Unrecognized SSL Toolkit!" 262 263 #endif /* ! HAVE_OPENSSL && ! HAVE_SSLC */
ほうほう。↑とのことなので、ssl_toolkit_compat.hの中を"HAVE_OPENSSL"でひっかけてみると、
30 #ifdef HAVE_OPENSSL 31 32 /** OpenSSL headers */ 33 #include <openssl/ssl.h> 34 #include <openssl/err.h> 35 #include <openssl/x509.h> 36 #include <openssl/pem.h> 37 #include <openssl/crypto.h> 38 #include <openssl/evp.h> 39 #include <openssl/rand.h> 40 #include <openssl/x509v3.h>
こんな感じで書かれていて、"HAVE_OPENSSL"というマクロが定義されていないとheaderファイルがincludeされないということか。
というわけで、"-D"でマクロを定義してapxsを再実行してみます。
# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c /usr/local/apache2/build/libtool --silent --mode=compile gcc -prefer-pic -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache2/include -I/usr/local/apache2/include -I/usr/local/apache2/include -DHAVE_OPENSSL=1 -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo In file included from ssl_private.h:60, from mod_ssl.c:27: ssl_toolkit_compat.h:33:25: error: openssl/ssl.h: No such file or directory ssl_toolkit_compat.h:34:25: error: openssl/err.h: No such file or directory ssl_toolkit_compat.h:35:26: error: openssl/x509.h: No such file or directory ・・・・・省略・・・・・
あ、ヘッダファイルが見つからない、、、これは初歩的なミス・・・。
# yum install -y openssl-devel
を実行しなおした後だと、
# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c ・・・省略・・・ Libraries have been installed in: /usr/local/apache2/modules ・・・省略・・・
お、うまくいったらしい。では、動作確認。
# /usr/local/apache2/bin/apachectl configtest httpd: Syntax error on line 54 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_INFO_free
と、"undefined symbol: X509_INFO_free"とエラーが出ます。
undefined symbol: X509_INFO_free
ちょっと参照しているライブラリまわりを調べてみると、
# ldd /usr/local/apache2/modules/mod_ssl.so linux-vdso.so.1 => (0x00007fff299ff000) libc.so.6 => /lib64/libc.so.6 (0x00007f076144c000) /lib64/ld-linux-x86-64.so.2 (0x0000003fdf600000)
これは明らかに少ない・・・。
# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto
ということで、↑な感じでオプションを足してコンパイルしなおしてみます。で、動作確認。
# /usr/local/apache2/bin/apachectl configtest httpd: Syntax error on line 54 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_ssl.so into server: /usr/local/apache2/modules/mod_ssl.so: undefined symbol: SSL_set_ex_data
エラーが変わりました。(undefined symbol: SSL_set_ex_data)
undefined symbol: SSL_set_ex_data
これはSSLまわりがくさいので、
# /usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl
こんな感じでライブラリオプションを足してやり直し。
# /usr/local/apache2/bin/apachectl configtest Syntax OK
お、Syntax OKになりました!
# ldd /usr/local/apache2/modules/mod_ssl.so linux-vdso.so.1 => (0x00007fffe7dd6000) libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f236f085000) libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f236ee2a000) libc.so.6 => /lib64/libc.so.6 (0x00007f236ea88000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f236e884000) libz.so.1 => /lib64/libz.so.1 (0x00007f236e66e000) libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f236e42b000) libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f236e14c000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f236df48000) libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f236dd1b000) /lib64/ld-linux-x86-64.so.2 (0x0000003fdf600000) libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f236db10000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f236d90d000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f236d6f2000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f236d4d6000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f236d2b7000)
さっきよりも随分増えています。
ちなみに、Apacheのconfigureを見てみると...
Apacheのソースディレクトリで、
# ./configure --enable-ssl=shared --enable-so --with-mpm=worker
こんな感じで、SSLを有効にしてconfigureを実行してみると、mod_sslの部分は、
・・・省略・・・ checking whether to enable mod_ssl... checking dependencies checking for SSL/TLS toolkit base... none checking for OpenSSL version... checking openssl/opensslv.h usability... yes checking openssl/opensslv.h presence... yes checking for openssl/opensslv.h... yes checking openssl/ssl.h usability... yes checking openssl/ssl.h presence... yes checking for openssl/ssl.h... yes OK adding "-L/usr/lib6464" to LDFLAGS forcing SSL_LIBS to "-lssl -lcrypto -ldl -lz " adding "-lssl" to LIBS adding "-lcrypto" to LIBS adding "-ldl" to LIBS adding "-lz" to LIBS checking openssl/engine.h usability... yes checking openssl/engine.h presence... yes checking for openssl/engine.h... yes checking for SSLeay_version... yes checking for SSL_CTX_new... yes checking for ENGINE_init... yes checking for ENGINE_load_builtin_engines... yes checking for SSL_set_cert_store... no forcing MOD_SSL_LDADD to "$(SSL_LIBS)" checking whether Distcache is required... no (default) adding "-export-symbols-regex" to MOD_SSL_LDADD adding "ssl_module" to MOD_SSL_LDADD checking whether to enable mod_ssl... shared adding "-I$(top_srcdir)/modules/ssl" to INCLUDES ・・・省略・・・
こういった出力が出ているので、正確な追加オプションとしては
"-lssl -lcrypto -ldl -lz -export-symbols-regex ssl_module"
が正しいかも。(ちゃんと深くまで見てないけど・・・汗)
なので、apxsの実行オプションをまとめると、
/usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lssl -lcrypto -ldl -lz -export-symbols-regex ssl_module
こんな感じです。
というわけで、今日もメモ程度ですが、こんな感じでこのエントリを残しておきます。
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́
- 作者: Michael Kerrisk,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/12/01
- メディア: 大型本
- クリック: 14回
- この商品を含むブログ (7件) を見る