2017-02-26 16 views
6

ほとんどのデバイスでうまく機能していたアンドロイドアプリケーションがあります 最近、一部のハッカーが私たちのサーバーでDDoS攻撃を試み、javax.net.ssl.SSLException:アンドロイドの古いデバイスでSSLハンドシェイクが中止されました

ない一部のデバイスが動作し、私に次の例外

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x63eb8240: I/O error during system call, Connection reset by peer 

を与えていない一部のファイアウォールは、いずれも、何が今の問題です教えてくださいすることができ、どのように私はそれを解決できますか?

EDIT

これは、異なるAndroidのAPIレベルは、SSL/TLSのためのさまざまなサポートが詳細は、Android Documentionで見るためのバージョン、プロトコル持っている私のexecuteメソッド

public static BaseResponse execute(Context context, BaseRequest request) { 

    mStartTime = System.nanoTime(); 

    BaseResponse response = new BaseResponse(); 
    DataOutputStream outputStream; 
    try { 
     URL url = new URL(request.getURL()); 
     HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
     urlConnection.setConnectTimeout(TIMEOUT_DURATION); 
     urlConnection.setReadTimeout(TIMEOUT_DURATION); 
     urlConnection.setRequestMethod(request.getRequestType().getValue()); 
     urlConnection.addRequestProperty("Accept", "application/json"); 
     urlConnection.addRequestProperty("Content-Type","application/json"); 
     urlConnection.setRequestProperty("Accept-Charset", CHARACTER_SET); 
     urlConnection.addRequestProperty("Device-Id", PhoneUtils.getDeviceId(context)); 
     urlConnection.addRequestProperty("Version-Number", PhoneUtils.getAppVersion(context)); 


     TLSSocketFactory socketFactory = new TLSSocketFactory(); 
     urlConnection.setSSLSocketFactory(socketFactory); 

     switch (request.getRequestType()) { 
      case POST: 
      case PUT: 
       urlConnection.setDoOutput(true); 
       if (request.getStringEntity() != null) { 
        outputStream = new DataOutputStream(urlConnection.getOutputStream()); 
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, CHARACTER_SET)); 
        writer.write(request.getStringParam()); 
        writer.close(); 
        outputStream.flush(); 
        outputStream.close(); 
       } 

       break; 
      case GET: 
       urlConnection.setDoOutput(false); 
       break; 
     } 

     urlConnection.connect(); 

     try { 
      if (urlConnection.getResponseCode() == STATUS_OK) { 
       InputStream inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
       StringBuilder result = new StringBuilder(); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        result.append(line); 
       } 

       inputStream.close(); 
       response.setResponse(convertStringToJSONObject(result.toString())); 
      } else { 
       response.setResponse(null); 
      } 
     } catch (Exception ex) { 
      response.setAppError(AppError.DATA_ERROR); 
     } 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     response.setAppError(AppError.PARSING_ERROR); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     response.setAppError(AppError.DATA_ERROR); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     response.setAppError(AppError.DATA_ERROR); 
    } 

    return response; 
} 
+0

[javax.net.ssl.SSLException:読み取りエラー:ssl = 0x9524b800:システムコール中のI/Oエラー、ピアによる接続リセット] /stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system) – halileohalilei

答えて

16

を使用し、それを使用して、コードのこの作品は私の問題を解決しました。参考資料:ネットワークコールのためにretrofitライブラリを使用していました

+0

ありがとう、あなたは私の一日を保存しました:) –

+3

@Arshadこれがなぜこの問題を解決し、何が問題を引き起こしているのか説明できますか? – sasuke

2

のコードです - https://developer.android.com/reference/javax/net/ssl/SSLSocket.html

TLS 1.1と1.2を有効にするには、カスタムSSLSocketFactoryを作成する必要があります。https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/

public class TLSSocketFactory extends SSLSocketFactory { 

    private SSLSocketFactory internalSSLSocketFactory; 

    public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException { 
     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, null, null); 
     internalSSLSocketFactory = context.getSocketFactory(); 
    } 

    @Override 
    public String[] getDefaultCipherSuites() { 
     return internalSSLSocketFactory.getDefaultCipherSuites(); 
    } 

    @Override 
    public String[] getSupportedCipherSuites() { 
     return internalSSLSocketFactory.getSupportedCipherSuites(); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket()); 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); 
    } 

    @Override 
    public Socket createSocket(InetAddress host, int port) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); 
    } 

    private Socket enableTLSOnSocket(Socket socket) { 
     if(socket != null && (socket instanceof SSLSocket)) { 
      ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"}); 
     } 
     return socket; 
    } 
} 

してから接続して、これは任意のネットワーク呼び出し

/** 
* Initialize SSL 
* @param mContext 
*/ 
public static void initializeSSLContext(Context mContext){ 
    try { 
     SSLContext.getInstance("TLSv1.2"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
    try { 
     ProviderInstaller.installIfNeeded(mContext.getApplicationContext()); 
    } catch (GooglePlayServicesRepairableException e) { 
     e.printStackTrace(); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     e.printStackTrace(); 
    } 
} 

を行う前に、あなたのコードの中で、私は同じ問題を抱えていた

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
TLSSocketFactory socketFactory = new TLSSocketFactory(); 
conn.setSSLSocketFactory(socketFactory); 
conn.connect(); 
+0

私はそれを試して、あなたに戻ってきます –

+0

HttpURLConnectionにはメソッドがありませんsetSSLSocketFactoryと呼ばれる、ターゲットとするアンドロイドのバージョンは何ですか? –

+0

HttpsURLConnection - https://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html – kb0

関連する問題