1

p12 パックにあるカスタム証明書を使用して https 接続を確立したいと考えています。私はすでにiPhoneでそれを行っています(したがって、証明書、サーバーなどですべてが正常であることを確認できます)が、Androidにはいくつかの問題があります.

認証にクライアント証明書が必要な URL を要求する方法に従って回答しましたが、結果として次の例外が発生します。

12-13 12:32:44.545: W/System.err(4407): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.545: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374) で 12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) 12-13 12:32:44.545: W/System.err(4407): libcore.net.http で.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) 12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) で12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java: 856) 12-13 12:32:44.555: W/System.err(4407): 原因: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted (TrustManagerImpl.java:192) で 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:163) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet で。 provider.jsse.NativeCrypto.SSL_do_handshake(ネイティブ メソッド) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet で。provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371) 12-13 12:32:44.560: W/System.err(4407): ... 18 より 12-13 12:32:44.560: W/System. err(4407): 原因: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.560: W/System.err(4407): ... 23 詳細

私の接続コードは次のようになります。

KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(context.getResources().openRawResource(R.raw.gecko_cert_1), "gecko_cert_1".toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
        kmf.init(ks, "gecko_cert_1".toCharArray());
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(kmf.getKeyManagers(), null, null);


        //request
        URL serverURL = new URL(myurl); 
        HttpsURLConnection conn = (HttpsURLConnection)serverURL.openConnection();
        conn.setSSLSocketFactory(sc.getSocketFactory());
        //conn.setHostnameVerifier(DO_NOT_VERIFY);
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();

乾杯、マルシン

4

1 に答える 1

-4

今はうまくいきます。

接続方法の上に次のスニペットを追加しました。

       X509TrustManager[] tm = new X509TrustManager[] { new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        } };

そして、次の行を入れ替えます。

sc.init(kmf.getKeyManagers(), null, null);

に:

sc.init(kmf.getKeyManagers(), tm, null);

この行のコメントも外しました。

conn.setHostnameVerifier(DO_NOT_VERIFY);

乾杯、マルシン

于 2012-12-13T14:32:50.037 に答える