2015-02-25 4 views
-1

На моем компьютере работает REST webservice, и он отлично работает при доступе к браузеру, но получает исключение при доступе через REST-вызов из java-кода, запущенного на том же компьютере. Пожалуйста, помогите мне решить эту проблему. Попробуйте ввести подробный код. Благодаря!! Не помещайте это сообщение как дубликат, я проверил с другими вопросами, которые не были найдены так похожими. Я пытаюсь с кода ниже ...Получение SSLException при вызове RESTful

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 

      public void checkClientTrusted(X509Certificate[] certs, String authType) { 
      } 

      public void checkServerTrusted(X509Certificate[] certs, String authType) { 
      } 
     } }; 


     try { 
      SSLContext sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     } catch (KeyManagementException e1) { 
      e1.printStackTrace(); 
     } catch (NoSuchAlgorithmException e1) { 
      e1.printStackTrace(); 
     } 


     HostnameVerifier allHostsValid = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 


     HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 


     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("https://17.91.15.84:8088/login"); 
     List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>(); 
     parameters.add(new BasicNameValuePair("userid", "user1")); 
     parameters.add(new BasicNameValuePair("password", "user1$")); 
        post.setEntity(new UrlEncodedFormEntity(parameters)); 
      HttpResponse response = client.execute(post); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       System.out.println(line); 
      }   
    } 

и во время работы один и тот же код на той же машине, на которой запущена служба, я в конечном итоге с сообщением ниже исключения ..

javax.net.ssl.SSLException: hostname in certificate didn't match: <17.91.15.84> != <My-PC> 
     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220) 
+0

какая версия 'HttpClient' JAR вы используете? – Amogh

+2

Является ли сертификат ОК? –

+0

@Amogh: httpclient-4.0.jar – Nani

ответ

0

Возможно, сертификат предназначен для DNS. попробуйте вместо IP-адреса DNS-Name.

HttpPost post = new HttpPost("https://XXDNSXX:8088/login");

0

Вы должны изменить код, как вы хотите, чтобы post запрос с параметрами, но сертификат обводной код одинаков для HttpPost, а также HttpGet

return null в getAcceptedIssuers() просто обход сертификата проверка.

Предупреждение: Не пытайтесь его в производственной среде, если у вас есть очень твердых оснований для объездной все проверки сертификата. Ответ, если да, почему вы все еще используете SSL-соединение? :)

Попробуйте это:

@Test 
     public void withTrustManeger() throws Exception { 
      DefaultHttpClient httpclient = buildhttpClient(); 
      HttpGet httpGet = new HttpGet("https://url.url.com"); 
      HttpResponse response = httpclient.execute(httpGet); 

      HttpEntity httpEntity = response.getEntity(); 
      InputStream inputStream = httpEntity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        inputStream)); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      inputStream.close(); 
      String jsonText = sb.toString(); 
      System.out.println(jsonText); 
     } 

buildhttpClient() функцию следующим образом:

private DefaultHttpClient buildhttpClient() throws Exception { 
      DefaultHttpClient httpclient = new DefaultHttpClient(); 

      SSLContext sc = SSLContext.getInstance("SSL"); 
      sc.init(null, getTrustingManager(), new java.security.SecureRandom()); 

      SSLSocketFactory socketFactory = new SSLSocketFactory(sc); 
      Scheme sch = new Scheme("https", 443, socketFactory); 
      httpclient.getConnectionManager().getSchemeRegistry().register(sch); 
      return httpclient; 
     } 

Здесь getTrustingManager() точно так же, как ваш trustAllCerts.

+0

только для целей развития, поэтому никаких проблем с передачей. Я попытался с вашим кодом, но все же я получаю ... javax.net.ssl.SSLException: имя хоста в сертификате не соответствует: – Nani

+0

@Nani, тогда вы должны попробовать для 'setHostnameVerifier', в методе' verify' проверить имя 'host' с целью тестирования' hostname', если он равен, тогда 'return true' в противном случае' false' – Amogh

+0

@Nani любые обновления? – Amogh

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