Saturday, February 6, 2010

Nexus One (Android端末) に CA証明書をインストールする

オレオレ証明書でSSLサイトを運用してるような人向けの話題です。

どうやらNexus OneというかAndroidは任意のCA証明書をインストール出来ない様です。
実際に cert ファイルをダウロードなりすると、証明書インストールツールが起動しますが、これはサイト証明書をインストールして次回以降この証明書を信頼するというようなもの。


CAの証明書をインストールしてもそのCAから発行した証明書は信頼してくれません。


ではどうするのか。cacerts.bksに手で追加するしかありません。

root化必須で、Java実行環境とAndroid SDKが必要です。
まず http://bouncycastle.org/download/bcprov-jdk16-141.jar をダウンロード。

$JAVA_HOME/jre/lib/ext にコピーします。
Macだと /Library/Java/Home/lib/ext/ あたり?
Debian だと/usr/lib/jvm/java-1.5.0-sun/jre/lib/ext/ とか /usr/lib/jvm/java-6-sun/jre/lib/ext/ あたり

android端末からCA証明書ストレージファイルを取り出します。
$ adb pull /system/etc/security/cacerts.bks cacerts.bks

ストレージファイルに CA cert ファイル(cacert.pem)を追加します
$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias OREORE_CA -file cacert.pem
keytoolはJREに含まれてるはずです。
OREORE_CA は適当な名前をつけたらいいです。

ストレージファイルを戻します。
$ adb remount
$ adb push cacerts.bks /system/etc/security/
これで、このCAから発行した証明書を信頼するようになり、エラーがでなくなります。

ここからは蛇足。
Androidのブラウザか、SSLのframeworkかはわかりませんが、サイト証明書のsubjectAltNameを見ない仕様(RFC的には見るべきなはずですが)のようで、
具体的にはサイト名が証明書と一致しない旨のエラーがでます。


そういうサイト運用の場合はCNを複数定義しておかねばならないようです。
証明書を発行する際の openssl.cnf [ req_distinguished_name ] で、
0.commonName                    = Common Name (eg, YOUR name)
0.commonName_max = 64
1.commonName = Common Name (eg, YOUR name)
1.commonName_max = 64
のようにしておけば、二つのCNを定義することができます。

No comments: