J'utilise HttpClient sur Android pour me connecter à https://someUrl.com/somePath. Le problème est que le certificat du site est pour * .someUrl.com, pas someUrl.com, donc j'obtiens une exception SSLException. Lame sur la partie du site, oui, mais à moins que je puisse le faire réparer, je suis coincé. Y a-t-il un moyen pour que HttpClient se détende et accepte le certificat?Android HttpClient - nom d'hôte dans le certificat ne correspond pas <example.com>! = <*. Example.com>
Répondre
Ceci est mon (édité) solution:
class MyVerifier extends AbstractVerifier {
private final X509HostnameVerifier delegate;
public MyVerifier(final X509HostnameVerifier delegate) {
this.delegate = delegate;
}
@Override
public void verify(String host, String[] cns, String[] subjectAlts)
throws SSLException {
boolean ok = false;
try {
delegate.verify(host, cns, subjectAlts);
} catch (SSLException e) {
for (String cn : cns) {
if (cn.startsWith("*.")) {
try {
delegate.verify(host, new String[] {
cn.substring(2) }, subjectAlts);
ok = true;
} catch (Exception e1) { }
}
}
if(!ok) throw e;
}
}
}
public DefaultHttpClient getTolerantClient() {
DefaultHttpClient client = new DefaultHttpClient();
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client
.getConnectionManager().getSchemeRegistry().getScheme("https")
.getSocketFactory();
final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();
if(!(delegate instanceof MyVerifier)) {
sslSocketFactory.setHostnameVerifier(new MyVerifier(delegate));
}
return client;
}
Il a l'avantage de ne pas changer le comportement par défaut, sauf si il y a un domaine générique, et dans ce cas il revalide comme si le domaine en 2 parties (par exemple, someUrl.com) faisait partie du certificat, sinon l'exception originale est renvoyée. Cela signifie que les certs vraiment invalides échoueront toujours.
Si elle veut *.someUrl.com
, il semble que vous pourriez donner www.someUrl.com/somePath
au lieu de someUrl.com/somePath
.
Nope. www.someUrl.com redirige vers someUrl.com – noah
Je suppose que c'est inutile, alors. Avez-vous vraiment besoin de https? Je le devinerais, mais cela rendrait la vie beaucoup plus facile. –
Ceci est une excellente solution temporaire lorsque le site ne fait PAS de redirection! –
Le BouncyCastle sur Android est trop ancien et il ne reconnaît pas les certificats génériques.
Vous pouvez écrire votre propre X509TrustManager pour rechercher un caractère générique.
ou vous pouvez désactiver la vérification de certificat complètement si vous pouvez accepter le risque. Voir cette question,
En fait ZZ, si l'OP est correct sur le nom du site et la structure du certificat, alors le message d'erreur est correct: **. SomeUrl.com * est supposé correspondre à www.someUrl.com et à n'importe quoi. com, mais pas * someUrl.com ou this.that.someUrl.com. –
si vous utilisez un WebView il suffit d'appeler
webview.clearSslPreferences();
pour ignorer les erreurs SSL
- 1. httpclient ssl certificat sur android
- 2. Erreur: La liste <int> ne correspond pas à 'System.Collections.Generic.IEnumerable <int>
- 3. Les données pagination caractères "<<" et "<" ne s'affiche pas correctement dans IE et Safari
- 4. UIProgressView ne change pas quand 0.0 <progression <0.03
- 5. Visual C++ ne voit pas l'opérateur << surcharge
- 6. Correspond à toutes les URL qui ne sont pas enveloppées dans <a> tag
- 7. Pourquoi cette << surcharge ne compile-t-elle pas
- 8. <% $, <% @, <% =, <% # ... quel est le problème?
- 9. SortedSet <T> et IComparer anonyme <T> dans le constructeur ne fonctionne pas
- 10. opérateur <<: std :: cout << i << (i << 1);
- 11. <? Xml-stylesheet?> Si donné avant <?xml?> ne fonctionne pas dans firefox
- 12. JavaScript et DOM: pourquoi "<table>" + = "<tr><td></td></tr>" + = "</ table" ne fonctionne pas?
- 13. Fichiers de certificat Apache HttpClient et PEM
- 14. SMTP ERROR: (552, '5.6.0 Soumission refusée L'expéditeur ne correspond pas à l'expéditeur <myEmailAddress>)
- 15. Android: HTTPClient
- 16. <cfquery> ne pas récupérer DATA
- 17. Comment ne pas #include <windows.h>
- 18. <html:errors> ne fonctionne pas
- 19. Le contenu de HTMLEditor ne voit pas <br/>
- 20. Android cookies persistants HttpClient
- 21. NSCompoundPredicate ne correspond pas
- 22. SVG <image> ne fonctionne pas dans <defs> sur Chrome
- 23. Le type d'événement ne peut pas être Action <>?
- 24. << opérateur Ruby
- 25. Obtenir le nom d'utilisateur principal du compte Gmail dans Android <2.0
- 26. Le proxy ne fonctionne pas dans HttpClient 4.0 beta2
- 27. Android HttpClient et HTTPS
- 28. <%=yield%> ne fonctionne pas dans les modèles nommés
- 29. La superposition <span> ne fonctionne pas dans IE6
- 30. Vim ne se développe pas <cfile>
J'ai essayé d'utiliser ce qui précède, mais j'ai parfois des exceptions de débordement de pile - la méthode verify() ne cesse jamais d'être récursive. Sur quelques centaines de milliers d'installations, cela arrive environ 80 fois par semaine. Avez-vous vu des problèmes avec cela? – user291701
@ user291701 J'ai modifié le code pour essayer de contourner votre problème. Je suppose que le problème est que vous finissez par remettre le vérificateur dans la même usine, de sorte qu'il finit par se déléguer à lui-même en quelque sorte ... N'hésitez pas à éditer ma réponse si vous trouvez un meilleur moyen. – noah
Dans tous les cas, je suis confronté 'l'erreur de serveur ne peut pas traiter la demande car le type de support n'est pas pris en charge''. Ne pas avoir la moindre idée de la raison de cela. –