openssl-1.0.0 を httpd-2.2.12(apache)以前バージョン で利用する場合のmake時コンパイルエラー対処法

2012/07/01

読み返してみるになんでこんなことしてんだろうな:)

参考URL

さてさて

古い環境で動作するサーバでOpenSSLをアップデートしたい場合、関連パッケージの再コンパイル作業が必要となってくるかと思います。

  • OpenSSLをアップデートしたい
  • そしてやや古めのapacheをApache killer対策をした上で利用し続けたい
  • もちろんmod_sslは新しいOpenSSL由来のものを利用したい

という場合です。

結論から先に書きますと、上述した参考URLリンク先にあるとおり、 OpenSSL側の構造体名が1.0.0から変更されたことが原因でした。

  • Apacheソースアーカイブにある中で確認したところ、
    • http-2.2.12を含めてそれ以前のバージョンでOpenSSL1.0.0系を利用する場合には、modules/ssl 以下のソース修正が必要となる
    • http-2.2.13を含めてそれ以降のバージョンでOpenSSL1.0.0系を利用する場合には、modules/ssl 以下のソース修正は不要でいわゆる巷にある手順で対応可能(なぜならapache側で対応が完了しているから:後述のCHANGESの件)

ということのようです。 @_so4 さん が「CHANGESに書いてあるよー」って教えてくれました。うれしい :)

 *) mod_ssl, ab: improve compatibility with OpenSSL 1.0.0 betas. Report
 warnings compiling mod_ssl against OpenSSL to the httpd developers.
 [Guenter Knauf]

httpd-2.2.13/CHANGES より抜粋 ですね。

さてopenssl-1.0.0非対応なhttpd-2.2.12それ以前のバージョンを素で make した際のエラーメッセージをみると、

ssl_engine_init.c: In function ssl_init_ctx_verify:
ssl_engine_init.c:576: error: STACK undeclared (first use in this function)
ssl_engine_init.c:576: error: (Each undeclared identifier is reported only once
ssl_engine_init.c:576: error: for each function it appears in.)
ssl_engine_init.c:576: error: expected expression before ) token
ssl_engine_init.c: In function ssl_init_FindCAList:
ssl_engine_init.c:1175: warning: pointer type mismatch in conditional expression
make[3]: *** [ssl_engine_init.lo] Error 1

とあります。

ssl_engine_init.c:576: error: STACK undeclared (first use in this function)

が問題のわかりやすい箇所です。最初からエラーメッセージ追っていれば、もっと簡単に発見できたのでしょうね。 このあたりが経験の無さか、と感じた次第です。

なのでOpenSSL1.0.0対応していないApache(2.2系で言えば2.2.12それ以前のバージョン)にOpenSSL1.0.0を対応させる場合には、作業ベースで行くと、

  • modules/ssl/sslengineinit.c
  • modules/ssl/sslutilssl.c

のソースなどをちょろっといじる必要があるということになります。

手順通りに追っていくと

0. コンパイル環境の整備

各自調整

1. OpenSSLのインストール

いい感じですね

2-1. Apacheのインストール(2.2.10 コンパイル失敗)

(´・ω・`)ブゥ……

2-2. Apacheのインストール(2.2.10 ソース修正)

(`・ω・´)ハッピー!!

なんかうまくいかない場合

2.2.4と2.2.10などバージョンが違えば修正箇所も変わるかと思います。つまり上記手順は2.2.10以外では変わる可能性があります。 それでも「STACK を一個ずつ _STACK にして、./configure && make → エラーメッセージでたら該当ファイルの該当行を確認し潰す」というスタンスで対応可能かと思います。

教訓

  • エラーメッセージちゃんと読もう
  • READMEやCHANGELOGちゃんと読もう

いい勉強になりました :)