2011-11-29 15 views
5

自分のコードにjavax.net.ssl.X509TrustManagerを実装していますので、自分のソフトウェアがアクセスする自己署名証明書を検証できます。しかし、私はまだ他のいくつかの "標準"ウェブサイトのSSL証明書を検証する必要があります。私はCertPathValidator.validate()を使用していますが、私はmaps.googleapis.comのために渡されている1つの証明書チェーンに実際に完全なチェーンが含まれていないことに気づきました。チェーン全体が含まれていますが、ルートCA(Equifax)電話には存在しますが、validate()はまだ明らかにチェーン内に明示されていないために失敗します。検証が成功するように、私はここで何が欠けていますか?どのような入力をありがとう。AndroidマニュアルX509証明書チェーンの検証

編集 - (例外は削除チェック付き)関連するコード:自分のTrustManagerの実装

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
// chain is of type X509Certificate[] 
CertPath cp = cf.generateCertPath(Arrays.asList(chain)); 

CertPathValidator cpv = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 

FileInputStream is = new FileInputStream("/system/etc/security/cacerts.bks"); 
ks.load(is, null); 

PKIXParameters params = new PKIXParameters(ks); 
CertPathValidatorResult cpvr = cpv.validate(cp, params); 
+0

もう少し詳しく説明します。エラーが発生したときに 'validate()'の呼び出しから 'CertPathValidatorException'を取得しました** org.bouncycastle.jce.exception.ExtCertPathValidatorException:発行者" OU = Equifax Secure Certificate Authority 、O = Equifax、C = US "** – Conrad

答えて

2

は一般的に悪い考えです。より良い方法は、証明書をキーストアに追加し、それをトラストストアとして追加することです。方法の例は、thisを参照してください。

おそらく、デフォルトのトラストストアをバリデーターに追加する必要があります。また、Androidはデフォルトで無効化(CRL)チェックを行わないため、有効にした場合は関連するCRLを手動で取得する必要があります。あなたのコードを投稿してください。

+0

リンクをありがとう - 私はそれをチェックします。 – Conrad

+0

これは正解と思われますが、私は 'DefaultHttpClient'を呼び出すサードパーティ製のライブラリを使用しています。私はそれらを再コンパイルしたくないので、maps.googleapis.comへの呼び出しを安全でないようにしますこの点。ポインタありがとう。 – Conrad

+0

@Nikolay、 "独自のTrustManagerの実装は一般的には悪い考えです。" 私は同意します。しかし、CRLで証明書を確認する必要があります。 Androidはそうではありません。どうすれば解決できますか? –

関連する問題