Javax.net.ssl.sslpeerunverifiedexception no peer certificate

Я пытаюсь вставить запись в MySQL, отправив данные на сервер PHP из приложения Android. Я добавил разрешение INTERNET на AndroidManifest.xml

Я получаю javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

Код Android

private void senddata(ArrayList<NameValuePair> data)
{
    try 
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php");
        httppost.setEntity(new UrlEncodedFormEntity(data));
        HttpResponse response = httpclient.execute(httppost);

    }
    catch (Exception e) {
        // TODO: handle exception
        Log.e("log_tag", "Error:  "+e.toString());
    }
}

Может ли кто-нибудь помочь?

Ответ 1

Предупреждение. Не используйте это в производственном коде, который вы когда-либо собираетесь использовать в сети, которой вы не полностью доверяете. Особенно все, что происходит через интернет. Эта ссылка дает более правильный ответ. Здесь - это реализация с использованием SSL.

Ваша проблема в том, что вы используете DefaultHttpClient для https (secure url).
Создайте собственный DefaultHttpClient

public static HttpClient createHttpClient()
{
    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
    HttpProtocolParams.setUseExpectContinue(params, true);

    SchemeRegistry schReg = new SchemeRegistry();
    schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
    ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);

    return new DefaultHttpClient(conMgr, params);
}

Затем измените свой код следующим образом:

        HttpClient httpclient = createHttpClient();
        HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php");
        httppost.setEntity(new UrlEncodedFormEntity(data));
        HttpResponse response = httpclient.execute(httppost);

Посмотрите здесь, если у вас есть проблемы
Он должен работать.

Ответ 2

У меня возникла проблема с сервером IIS 8. В привязке https я должен был снять отметку с флажка "Требовать указание имени сервера". Как только я отключил его, я перестаю получать ошибку.

Ответ 3

Я должен сказать, что все доверенные сертификаты (доверенные авторизованными центрами, такими как COMODO, Symantec и т.д.) должны работать в любом случае. Если ваше приложение получает такой javax.net.ssl.SSLPeerUnverifiedException: no peer certificate, используя приобретенный сертификат, вы даете что-то не так на стороне сервера.  Чтобы проверить использование команды openssl s_client -connect example.com:443, чтобы получить внутреннюю информацию о сертификате, полученном вашим приложением. В случае, если в некоторых случаях мой nginx-сервер отправил неправильный сертификат.