Android HttpsURLConnection问题

时间:2014-04-25 21:17:38

标签: java android https

我在API 15 + 16上遇到了问题,17我不知道,但我知道它在18和19上有效。

main.java:

...
    // Prozess/Thread für Internetverbindung/Daten abrufen
private class MyThread extends Thread {
    @Override
    public void run() {

        if (stop) {
            if (DEBUG) {
                Log.d(TAG, "Stop ist true");
            }
            // nicht weitermachen, da erst der User unter Optionen
            // die
            // Einstellungen ändern muss
        } else {
            int TIMEOUT_VALUE = 3000;
            for (int z = 0; z < datum.length; z++) {
                Resultat = null;
                Endres = null;
                if (DEBUG) {
                    Log.d(TAG, "Endres " + Endres + " " + Resultat);
                    Log.d(TAG, "z: " + z);
                }

                statusZaehler = statusZaehler + 100 / statusZ;
                if (DEBUG) {
                    Log.d(TAG, o + " thread start statusZaehler "
                            + statusZaehler);
                }
                o++;

                if (DEBUG) {
                    Log.d(TAG, "run1");
                }

                // try {
                if (DEBUG) {
                    Log.d(TAG, "run2");
                }
                // ### Datumseingabe bzw. Variable
                pruefdatum = datum[z];

                if (DEBUG) {
                    Log.d(TAG, "Prüfdatum: " + pruefdatum);
                }

                // ### URL Abfragen & Auslesen
                // URL url = null;

                if (!NetworkInfo(getBaseContext())) {
                    showDialog(DIALOG_ALERT);
                    progressThread.setState(ProgressThread.STATE_DONE);
                    stop1 = true;
                    break;
                } else {

                    // Datenabruf

                    // try {

                    if (DEBUG) {
                        Log.d(TAG, "Daten aus dem Internet abrufen "
                                + pruefdatum);
                    }

                    javax.net.ssl.SSLContext sslContext = null;
                    javax.net.ssl.SSLSocketFactory socketFactory = null;
                    try {

                        sslContext = SSLContext.getInstance("TLS"); // (1)
                        sslContext
                                .init(null,
                                        new TrustManager[] { de.mdisco.ssl.TrustManagerFactory
                                                .get() },
                                        new SecureRandom()); // (2)
                        socketFactory = sslContext.getSocketFactory();
                    } catch (Exception e) {
                        Log.e(TAG,
                                "Error in ssl connection " + e.toString());
                    }

                    HttpsURLConnection
                            .setDefaultSSLSocketFactory(socketFactory); // (3)
                    HttpsURLConnection
                            .setDefaultHostnameVerifier(new de.mdisco.ssl.TestX509HostnameVerifier()); // (4)

                    HttpsURLConnection httpsUrlConnection = null;

                    try {

                        httpsUrlConnection = (HttpsURLConnection) new URL(
                                "https://....."+ pruefdatum + "&asi=")
                                .openConnection();

                        httpsUrlConnection.setConnectTimeout(TIMEOUT_VALUE);
                        httpsUrlConnection.setReadTimeout(TIMEOUT_VALUE);

                        httpsUrlConnection.connect(); // (5)

                    } catch (ConnectTimeoutException e) {
                        Log.e("Timeout Exception: ", e.toString());
                        Log.d(TAG, "fehler: " + e.getMessage()
                                + " More than " + TIMEOUT_VALUE
                                + " elapsed.");
                        myProgressDialog.dismiss();
                        Connfehler();
                        stop1 = true;
                        break;
                    } catch (SocketTimeoutException ste) {
                        Log.e("Timeout Exception: ", ste.toString());
                        Log.d(TAG, "fehler: " + ste.getMessage()
                                + " More than " + TIMEOUT_VALUE
                                + " elapsed.");
                        myProgressDialog.dismiss();
                        Connfehler();
                        stop1 = true;
                        break;
                    } catch (MalformedURLException me) {
                        Log.d(TAG,
                                "fehler in Internetverbindung: "
                                        + me.getMessage());
                        myProgressDialog.dismiss();
                        Connfehler();
                        stop1 = true;
                        break; // finish();

                    } catch (IllegalStateException cause) {
                        Log.e(TAG,
                                "Error in https connection Illegal State "
                                        + cause.toString());

                    } catch (Exception e) {
                        Log.e(TAG,
                                "Error in https connection " + e.toString());
                    }
                    // HTML der Webseite auslesen:

                    String lesezeile = null;
                    try {
                        BufferedReader buffReader = new BufferedReader(
                                new InputStreamReader(httpsUrlConnection
                                        .getInputStream()),
                                8 * 1024);

                        while ((lesezeile = buffReader.readLine()) != null) {
                            if (Resultat == null) {

                                Resultat = lesezeile;

                            } else {

                                Resultat = Resultat + lesezeile;

                            }

                        }

                        if (DEBUG) {
                            Log.d(TAG, "Edatum " + pruefdatum);
                            Log.d(TAG, Resultat + "");
                        }
                        buffReader.close();
                    } catch (Exception e) {
                        Log.e(TAG,
                                "Error buffered Reader result "
                                        + e.toString());
                    }
                    httpsUrlConnection.disconnect();
                    Endres = Resultat;
                    statusZaehler = statusZaehler + 100 / statusZ;
                    if (DEBUG) {
                        Log.d(TAG, o + "thread Übergabe statusZaehler "
                                + statusZaehler);
                    }
                    o++;
                    parse();

                    /*
                     * } catch (MalformedURLException me) { Log.d(TAG,
                     * "fehler in Internetverbindung: " + me.getMessage());
                     * myProgressDialog.dismiss(); Connfehler(); stop1 =
                     * true; break; // finish(); }
                     */

                    if (DEBUG) {
                        Log.d(TAG, "Ende StartInternet");

                        Log.d(TAG, "parse+offline ende");
                    }

                }
                /*
                 * } catch (ConnectTimeoutException e) {
                 * Log.e("Timeout Exception: ", e.toString()); Log.d(TAG,
                 * "fehler: " + e.getMessage() + " More than " +
                 * TIMEOUT_VALUE + " elapsed."); myProgressDialog.dismiss();
                 * Connfehler(); stop1 = true; break; } catch
                 * (SocketTimeoutException ste) {
                 * Log.e("Timeout Exception: ", ste.toString()); Log.d(TAG,
                 * "fehler: " + ste.getMessage() + " More than " +
                 * TIMEOUT_VALUE + " elapsed."); myProgressDialog.dismiss();
                 * Connfehler(); stop1 = true; break; } catch (Exception e)
                 * { Log.e(TAG, "Error in http connection " + e.toString());
                 * 
                 * }
                 */
            }

        }
...

错误日志:

  

04-25 23:05:17.562:E / Main(21301):https连接java.lang.NullPointerException错误       04-25 23:05:17.562:W / System.err(21301):java.lang.NullPointerException       04-25 23:05:17.572:W / System.err(21301):at de.mdisco.ssl.TrustManagerFactory $ MeinX509TrustManager.checkServerTrusted(TrustManagerFactory.java:35)       04-25 23:05:17.572:W / System.err(21301):at de.mdisco.ssl.TrustManagerFactory $ MeinX509TrustManager.checkServerTrusted(TrustManagerFactory.java:35)       04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573)       04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573)   04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)   04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect(HttpsURLConnectionImpl.java:433)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)   04-25 23:05:17.582:W / System.err(21301):在de.mdisco.HWRapp.Main $ MyThread.run(Main.java:1204)   04-25 23:05:17.582:E / Main(21301):错误缓冲读取器结果java.lang.NullPointerException   04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573)   04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)   04-25 23:05:17.572:W / System.err(21301):at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect(HttpsURLConnectionImpl.java:433)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)   04-25 23:05:17.582:W / System.err(21301):at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:165)   04-25 23:05:17.582:W / System.err(21301):在de.mdisco.HWRapp.Main $ MyThread.run(Main.java:1204)   04-25 23:05:17.582:E / Main(21301):错误缓冲读取器结果java.lang.NullPointerException

因此,我认为无法建立安全的SSL连接。

但是代码中的错误在哪里?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

04-25 23:05:17.562: E/Main(21301): Error in https connection
java.lang.NullPointerException 04-25 23:05:17.562: W/System.err(21301):
java.lang.NullPointerException 04-25 23:05:17.572: W/System.err(21301):
     at de.mdisco.ssl.TrustManagerFactory$MeinX509TrustManager.checkServerTrusted(TrustManagerFactory.java:35)

错误在您的信任管理器代码中,因为堆栈跟踪清楚地显示。它甚至会告诉你行号。

此处的另一个问题是您打印的误导性错误消息。这里的HTTPS连接没有'错误',只是你自己代码中的一个简单的NPE。