Как заставить библиотеку Ion доверять самоподписанным сертификатам
Я пытаюсь подключиться к службе REST, которая должна использовать самозаверяющие сертификаты (это интерфейс веб-служб Unify PBX). Система регенерирует свои сертификаты на обновления программного обеспечения, и если вы не загрузите сертификат в систему, он всегда будет самоподписанным. При попытке соединения с ion соединение закрывается из-за самозаверяющего сертификата (насколько гугл меня взял...). Что мне нужно добавить в мою реализацию, чтобы я мог принять этот сертификат? Я использую ион следующим образом.
Ion.with(context)
.load(...)
.asString()
.setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
}
});
1 ответ
Вы можете указать пользовательские контексты SSL и диспетчеры доверия для использования самозаверяющих сертификатов.
Вот пример из юнит-теста:
public void testKeys() throws Exception {
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(getContext().getResources().openRawResource(R.raw.keystore), "storepass".toCharArray());
kmf.init(ks, "storepass".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
ts.load(getContext().getResources().openRawResource(R.raw.keystore), "storepass".toCharArray());
tmf.init(ts);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
AsyncHttpServer httpServer = new AsyncHttpServer();
httpServer.listenSecure(8888, sslContext);
httpServer.get("/", new HttpServerRequestCallback() {
@Override
public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
response.send("hello");
}
});
Thread.sleep(1000);
AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setSSLContext(sslContext);
AsyncHttpClient.getDefaultInstance().getSSLSocketMiddleware().setTrustManagers(tmf.getTrustManagers());
AsyncHttpClient.getDefaultInstance().executeString(new AsyncHttpGet("https://localhost:8888/"), null).get();
}
Вам нужно будет получить доступ к базовому экземпляру http-клиента ion следующим образом:
Ion.getDefault(getContext()).getHttpClient().getSSLSocketMiddleware().setTrustManagers(...);
Ion.getDefault(getContext()).getHttpClient().getSSLSocketMiddleware().setSSLContext(...);
Ключ - это магазин ключей BKS, надувной замок.