OpenSSL 0.9.8yをAndroid NDKでクロスコンパイルする

OpenSSL: Source, Tarballs」から openssl-0.9.8y.tar.gz をダウンロードします。

$ tar xvzf openssl-0.9.8y.tar.gz
$ cd openssl-0.9.8y
$ CROSS_COMPILE=arm-linux-androideabi- ./Configure --prefix=$ANDROID_APP_ROOT/openssl-0.9.8y threads zlib shared no-asm linux-generic32
$ make -j8
$ make install

installed files

bin/c_rehash
bin/openssl
include/openssl/*.h
lib/engines/lib4758cca.so
lib/engines/libaep.so
lib/engines/libatalla.so
lib/engines/libcapi.so
lib/engines/libchil.so
lib/engines/libcswift.so
lib/engines/libgmp.so
lib/engines/libnuron.so
lib/engines/libsureware.so
lib/engines/libubsec.so
lib/libcrypto.a
lib/libcrypto.so
lib/libcrypto.so.0.9.8
lib/libssl.a
lib/libssl.so
lib/libssl.so.0.9.8
lib/pkgconfig/libcrypto.pc
lib/pkgconfig/libssl.pc
lib/pkgconfig/openssl.pc
ssl/man/man?/*.?
ssl/misc/c_hash
ssl/misc/c_info
ssl/misc/c_issuer
ssl/misc/c_name
ssl/misc/CA.pl
ssl/misc/CA.sh
ssl/openssl.cnf

OpenSSL 0.9.8系をビルドする理由

最新のOpenSSL 1.0.1系ではなく古いバージョンをビルドする理由は、Android組み込みの証明書ストアを利用するためです。Android 4.0以降、 /system/etc/security/cacerts/ 以下にOpenSSL形式の証明書が0.9.8系の命名規則で置かれているのですが、これは1.0系のOpenSSLではうまく読めません。

ちなみに、Android 4.3組み込みの /system/lib/libssl.so はOpenSSL 1.0系ですので、これも使えません。Android組み込みの証明書ストアを利用したい場合は、古いOpenSSLを自前ビルドする以外に手がないというわけです。

Android 2系の場合、組み込みの証明書ストアはOpenSSL形式では無いようなので、OpenSSLを利用するなら証明書を独自のパスにインストールする必要があります。当然ですが、証明書を自前管理する場合は特にバージョンの縛りはありません。