openssl-1.0.0 + mod_ssl-2.8.31
ずいぶん昔に制作したサーバーの移転準備をしています。
openssl-1.0.0がでていたので使おうとしたら、apacheのコンパイル時に以下の様なエラーがでました。
gcc -c -I../../os/unix -I../../include -DLINUX=22 -DHAVE_SET_DUMPABLE -I/usr/include/gdbm -DMOD_SSL=208131 -DUSE_HSREGEX -DEAPI -DUSE_EXPAT -I../../lib/expat-lite `../../apaci` -fpic -DSHARED_MODULE -DSSL_COMPAT -DSSL_USE_SDBM -I/usr/local/include -DMOD_SSL_VERSION=\"2.8.31\" ssl_util_ssl.c && mv ssl_util_ssl.o ssl_util_ssl.lo
ssl_util_ssl.c: In function ‘SSL_X509_isSGC’:
ssl_util_ssl.c:327: error: ‘STACK’ undeclared (first use in this function)
ssl_util_ssl.c:327: error: (Each undeclared identifier is reported only once
ssl_util_ssl.c:327: error: for each function it appears in.)
ssl_util_ssl.c:327: error: ‘sk’ undeclared (first use in this function)
ssl_util_ssl.c:336: error: expected expression before ‘)’ token
make[4]: *** [ssl_util_ssl.lo] エラー 1
make[3]: *** [all] エラー 1
make[2]: *** [subdirs] エラー 1
make[2]: ディレクトリ `/usr/local/src/apache_1.3.41/src' から出ます
make[1]: *** [build-std] エラー 2
make[1]: ディレクトリ `/usr/local/src/apache_1.3.41' から出ます
make: *** [build] エラー 2
調べてみたところ、openssl-1.0.0で、STACK構造体が _STACK に変更になった様です。
// openssl-0.9.8n/include/openssl/stack.h 66-74 typedef struct stack_st { int num; char **data; int sorted; int num_alloc; int (*comp)(const char * const *, const char * const *); } STACK; // openssl-1.0.0/include/openssl/stack.h 66-74 typedef struct stack_st { int num; char **data; int sorted; int num_alloc; int (*comp)(const void *, const void *); } _STACK; /* Use STACK_OF(...) instead */
構造的な変更は無い様なので、mod_sslに以下の様なpatchをあてて対応しました。
--- ssl_util_ssl.orig.c 2010-04-17 13:11:24.000000000 +0900 +++ ssl_util_ssl.c 2010-04-17 13:12:05.000000000 +0900 @@ -324,7 +324,7 @@ { X509_EXTENSION *ext; int ext_nid; - STACK *sk; + _STACK *sk; BOOL is_sgc; int idx; int i; @@ -333,7 +333,7 @@ idx = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); if (idx >= 0) { ext = X509_get_ext(cert, idx); - if ((sk = (STACK *)X509V3_EXT_d2i(ext)) != NULL) { + if ((sk = (_STACK *)X509V3_EXT_d2i(ext)) != NULL) { for (i = 0; i < sk_num(sk); i++) { ext_nid = OBJ_obj2nid((ASN1_OBJECT *)sk_value(sk, i)); if (ext_nid == NID_ms_sgc || ext_nid == NID_ns_sgc) {
2010.5.20 追記
http://dsas.blog.klab.org/archives/51719714.html
こんな情報もあるようなので、1.0.0の使用は注意が必要な感じですね。
2010.5.20 追記2
http://slashdot.jp/security/comments.pl?sid=490412&cid=1742785
makeのオプションにOPTIM=-DSTACK=_STACKを指定するとソースは修正せずに対応できるようです。