/ / SSLPeerUnverifiedException (Unirest) - java, https, ssl-certificate, unirest

SSLPeerUnverifiedException (Unirest) - java, https, ssl-certificate, unirest

Soy nuevo para jugar con las API (tanto oficiales como no oficiales) y estoy usando una llamada JavaSnap. He estado jugando con una implementación muy básica del código de ejemplo, pero me he encontrado con errores. Aquí está el código muy básico:

Snapchat snapchat = Snapchat.login("xxxx", "xxxxx");

En primer lugar me encontré con un montón de errores ClassNotFoundy tuve que seguir descargando los módulos de apache (commons, httpcomponents, etc.) para permitir que el programa progrese, pero al ser archivos de clase, esto significaba que no podía ver todos los módulos que necesitaba descargar. Así que si alguien quiere decirme Que mal estoy haciendo algo, siéntete libre.

De todos modos, ahora que he aclarado todas las excepciones de ClassNotFound (espero) obtengo la siguiente excepción:

com.mashape.unirest.http.exceptions.UnirestException: javax.net.ssl.SSLPeerUnverifiedException: Host name "feelinsonice-hrd.appspot.com" does not match the certificate subject provided by the peer (CN=*.appspot.com, O=Google Inc, L=Mountain View, ST=California, C=US)
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:146)
at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)
at com.habosa.javasnap.Snapchat.requestJson(Snapchat.java:953)
at com.habosa.javasnap.Snapchat.login(Snapchat.java:160)
at Tester.go(Tester.java:21)

Como lo entiendo, esto es porque necesitohabilite la confianza en todos los certificados, sin embargo, para hacer esto creo que necesito usar HostNameVerifiers con SSLSocketFactorys, pero realmente no puedo empezar a jugar con esto ya que solo tengo la fuente para la API JavaSnap, y rastrear el error hasta El método más reciente disponible para editar es el siguiente:

private static HttpResponse<JsonNode> requestJson(String path, Map<String, Object> params, File file) throws UnirestException {
MultipartBody req = prepareRequest(path, params, file);

// Execute and return response as JSON
HttpResponse<JsonNode> resp = req.asJson();

// Record
lastRequestPath = path;
lastResponse = resp;
lastResponseBodyClass = JsonNode.class;

return resp;

Mi pregunta es, ¿estoy realmente en la línea correcta con mi pensamiento?
Si lo soy, ¿cómo puedo lograr mi objetivo de eliminar este error / confiar en los certificados? Si no lo soy, ¿cuál es el problema?

Muchas gracias

Respuestas

1 para la respuesta № 1

Respondo esta vieja pregunta para recordar mi búsqueda. La solución de error de certificado es una combinación de algunos lugares.


import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

public class XXX {

private static HttpClient unsafeHttpClient;

static {
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy() {
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
}).build();

unsafeHttpClient = HttpClients.custom().setSSLContext(sslContext)
.setSSLHostnameVerifier(new NoopHostnameVerifier()).build();

} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
e.printStackTrace();
}
}

public static HttpClient getClient() {
return unsafeHttpClient;
}

public static void main(String[] args) {

try {
HttpClient creepyClient = RestUnirestClient.getClient();
Unirest.setHttpClient(creepyClient);

HttpResponse<JsonNode> response = Unirest.get("https://httpbin.org/get?show_env=1").asJson();
System.out.println(response.getBody().toString());

} catch (UnirestException e) {
e.printStackTrace();
}
}
}