1

次のコードを使用して BKS をロードしようとしてHttpsUrlConnectionいますが、それは機能しましたが、他のサーバーでのデフォルトの CA 証明書の検証が壊れました。

try {
    TrustManagerFactory tmf = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    KeyStore ks = KeyStore.getInstance("BKS");
    InputStream in = ctw.getResources()
            .openRawResource(R.raw.bks);
    ks.load(in, "password".toCharArray());
    in.close();
    tmf.init(ks);
    TrustManager[] tm = tmf.getTrustManagers();

    KeyManagerFactory kmf = KeyManagerFactory
            .getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "password".toCharArray());

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(kmf.getKeyManagers(), tm, null);

    HttpsURLConnection
            .setDefaultHostnameVerifier(new HostnameVerifier() {

                @Override
                public boolean verify(String hostname,
                        SSLSession session) {
                    return true;
                }
            });

    HttpsURLConnection
            .setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    e.printStackTrace();
}

私が得るエラーは次のとおりです。

com.android.volley.NoConnectionError:
javax.net.ssl.SSLHandshakeException:
java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found.

Volleyネットワーク要求にライブラリを使用しています。私のコードは間違っていますか、それともVolleyライブラリを変更する必要がありますか?

ありがとう。

4

1 に答える 1

4

私がしたCompositeTrustManagerことは、自己署名証明書とデフォルト CA の両方の複数のソースをチェックできる を作成することでした。これは、私の CWAC-Security ライブラリTrustManagerBuilderAPIの背後に隠されています。次のようなコードを使用します。

new TrustManagerBuilder(this)
  .selfSigned(R.raw.bks, "password".toCharArray())
  .or()
  .useDefault();

次に、 を呼び出して、自己署名証明書とデフォルト CA の両方を処理build()する を取得します。TrustManager[]

現状では、コードは在庫を BKS ストアに関連付けられた在庫に置き換えています。TrustManager[]

Another approach would be to catch the failure and retry with a connection that lacks your custom TrustManager[].

于 2014-06-26T12:10:37.647 に答える