Я публикую сообщение https и получаю исключение из ssl-исключения, не являющегося доверенным сертификатом сервера. Если я использую обычный http, он работает отлично. Должен ли я каким-либо образом принимать сертификат сервера?
// always verify the host - dont check for certificate final static HostnameVerifierDO_NOT_VERIFY=newHostnameVerifier() { public booleanverify(String hostname, SSLSession session) { returntrue; } };
/** * Trust every server - dont check for any certificate */private staticvoidtrustAllHosts() { // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[] { newX509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return newjava.security.cert.X509Certificate[] {}; }
Я делаю предположение, но если вы хотите, чтобы произошло реальное рукопожатие, вы должны сообщить Android о своем сертификате. Если вы хотите просто принять, несмотря ни на что, то используйте этот псевдокод, чтобы получить то, что вам нужно, с помощью HTTP-клиента Apache:
public Socket createSocket()throws IOException { return FACTORY.createSocket(); }
// TODO: add other methods like createSocket() and getDefaultCipherSuites(). // Hint: they all just make a call to member FACTORY }
FullX509TrustManager - это класс, который реализует javax.net.ssl.X509TrustManager, но ни один из методов фактически не выполняет никакой работы, получите образец здесь.
При разработке приложения, использующего https, на вашем тестовом сервере нет действительного SSL-сертификата. Иногда веб-сайт использует самозаверяющий сертификат или веб-сайт использует бесплатный SSL-сертификат. Итак, если вы попытаетесь подключиться к серверу с помощью Apache HttpClient, вы получите исключение, сообщающее, что "одноранговый узел не прошел проверку подлинности". Хотя не рекомендуется доверять всем сертификатам в производственном программном обеспечении, возможно, вам придется делать это в зависимости от ситуации. Это решение устраняет исключение, вызванное "одноранговый узел не прошел проверку подлинности".
But before we go to the solution, I must warn you that this is not a good idea for a production application. This will violate the purpose of using a security certificate. So unless you have a good reason or if you are sure that this will not cause any problem, don't use this solution.
Normally you create a HttpClient like this.
HttpClient httpclient = new DefaultHttpClient();
But you have to change the way you create the HttpClient.
First you have to create a class extending org.apache.http.conn.ssl.SSLSocketFactory.
Если вы пытаетесь отправить post-запрос на страницу входа в систему, остальная часть кода будет выглядеть следующим образом.
privateURIurl=newURI("url of the action of the form"); HttpPosthttppost=newHttpPost(url); List<NameValuePair> nameValuePairs = newArrayList<NameValuePair>(); nameValuePairs.add(newBasicNameValuePair("username", "user")); nameValuePairs.add(newBasicNameValuePair("password", "password")); try { httppost.setEntity(newUrlEncodedFormEntity(nameValuePairs)); HttpResponseresponse= httpclient.execute(httppost); HttpEntityentity= response.getEntity(); InputStreamis= entity.getContent(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Вы получаете HTML-страницу в InputStream. Затем вы можете делать все, что хотите, с возвращенной HTML-страницей.
Но здесь вы столкнетесь с проблемой. Если вы хотите управлять сеансом с помощью файлов cookie, вы не сможете сделать это этим методом. Если вы хотите получить файлы cookie, вам придется сделать это через браузер. Тогда только вы будете получать файлы cookie.
Ответ 4
Если вы используете сертификат StartSSL или Thawte, для Froyo и более старых версий произойдет сбой. Вы можете использовать репозиторий CAcert более новой версии вместо того, чтобы доверять каждому сертификату.