способ игнорировать сертификат ssl с помощью HttpsURLConnection

Я использую два подхода, чтобы попытаться использовать URL-адрес HTTPS:

Старый устаревший и возвращающий ответ с правильными значениями.

Вот код, которому не нужно было игнорировать сертификат ssl, он игнорирует его сам по себе или может использовать другой метод:

  public String newApiPost(String url,String p1,String p2,String p3){

    HttpClient httpClient = new DefaultHttpClient();
    // replace with your url
    HttpPost httpPost = new HttpPost(url);

    //Post Data
    List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>
    ();
    nameValuePair.add(new BasicNameValuePair("cliend_id",p1));
    nameValuePair.add(new BasicNameValuePair("client_secret", p2));
    nameValuePair.add(new BasicNameValuePair("key",p3));


    //Encoding POST data
    try {
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
     } catch (UnsupportedEncodingException e) {
        // log exception
        e.printStackTrace();
    }

    //making POST request.
    try {
        HttpResponse response = httpClient.execute(httpPost);
        HttpEntity httpEntity = response.getEntity();
          String   result = EntityUtils.toString(httpEntity,     
      HTTP.UTF_8);
       Log.d("response", result);

        // write response to log
        Log.d("zzuu", result.toString());
    } catch (ClientProtocolException e) {
        // Log exception
        e.printStackTrace();
    } catch (IOException e) {
        // Log exception
        e.printStackTrace();
        Log.d("dddfg", e.toString());

    }catch (Exception e){
        Log.d("dddfg", e.toString());

    }

    return "";
 }

Затем я использовал нерекомендованный метод HttpsUrlConnections, который должен игнорировать сертификат ssl, который я использую много раз, но не работал:

   public void sendNew (String urls,String paramValue1,String   
        paramValue2,String paramValue3){
    URL url = null;
    BufferedReader reader = null;
    StringBuilder stringBuilder;
    String data="";

    try {
        url = new URL(urls);
     HttpsURLConnection conn = (HttpsURLConnection)  
     url.openConnection();

         conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/x-www-form- 
     urlencoded");
    conn.setRequestProperty("charset", "utf-8");
    conn.setDoInput(true);
       conn.setDoOutput(true);
    Uri.Builder builder = new Uri.Builder()
            .appendQueryParameter("cliend_id", paramValue1)
            .appendQueryParameter("client_secret", paramValue2)
            .appendQueryParameter("apikey", paramValue3);
    String query = builder.build().getEncodedQuery();

    OutputStream os = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(os, "UTF-8"));
    writer.write(query);
    writer.flush();
    writer.close();
    os.close();

    conn.connect();

         reader = new BufferedReader(new   
         InputStreamReader(conn.getErrorStream()));
        stringBuilder = new StringBuilder();

        String line = null;
        while ((line = reader.readLine()) != null)
        {
            stringBuilder.append(line + "\n");

        }
        data= stringBuilder.toString();
        Log.d("zzuu", data);

    } catch (MalformedURLException e) {
    e.printStackTrace();
   } catch (ProtocolException e) {
        e.printStackTrace();
        Log.d("dddfg", e.toString());

    } catch (IOException e) {
        e.printStackTrace();
        Log.d("dddfg", e.toString());

    }catch (Exception e){
        Log.d("dddfg", e.toString());

    }
}

Он отвечает этой ошибкой:

10-12 17:06:06.135  16052-16075/  W/System.err﹕ java.io.IOException: Hostname 'xxxxxxxx' was not verified
10-12 17:06:06.139  16052-16075/  W/System.err﹕ at libcore.net.http.HttpConnection.verifySecureSocketHostname(HttpConnection.java:223)
10-12 17:06:06.139  16052-16075/  W/System.err﹕ at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:446)
10-12 17:06:06.139  16052-16075/  W/System.err﹕ at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
10-12 17:06:06.170  16052-16075/  W/System.err﹕ at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
10-12 17:06:06.171  16052-16075/  W/System.err﹕ at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
10-12 17:06:06.175  16052-16075/ W/System.err﹕ at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
10-12 17:06:06.175  16052-16075/  W/System.err﹕ at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
10-12 17:06:06.176  16052-16075/  W/System.err﹕ at ubicall.sand.ubicall.helper.JSONParser.method(JSONParser.java:422)
10-12 17:06:06.177  16052-16075/  W/System.err﹕ at ubicall.sand.ubicall.activity.SplashActivity$Access.doInBackground(SplashActivity.java:111)
10-12 17:06:06.177  16052-16075/  W/System.err﹕ at ubicall.sand.ubicall.activity.SplashActivity$Access.doInBackground(SplashActivity.java:106)
10-12 17:06:06.177  16052-16075/  W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287)

