0

私の質問:

複数の証明書チェーンを持つ 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 に投稿されています

4

1 に答える 1

1

これは確かに Android 2.1/2.2 のバグのようです。

私がしたことは、ルート CA によって直接発行される別のクライアント証明書を作成するように管理者に依頼したことです。その証明書を取得した後、それをリソースとしてコードに配置すると、KeyStore が新しい証明書を指すようにする以外は何も変更せずに機能します。

于 2012-03-03T05:44:04.560 に答える