En toute sécurité de fixation: javax.net.le protocole ssl.SSLPeerUnverifiedException: Pas de certificat homologue
Il y a des dizaines de posts sur ce problème (javax.net.le protocole ssl.SSLPeerUnverifiedException: Pas de certificat homologue) mais je n'ai pas trouvé quelque chose qui fonctionne pour moi.
De nombreux postes (comme cette, et cette) "résoudre" ce problème en permettant à tous les certificats d'être accepté, mais, bien sûr, ce n'est pas une bonne solution pour autre chose que des tests.
D'autres semblent très localisée et ne fonctionne pas pour moi. J'espère vraiment que quelqu'un a de la perspicacité que je manque.
Donc, mon problème: je suis en essais sur un serveur accessible uniquement via le réseau local, connexion via le protocole HTTPS. Faire l'appel que j'ai besoin à travers le navigateur fonctionne très bien. Pas de se plaindre de certificats et si vous vérifiez les certificats, il semble tout à fait bonne.
Quand je l'ai essayer sur mon appareil Android, je reçois javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Voici le code qui l'appelle:
StringBuilder builder = new StringBuilder();
builder.append( /* stuff goes here*/ );
httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();
//Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());
String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
Mon code pour MyActivity.getHttpClient()
:
protected synchronized static HttpClient getHttpClient(){
if (httpClient != null)
return httpClient;
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);
HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);
HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
//Thread safe in case various AsyncTasks try to access it concurrently
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParameters, schemeRegistry);
httpClient = new DefaultHttpClient(cm, httpParameters);
CookieStore cookieStore = httpClient.getCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
return httpClient;
}
Toute aide serait grandement appréciée.
Modifier
Aussi, pour ne mentionner que j'ai eu d'autres problèmes SSL avec une autre application, mais l'ajout de la SchemeRegistry
partie fixe pour moi avant.
Edit 2
Jusqu'à présent, je ne l'ai testé sur Android 3.1, mais j'ai besoin que cela fonctionne sur Android 2.2+, peu importe. Je viens de tester sur le navigateur sur mon Android tab (Android 3.1) et il se plaint du certificat. C'est bien sur mon pc, navigateur, mais pas sur le navigateur Android ou dans mon application.
Modifier 3
S'avère iOS navigateur aussi se plaint-il. Je commence à penser que c'est une chaîne de certificats problème décrit ici (Certificat SSL n'est pas digne de confiance - les sur mobile uniquement)
- cette question en raison de https m-je le droit ??
- Oui je suis connecter via https. Je vais mettre à jour la question
- Essayez ceci : stackoverflow.com/a/38598593/2301721
Vous devez vous connecter pour publier un commentaire.
Il s'avère que mon code était très bien et le problème est que le serveur ne retourne pas l'intégralité de la chaîne de certification. Pour plus d'informations, consultez ce DONC post et cette super-utilisateur de poste:
Certificat SSL n'est pas digne de confiance - les sur mobile uniquement
https://superuser.com/questions/347588/how-do-ssl-chains-work
Essayer de code ci-dessous :-
Dans mon cas tout utilisées pour fonctionner correctement. Tout à coup, après 2 jours de mon appareil ne présentent pas de site en https ou lien de l'image.
Après quelques recherches, il s'avère que Mon paramètres de l'heure n'était pas à jour sur le périphérique.
J'ai changé mes paramètres de l'heure correctement et cela a fonctionné.
J'ai eu cette erreur quand j'ai utilisé le certificat auto-signé + adresse ip. Juste ajouter ces lignes
et votre HttpURLConnection fonctionne.
Cette astuce n'est pas liée à une validation par rapport à CA! Donc, si je spécifie mal CA et utiliser cette astuce, je vais avoir une autre exception. Afin que l'hôte reste de confiance
Juste au cas où, je vous laisse le code pour spécifier votre propre autorité de certification ici:
Ne pas oublier d'utiliser la fonction cool buildTypes et placer les différents CAs pour debug/release dans le dossier res.