Я не понял, когда именно проблема работает хорошо в restclient и почтальоне, данные отправляются в теле URL-адреса с использованием метода post, тогда я обнаруживаю, что мне нужно игнорировать сертификат ssl при использовании HttpsURLConnection, но я пытаюсь многими способами игнорировать, но не сработало

   I use 

       private void trustEveryone() {
       try {
         HttpsURLConnection.setDefaultHostnameVerifier(new 
        HostnameVerifier(){
            public boolean verify(String hostname, SSLSession session) 
     {
                 return true;
              }});
           SSLContext context = SSLContext.getInstance("TLS");
          context.init(null, new X509TrustManager[]{new 
        X509TrustManager(){
            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws 
                 CertificateException {}
            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws 
          CertificateException {}
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }}}, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(
                context.getSocketFactory());
      } catch (Exception e) { // should never happen
        e.printStackTrace();
      }
   }

person androidAhmed    schedule 12.10.2015    source источник
comment
Похоже, проблема с сертификатом. Дополнительную информацию см. Здесь: developer.android.com/training/articles/   -  person Damien O'Reilly    schedule 12.10.2015
comment
спасибо за ответ, это нормальная работа в Postman и не работает в android   -  person androidAhmed    schedule 12.10.2015
comment
URLConnection предпочтительнее HttpClient. Загляните в stackoverflow.com/questions/32591295/   -  person Ravindra babu    schedule 12.10.2015
comment
stackoverflow.com/questions/2793150/ и https://github.com/loopj/android-async-http/issues/75 предпочитаю HttpURLConnection   -  person Ravindra babu    schedule 12.10.2015
comment
Пожалуйста, взгляните на мой отредактированный ответ.   -  person BNK    schedule 20.10.2015


Ответы (1)


Из вашей информации logcat, я думаю, вам следует прочитать следующие ссылки:

  1. # P2 #
    # P3 #
  2. # P4 #
    # P5 #

Затем вы можете обратиться к моему ответу на следующий вопрос:

Сертификат доверия OkHttp


РЕДАКТИРОВАТЬ: Что касается вашей идеи «игнорировать ssl», вы можете попробовать следующее (однако сказано, что это не рекомендуется):

public class HttpsTrustManager implements X509TrustManager {
    private static TrustManager[] trustManagers;
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

    @Override
    public void checkClientTrusted(
            X509Certificate[] x509Certificates, String s)
            throws java.security.cert.CertificateException {

    }

    @Override
    public void checkServerTrusted(
            X509Certificate[] x509Certificates, String s)
            throws java.security.cert.CertificateException {

    }

    public boolean isClientTrusted(X509Certificate[] chain) {
        return true;
    }

    public boolean isServerTrusted(X509Certificate[] chain) {
        return true;
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return _AcceptedIssuers;
    }

    public static void allowAllSSL() {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }

        });

        SSLContext context = null;
        if (trustManagers == null) {
            trustManagers = new TrustManager[]{new HttpsTrustManager()};
        }

        try {
            context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }

        HttpsURLConnection.setDefaultSSLSocketFactory(context != null ? context.getSocketFactory() : null);
    }
}

Затем в своей деятельности позвоните HttpsTrustManager.allowAllSSL();

person BNK    schedule 13.10.2015
comment
спасибо за ваш ответ после обсуждения с разработчиком сервера, который они просят игнорировать сертификат ssl. Я пытаюсь stackoverflow.com/a/5297100/3311983 но не сработало - person androidAhmed; 13.10.2015
comment
нет, я пытаюсь игнорировать ssl и пробовать много методов, чтобы решить проблему, о которой я не знал, когда вызываю этот метод после запуска HttpsURLConnection или после того, как я попробую оба и верну ошибки - person androidAhmed; 13.10.2015
comment
Если ошибка все еще возникает, пожалуйста, опубликуйте новый журнал, потому что я думаю, что может быть выбрано другое исключение, например, привязка доверия не найдена ... - person BNK; 13.10.2015
comment
вернуть исключение с java.lang.NullPointerException: lock == null - person androidAhmed; 13.10.2015
comment
Для sslsocketfactory вам понадобится файл сертификата / файл хранилища ключей в вашем проекте. - person BNK; 13.10.2015
comment
Большое спасибо за ваш ответ Я хочу проигнорировать проверку сертификата, можете ли вы дать мне действительный пример для этого и спасибо - person androidAhmed; 14.10.2015
comment
Извините, я действительно не знаю, или вы используете httpurlconnection вместо httpsurlconnection - person BNK; 14.10.2015
comment
Ах, я помню, что есть некоторые темы, вы можете искать по таким ключевым словам, как https, доверять всем или разрешать всем - person BNK; 14.10.2015
comment
Добавление этого для решения проблемы неприемлемо для магазина Google Play, так как он покажет ошибку и попросит удалить это. Что еще можно сделать? - person S.Ambika; 05.02.2021