私の質問:
複数の証明書チェーンを持つ Android 2.1/2.2 でクライアント証明書を使用して SSL 接続を正常に認証した人はいますか?
詳細:
Android プラットフォーム用のクライアント証明書認証を実装しようとしています。KeyStore を使用してそれを行う方法については、StackOverflow ですでに多くの議論があり、私はそれらを SSLContext に提供することで標準的なアプローチに従っています。
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers() ,null);
私のクライアント証明書には、証明書チェーンを形成する 3 つの証明書が添付されています。Android 2.3 以降では、SSL ハンドシェイクが正常に実行され、リクエストに進むことができました。
ただし、Android 2.2 では、同じ方法で「不正な証明書エラー」がスローされます。
エラー:14094412:SSL ルーチン:SSL3_READ_BYTES:sslv3 アラートの不正な証明書 (external/openssl/ssl/s3_pkt.c:1139 0x26bd38:0x00000003) org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(ネイティブメソッド)で org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:316) で org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.(OpenSSLSocketImpl.java:564) で org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getOutputStream(OpenSSLSocketImpl.java:479) で
これは、CAfile 引数に不完全な証明書チェーンを指定して OpenSSL コマンドを発行した場合と同じエラーです。
openssl s_client -showcerts -cert [certificateFile] -key [keyFile] -connect [ip:port] -CAfile [cert-chain]
これにより、Android 2.1/2.2 は完全なチェーンを検査していないと思いました。getCertificateChain()
メソッドを使用して、KeyStore 内のチェーンの数を確認します。
私の質問に関連する Android のバグを探していましたが、見つかりませんでした。同様の質問が回答なしで SO に投稿されています
- ssl-not-working-on-android-2-2-only-in-2-3
- android-2-2-ssl-library-error . 唯一の回答のニコライ・エレンコフによる最後のコメントは、私が持っているのと同じ結論を示しているようですが、それを裏付けるドキュメントが見つかりません