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

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

Eu sou novo em brincar com APIs (tanto oficiais como não oficiais) e estou usando um chamado JavaSnap. Eu tenho andado por aí com uma implementação muito básica do código de exemplo, mas tenho incorrido em erros. Aqui está o código básico:

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

Em primeiro lugar, encontrei vários erros de ClassNotFounde tive que continuar baixando módulos do apache (commons, httpcomponents etc.) para permitir que o programa progredisse, mas sendo arquivos de classe isso significava que eu não podia ver de uma vez quais módulos eu precisava baixar. Então, se alguém quiser me dizer como estou fazendo algo errado.

De qualquer forma, agora tendo esclarecido todas as exceções ClassNotFound (espero), estou recebendo a seguinte exceção:

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)

Pelo que entendi, isso é porque eu precisopermitir confiar em todos os certificados, no entanto para fazer isso eu acredito que eu preciso usar HostNameVerifiers com SSLSocketFactorys, mas eu realmente não posso começar a mexer com isso como eu só tenho a fonte para o JavaSnap API e rastreando o erro até o empilhar o método mais recente disponível para eu editar é isto:

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;

Minha pergunta é: estou realmente no caminho certo com o meu pensamento?
Se eu sou, como posso alcançar meu objetivo de eliminar este erro / confiar em certificados? Se eu não sou o que de fato é o problema?

Muito obrigado

Respostas:

1 para resposta № 1

Eu respondo essa velha pergunta para lembrar minha busca a solução de erro de certificado é uma combinação de alguns 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();
}
}
}