Estoy usando HttpClient en Android para conectarme al https://someUrl.com/somePath. El problema es que el certificado del sitio es para * .someUrl.com, no para someUrl.com, así que obtengo una SSLException. Cojo por parte del sitio, sí, pero a menos que pueda arreglarlo, estoy atascado. ¿Hay alguna manera de hacer que HttpClient se relaje y acepte el certificado?Android HttpClient - nombre de host en el certificado no coincide <example.com>! = <*. Example.com>
Android HttpClient - nombre de host en el certificado no coincide <example.com>! = <*. Example.com>
Respuesta
Este es mi (editado) solución:
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;
}
Tiene la ventaja de no cambiar el comportamiento por defecto a menos que haya un dominio comodín, y en ese caso se revalida como si el dominio de 2 partes (por ejemplo, someUrl.com) fuera parte del certificado, de lo contrario se vuelve a lanzar la excepción original. Eso significa que los certs verdaderamente inválidos seguirán fallando.
Si quiere *.someUrl.com
, entonces parece que podría simplemente darle www.someUrl.com/somePath
en lugar de someUrl.com/somePath
.
Nope. www.someUrl.com redirige a someUrl.com – noah
Supongo que eso es inútil, entonces. ¿Realmente necesitas https? Supongo que sí, pero eso haría la vida mucho más fácil. –
¡Esta es una gran solución temporal cuando el sitio NO hace un redireccionamiento! –
El BouncyCastle en Android es demasiado antiguo y no reconoce el certificado de comodín.
Puede escribir su propio X509TrustManager para buscar comodines.
o puede deshabilitar la verificación del certificado por completo si puede aceptar el riesgo. Ver esta pregunta,
En realidad ZZ, si el OP es correcto sobre el nombre del sitio y la estructura del certificado, entonces el mensaje de error es correcto: **. SomeUrl.com * se supone que coincide con www.someUrl.com y anything.someUrl. com, pero * no * someUrl.com o this.that.someUrl.com. –
si se utiliza un WebView sólo llamar
webview.clearSslPreferences();
para ignorar los errores SSL
- 1. Java SSLException: nombre de host en el certificado no coincide
- 2. ¿El nombre de host en el certificado no coincide?
- 3. Java SSLException: nombre de host en el certificado no coincide para www.googleapis.com
- 4. Problemas de SSL con S3/AWS con la API de Java: "el nombre de host en el certificado no coincide"
- 5. ¿Cuál es el nombre para el operador "<<<"?
- 6. sendmail: OpenSSL :: SSL :: SSLError: nombre de host no coincide
- 7. ¿La dirección IP como nombre de host (CN) al crear un certificado? (HTTPS equivocado nombre de host: debe ser <ipAddress>)
- 8. El nombre de host no puede ser nulo en HttpResponse para android
- 9. Apache HttpClient y archivos de certificado PEM
- 10. <% $, <% @, <% =, <% # ... ¿cuál es el problema?
- 11. ¿Cómo funciona exactamente la implementación de Scala de <: <, <% <, =: = en el compilador?
- 12. Pregunta sobre el operador ostream <<
- 13. ¿Qué significa el operador de Bash <<<?
- 14. Android: HTTPClient
- 15. En PHP, ¿qué representa "<<<"?
- 16. Operador de sobrecarga << para matrices
- 17. Problema con ActionMailer en Rails3. (el nombre de host ssl no concuerda con el certificado del servidor)
- 18. Obtener el nombre de usuario principal de la cuenta de Gmail en Android <2.0
- 19. Apache HttpClient 4.0 no pudo esperar el socket en Android
- 20. Android No se puede resolver el host
- 21. <%# %> vs <%= %>
- 22. ¿<script> no está en <head> ok?
- 23. <: <operador en scala
- 24. El reloj del emulador no coincide con el reloj del sistema host
- 25. El perfil no coincide con ningún par válido de certificado/clave privada en el llavero predeterminado
- 26. ¿Cómo se llama el "operador <<"?
- 27. identidad de firma de código <name> no coincide con ningún certificado de firma de código válido y no caducado
- 28. "<>" vs "no en"
- 29. El nombre de host del archivo de host no se devuelve en C# ASP.NET MVC
- 30. HTML5 <audio> etiqueta en Android
He intentado utilizar lo anterior, pero a veces obtengo excepciones de desbordamiento de pila: el método verify() nunca detiene la recursión. De unas pocas cientos de miles de instalaciones, sucede aproximadamente 80 veces a la semana. ¿Has visto algún problema con esto? – user291701
@ user291701 He editado el código para tratar de solucionar tu problema. Supongo que el problema es que terminas configurando el verificador en la misma fábrica de nuevo, por lo que termina delegándose a sí mismo de alguna manera ... No dudes en editar mi respuesta si encuentras una mejor manera. – noah
En cualquier caso, estoy frente a 'el servidor no puede atender la solicitud porque el tipo de medio no está soportado' 'error. Sin obtener ninguna pista sobre el motivo de esto. –