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

参考URL

  • openssl-1.0.0 + mod_ssl-2.8.31 - kaz_29@はてな
  • Apache+OpenSSL-1.0.0でのコンパイル時の問題 - tkr備忘録Wiki

さてさて

古い環境で動作するサーバで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に書いてあるよー」って教えてくれました。うれしい :)

1
2
3
 *) 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 した際のエラーメッセージをみると、

1
2
3
4
5
6
7
8
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

とあります。

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/ssl_engine_init.c
  • modules/ssl/ssl_util_ssl.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ちゃんと読もう

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