/ / SSLPeerUnverifiedException (Unirest) - java, https, ssl-сертифікат, unirest

SSLPeerUnverifiedException (Unirest) - Java, HTTPS, SSL-сертифікат

Я новачок у спілкуванні з API (як офіційними, так і неофіційними), і я використовую один з них JavaSnap. Я обходився з дуже базовою реалізацією прикладу коду, але працював на помилки.

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

По-перше, я зіткнувся з завантаженнями помилок ClassNotFoundі треба було продовжувати завантажувати модулі apache (commons, httpcomponents і т.д.), щоб програма могла прогресувати, але, будучи файлами класів, це означало, що я не міг "побачити відразу, які модулі мені потрібно завантажити. як неправильно я роблю щось вільне.

У будь-якому випадку, тепер очистивши всі винятки ClassNotFound (сподіваюся), я отримую таке виключення:

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)

Як я розумію, це тому, що мені потрібнодозволити довіряти всім сертифікатам, однак для цього я вважаю, що мені потрібно використовувати HostNameVerifiers з SSLSocketFactorys, але я дійсно не можу починати з цим заплутатися, оскільки у мене є лише джерело для JavaSnap API, і відстеження помилки стек найновішим методом, доступним для редагування, є такий:

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;

Моє питання полягає в тому, що я дійсно на правильних лініях з моїм мисленням?
Якщо я можу досягти своєї мети усунення цієї помилки / довіри сертифікатів? Якщо я не знаю, що насправді проблема?

Дуже дякую

Відповіді:

1 для відповіді № 1

Я відповім на це старе питання, щоб запам'ятати свій пошук рішення про помилку сертифіката - це комбінація з декількох місць


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();
}
}
}