2



ここに問題があります。1.7 以降で完全に動作するコードがいくつかありますが、1.6 に切り替えると、常に次のエラーが発生します。

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)

問題は HttpsURLConnection にあると思いますが、何がわかりません。HttpsURLConnectionを初期化する方法は次のとおりです。

 // create URL Object from String
 URL url = new URL(https_url);
 // set IP Adress for X509TrustManager
 caTrustManager.setHostIP(url.getHost());     
 TrustManager[] trustCerts = new TrustManager[]{
     caTrustManager
 };
 SSLContext sc = SSLContext.getInstance("SSL");
 sc.init(null, trustCerts, new java.security.SecureRandom());
 //'ArrayList' where the data is saved from the URL
 ArrayList data = null;
 // open URL
 HttpsURLConnection httpsVerbindung = (HttpsURLConnection) url.openConnection();           
 httpsVerbindung.setSSLSocketFactory(sc.getSocketFactory());
 // Read the data from the URL
 data = PerformAction.getContent(httpsVerbindung);

そして、エラーが発生するメソッドは次のとおりです。
Class = PerformAction
Methode = getContent(HttpsURLConnection con) :

public static ArrayList getContent(HttpsURLConnection con) {

    // The ArrayList where the information is saved
    ArrayList infoFromTheSite = new ArrayList();
    // check if connection not null
    if (con != null) {

        BufferedReader br = null;
        try {
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            // !!!! **Error happens Here** !!!!
            // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            br = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String input;
            // go through all the Data
            while ((input = br.readLine()) != null) {
                // save to ArrayList
                infoFromTheSite.add(input);
            }

        } catch (IOException ex) {
            Logging.StringTimeFail("Fehler mit dem BufferedReaders");
            ex.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException ex) {
                    Logger.getLogger(PerformAction.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

    }

}


私の問題が少し明確で、誰かが私を理解してくれることを願っています:P
私の問題を解決するために時間を割いてくれてありがとう!

編集

だから私は Wireshark で、失敗したパケットが成功したものよりも小さいことを発見しました (157 バイト = 失敗; 208 バイト = true)

彼は IP パケットのデータを暗号化していないか、証明書を送信していないのではないかと考えていました。

また、SSL ハンドシェイクが成功していることにも気付きましたが、クライアントがデータを要求すると失敗し、サーバー アンサーは次のようになります。

Connection Reset

(はい、サーバーは「接続リセット」を呼び出しています)
私はここで本当に迷っています:D

4

1 に答える 1

3

@Robertがコメントで述べたように:

通信しているサーバーが安全に維持されている場合、Java 1.6 では問題が発生します。これは、SSL/TLS の安全でないバージョンしかサポートしていないためです (TLS 1.1 および 1.2 はサポートされておらず、古い暗号のみがサポートされています)。

修正: Java のバージョンをアップグレードします。

Java のバージョンをアップグレードできない場合は、Apache HTTPClientを使用できます。

于 2015-09-02T13:21:39.580 に答える