2013-09-16 3 views
1

Я искал решение для этой проблемы на некоторое время, но я просто не могу понять этоjavax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL рукопожатия прервано

Я пытаюсь использовать SSL через HTTP связи между андроид приложения и сервера, я создал хранилище ключей с моим сертификатом,

у меня есть этот код:

URL url; 
    SSLContext sslContext = null; 
    KeyStore keyStore = KeyStore.getInstance("BKS");  
    InputStream input = SportsApplication.getContext().getResources().openRawResource(R.raw.mykeystore); 
    keyStore.load(input, "mypass".toCharArray()); 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); 
    kmf.init(keyStore, "mypass".toCharArray()); 
    KeyManager[] keyManagers = kmf.getKeyManagers(); 
    sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(keyManagers, null, null); 

    HttpsURLConnection connection = null; 
    String urlParameters = mJObject.toString(); 
    try { 
     Log.w("client", mUrl); 
     Log.v("client", "request: "+urlParameters); 
     // Create connection 
     mUrl = mUrl.replaceFirst("http", "https"); 
     url = new URL(mUrl); 
     connection = (HttpsURLConnection) url.openConnection(); 
     try{ 

      connection.setSSLSocketFactory(sslContext.getSocketFactory()); 
     } 
     catch (Exception e1) { 
      e1.printStackTrace(); 
      int tx =0; 
     } 
     try{ 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-type", "application/json"); 
     connection.setRequestProperty("Accept", "application/json"); 
     connection.setReadTimeout(dataTimeout); 
     connection.setConnectTimeout(com.inmobly.buckeyes.client.Constants.DEFAULT_CONN_TIMEOUT); 

     connection.setUseCaches(false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     } 
     catch (Exception e1) { 
      e1.printStackTrace(); 
      int tx =0; 
     } 
     // Send request 
     DataOutputStream wr = null; 
     try{ 
     wr = new DataOutputStream(connection.getOutputStream()); 
     } 
     catch (Exception e1) { 
      e1.printStackTrace(); 
      int tx =0; 
     } 

но я держать получение этого исключения:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x1b1b0e0: Failure in SSL library, usually a protocol errorerror:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4029bcf5:0x00000000) 

что я делаю неправильно?

+0

У меня такая же проблема. Вы нашли ответ @ Ясмин Реда? –

ответ

1

Поскольку самосогласование SSL не проходит, вместо того, чтобы отлаживать его с использованием информации в исключении, вы можете установить wirehark на систему ur (это также воспроизводится на симуляторе) и взглянуть на захват пакета на уровень os. Если ошибка вызвана несоответствием версии протокола между реализациями ssl на сервере и клиенте, пакеты должны иметь необходимую информацию. Сначала вы можете попробовать простое рукопожатие ssl, чтобы убедиться, что рукопожатие происходит правильно с сервером. Дайте нам знать, что вы получаете, и мы будем отлаживать все дальше!

+0

Благодаря вашему ответу я решил серьезную ошибку. –

+1

всегда рад видеть такие комментарии :) keep rockin. –

+0

@Bhavit Можете ли вы рассказать, что это за ошибка. У меня была такая же проблема с более низкой версией Android. Реализовано в NoSSlFactory из SO. Но все равно не сработало. –

Смежные вопросы