2017-02-26 41 views
6

Cihazların çoğu için iyi çalışan bir android uygulamasına sahibim Geçtiğimiz günlerde bazı bilgisayar korsanları, bazı güvenlik eklemeleri için bizi zorlayan sunucularımızda DDOS saldırısı yapmaya çalıştılar ve bazı güvenlik duvarları javax.net.ssl.SSLException: SSL handshake, Android eski cihazlarda iptal edildi

bazı cihazlar çalışma ve bana şu istisna

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

vermek değil herhangi bir artık problemi nedir ve bunu nasıl çözebilir söyle lütfen?

DÜZENLEME

bu

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

Olası çoğaltılabilir [javax.net.ssl.SSLException: Okuma hatası: ssl = 0x9524b800: Sistem çağrısı sırasında G/Ç hatası, Eş tarafından bağlantı sıfırlama] (http://stackoverflow.com/questions/30538640/javax-net-ssl-sslexception-read-error-ssl-0x9524b800-io-error-during-system) – halileohalilei

cevap

16

kullanın kullanmak ve bu kod parçası sorunumu çözdü . FYI: Ağ aramaları yapmak için güçlendirme kitaplığı kullanıyordum

+0

Çok teşekkür ederim, günümü kurtardın :) –

+3

@Arshad Bu sorunun neden ve neden sorun olduğunu açıklayabilir misiniz? – sasuke

2

Farklı Android API seviyelerini SSL için farklı destek var benim yürütmek yöntemin kodudur ayrıntıları Android documention gördüğünüz için/TLS sürümleri protokollerine - https://developer.android.com/reference/javax/net/ssl/SSLSocket.html

TLS 1.1 ve 1.2'yi etkinleştirmek için, özel bir SSLSocketFactory - https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2/

oluşturmanız gerekir 210
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; 
    } 
} 

Ve sonra bağlantılı olarak bu herhangi bir ağ çağrı

/** 
* 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(); 
    } 
} 

yapmadan önce kodda aynı problem vardı

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

Bunu denedim ve size geri döneceğim –

+0

HttpURLConnection'da hiçbir yöntem yoktur setSSLSocketFactory olarak adlandırılan, hedeflediğiniz android sürümü nedir? –

+0

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

İlgili konular