web-dev-qa-db-fra.com

javax.net.ssl.sslpeerunverifiedexception sans certificat homologue

J'essaie d'insérer un enregistrement dans MySQL en publiant des données sur un serveur PHP à partir d'une application Android. J'ai ajouté l'autorisation INTERNET à AndroidManifest.xml

Je reçois javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

Code 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());
    }
}

Quelqu'un peut-il aider?

12
Break Hart

Avertissement: n'implémentez pas cela dans le code de production que vous utiliserez un jour sur un réseau ne faisant pas entièrement confiance. Surtout tout ce qui passe sur l'internet public. Ce lien donne une réponse plus correcte. Ici est une implémentation utilisant SSL.

Votre problème est que vous utilisez DefaultHttpClient pour https (URL sécurisée). 
Créer un DefaultHttpClient personnalisé

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);
}

Puis changez votre code comme suit:

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

Regardez ici si vous avez des problèmes
Cela devrait fonctionner.

7
Lazy Ninja

J'ai eu ce problème avec un IIS 8 serveur. Dans la liaison https, je devais décocher la case "Exiger l'indication du nom du serveur". Une fois que je l'ai décochée, j'ai cessé de recevoir l'erreur.

2
Tim Cooke

Je dois dire que tous les certificats de confiance (approuvés par des centres autorisés tels que COMODO, Symantec, etc.) doivent fonctionner dans tous les cas. Si votre application reçoit cette exception javax.net.ssl.SSLPeerUnverifiedException: Aucun certificat homologue en utilisant un certificat acheté, vous donnez un problème sur le côté serveur . Pour tester, utilisez la commande openssl s_client -connect example.com:443 pour obtenir des informations internes sur le certificat reçu par votre application . Dans certains cas, mon serveur nginx aurait envoyé un mauvais certificat dans certains cas.

0
Vyacheslav