Безопасный HTTP Post в Android с самозаверяющим сертификатом - PullRequest
1 голос
/ 30 мая 2011

В настоящее время я работаю над своим первым приложением для Android и первым API для веб-сайта моей организации.Я пытаюсь подключиться к API из приложения Android с помощью безопасного соединения.Наш веб-сайт имеет тестовый порт на 8090, который я пытаюсь использовать для тестирования API, но проблема, с которой я сталкиваюсь, заключается в том, что у меня есть самозаверяющий сертификат на веб-сайте, который, из того, что я прочитал в Интернете, не подходит для Android-приложений.не нравится.Чтобы убедиться, что нет проблем с API, я использовал его с подключением http, а не https, и он прекрасно работает.Я пробовал пару решений, которые я нашел в Интернете, включая пару с этого сайта, но ни одно из них не работает.Опять же, у меня нет большого опыта разработки для Android, поэтому большинство моих попыток было просто скопировать и вставить из решения, которое я нашел в Интернете.Вот некоторые ссылки на то, что я пробовал:

Https Connection Android

http://yekmer.posterous.com/how-to-accept-self-signed-certificates-in-and

есть другие страницы, которые я не могу найтиссылки на сейчас, но ниже приведен код, который я сейчас использую для подключения:

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("https://website.edu:8090/api.php?");

        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("method", "login"));
            nameValuePairs.add(new BasicNameValuePair("user", username.getText().toString()));
            nameValuePairs.add(new BasicNameValuePair("pass", md5(password.getText().toString())));
            nameValuePairs.add(new BasicNameValuePair("submitLogin", "1"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
            HttpParams params = httppost.getParams();
            HttpConnectionParams.setConnectionTimeout(params, 45000);
            HttpConnectionParams.setSoTimeout(params, 45000);

            // Execute HTTP Post Request
            HttpResponse response = httpclient.execute(httppost);
        } catch (ClientProtocolException e) {
            e.printStackTrace();                
        } catch (IOException e) {               
            e.printStackTrace();
        }

Я также хотел бы добавить, что покупка сертификата не вариант, так как у нас нет бюджета на работутак что все, что могло бы решить проблему с самозаверяющим сертификатом, было бы замечательно.Заранее спасибо!

1 Ответ

1 голос
/ 31 мая 2011

Может быть, вообще игнорировать серификаты, пока они не подписаны?

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

public static javax.net.ssl.TrustManager getTrustManager()
{
    javax.net.ssl.TrustManager tm = new javax.net.ssl.X509TrustManager() {

        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
        }

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

        }

        @Override
        public void checkServerTrusted(
                java.security.cert.X509Certificate[] chain, String authType)
                throws java.security.cert.CertificateException {        
        }
        };
        return tm;
}



public static DefaultHttpClient getThreadSafeClient() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, UnrecoverableKeyException {
    DefaultHttpClient client = new DefaultHttpClient();
    ClientConnectionManager mgr = client.getConnectionManager();
    HttpParams cleintParams = client.getParams();

    cleintParams.setBooleanParameter("http.protocol.expect-continue", true);
    cleintParams.setBooleanParameter("http.protocol.warn-extra-input", true);
    // params.setIntParameter("http.socket.receivebuffer", 999999);

    //---->> SSL
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null, null);

    SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
    sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
   // HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme("https", sf, 443));

    //<<------


client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, registry), cleintParams);

    return client;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...