2017-02-07 6 views
0

は、同じサーバーに2つのネストされたボレー要求を使用していますが、もう一つはエラーで返されます:AndroidのバレーボールSSLエラー

 StringRequest strReqUpdate = new StringRequest(Request.Method.GET, versionCheckURL, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      initJson = response; 
      try { 
       JSONObject root = new JSONObject(initJson); 
       final long version = root.getLong("latest_update");     
       long localVersion = prefs.getLong("version", 0); 
       boolean flag = false; 

       if(version != localVersion){      
         flag = true; 
       } 

       if(flag == true){      
        StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) {        
          SharedPreferences.Editor editor = prefs.edit(); 
          editor.putString("json", response);                        
          editor.putLong("version", version); 
          editor.commit(); 

          parseData(response); 
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          String cachedResponse = prefs.getString("json", ""); 

          if (!cachedResponse.equals("")) { 
           parseData(cachedResponse); 
          } else { 
           Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show(); 
           finish(); 
          } 
         } 
        }) { 
         @Override 
         public Map<String, String> getHeaders() throws AuthFailureError { 
          HashMap<String, String> headers = new HashMap<String, String>(); 
          headers.put("key", getResources().getString(R.string.api_key)); 
          return headers; 
         } 
        }; 
        strReq.setShouldCache(false); 
        AppController.getInstance().addToRequestQueue(strReq, Constants.TAG_STRING_REQ); 
       } 
       else{      
        String cachedResponse = prefs.getString("json", ""); 
        if (!cachedResponse.equals("")) { 
         parseData(cachedResponse); 
        } else { 
         Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show(); 
         finish(); 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      String cachedResponse = prefs.getString("json", ""); 
      if (!cachedResponse.equals("")) { 
       parseData(cachedResponse); 
      } else { 
       Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
     } 
    }) { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("key",getResources().getString(R.string.api_key)); 
      return headers; 
     } 
    }; 
    strReqUpdate.setShouldCache(false); 
    AppController.getInstance().addToRequestQueue(strReqUpdate, Constants.TAG_STRING_REQ); 

私のJSONへの更新があるかどうかを確認するために要求を行っているものをここでやっていますそれをフェッチするリクエストが開始された場合(キャッシュされていないJSONがある場合)両方のリクエストは、sslを使用するherokuサーバにありますが、2回目のリクエストでのみエラーが発生します。私はsslエラーを起こしていると思う、私はさらに様々なポストから見られるようにsslの握手をオーバーライトしようとしたが、何も動作しません。孤立

2番目のリクエストは、次のとおりです。ログに取得しています何

  StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) {        
         SharedPreferences.Editor editor = prefs.edit(); 
         editor.putString("json", response);                        
         editor.putLong("version", version); 
         editor.commit(); 

         parseData(response); 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         String cachedResponse = prefs.getString("json", ""); 

         if (!cachedResponse.equals("")) { 
          parseData(cachedResponse); 
         } else { 
          Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show(); 
          finish(); 
         } 
        } 
       }) { 
        @Override 
        public Map<String, String> getHeaders() throws AuthFailureError { 
         HashMap<String, String> headers = new HashMap<String, String>(); 
         headers.put("key", getResources().getString(R.string.api_key)); 
         return headers; 
        } 
       }; 
       strReq.setShouldCache(false); 
       AppController.getInstance().addToRequestQueue(strReq, Constants.TAG_STRING_REQ); 

:解決しよう

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x61ff28f0: Failure in SSL library, usually a protocol error error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:744 0x5df0b6fd:0x00000000)

+0

??? [同時に2つのSSL接続を行うことはできません](http://security.stackexchange.com/questions/46988/is-it-technically-possible-to-configure-two-different-ssl-certificates-for- the-s)。再度接続を解除して接続することも、2つの要求で1つのSSL接続を使用することもできますが、[この問題](http://serverfault.com/questions/566426/does-each-subdomain-need-its-own -ssl-certificate)。 –

+0

同時に2つのSSL接続を作成していません。第2のSSL接続は、最初のonResponseで開始します。 –

答えて

1

:エラーは、実際には、接続のタイムアウトだったSSLのように見えたもの。

jsonRequest.setRetryPolicy(new DefaultRetryPolicy(10000, 
          DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
          DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

10秒で要求を設定し、中に見られるようにMAX_RETIESはトリックをした:

Volley SSL Handshake Exception although has removed SSL3 protocol