Вопрос по ssl, ssl-certificate, android – Android: игнорирование самозаверяющих ошибок сертификатов; Фактическая реализация?

2

Как и многие здесь, я пытаюсь установить связь с сайтом, который имеет самоподписанный сертификат. Есть много классов и фрагментов кода, показывающих, как это сделать, например,HTTPS GET (SSL) с Android и самозаверяющим сертификатом сервера, но я не могу найти ничего, что показывает, как на самом деле использовать классы. Я много экспериментировал, и я уверен, что мне просто не хватает чего-то простого.

Чтобы быть точным, я пытаюсь использовать классы, предоставленные & quot; Moss & quot ;; ответ с наибольшим количеством голосов. Я до сих пор всегда получаю сертификат "Не доверяю" сообщение. Еще один человек в этой теме также попросил подсказки по реализации, но не получил ответа. Спасибо за любую помощь.

Если бы я мог добавить этот вопрос к этой теме, я был бы намного счастливее, но я полагаю, что новички, подобные мне, могут только публиковать новые вопросы (хотя я болею за SO более года).

Ваш Ответ

2   ответа
2

Мы используем похожийSocketFactory а такжеX509TrustManager реализация в некоторых наших проектах. Чтобы связать эти классы с вашей реализацией, все, что вам в основном нужно сделать, это подключить их кHttpClient (предполагая, что вы используете) используется для связи клиент-сервер.

У нас обычно есть метод для созданияHttpClient с упомянутой фабрикой и доверительным менеджером. Это выглядит примерно так и в значительной степени основано на ссылке, показанной во встроенных комментариях.

protected HttpClient constructClient() {
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    // use the debug proxy to view internet traffic on the host computer
    if (ABCApplication.isDebuggingProxy()) params.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(ABCConstants.DEBUG_PROXY_HOST, ABCConstants.DEBUG_PROXY_PORT, "http"));

    // ignore ssl certification (due to signed authority not appearing on android list of permitted authorities)
    // see: http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", new PlainSocketFactory(), 80));
    registry.register(new Scheme("https", new FakeSocketFactory(), 443)); 
    ClientConnectionManager cm = new SingleClientConnManager(params, registry);

    return new DefaultHttpClient(cm, params);
}

Надеюсь, что это поможет с вашей реализацией.

Это не просто помогло, это просто сработало! Это выглядит примерно так же, как и все остальные, которые я пробовал делать, но они добавили еще несколько параметров. Похоже, они также предпочитали использовать ThreadSafeClientConnManager вместо Single. Когда у меня будет время, я узнаю о разнице. Thanx !! (Если бы у меня была репутация, я бы +1 к вашему ответу). MBro
2

We can also use

HttpURLConnection http = null;
            URL url;
            try {
                url = new URL("https:your domian");

                if (url.getProtocol().toLowerCase().equals("https")) {
                    trustAllHosts();
                    HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                    https.setHostnameVerifier(DO_NOT_VERIFY);
                    http = https;
                    System.out.println("TEST:::"+convertStreamToString(http.getInputStream())); 
                } else {
                    http = (HttpURLConnection) url.openConnection();
                    System.out.println("TEST:::"+convertStreamToString(http.getInputStream())); 
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


/*******
 * Trust every server - don't check for any certificate
 */
private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }
    } };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}



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

Похожие вопросы