どうやら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.pemkeytoolはJREに含まれてるはずです。
OREORE_CA は適当な名前をつけたらいいです。
ストレージファイルを戻します。
$ adb remountこれで、このCAから発行した証明書を信頼するようになり、エラーがでなくなります。
$ adb push cacerts.bks /system/etc/security/
ここからは蛇足。
Androidのブラウザか、SSLのframeworkかはわかりませんが、サイト証明書のsubjectAltNameを見ない仕様(RFC的には見るべきなはずですが)のようで、
具体的にはサイト名が証明書と一致しない旨のエラーがでます。

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