Я использую com.loopj.android:android-async-http:1.4.9
для моего запроса на сервер. Он работал нормально до тех пор, пока я не получу SSL/TLS на моем сервере. Поэтому мне нужно изменить мой AsyncHTTPClient
, чтобы использовать HTTPS во всех URL-адресах.
Я проверил эту аналогичную как делать вызовы HTTPS с использованием AsyncHttpClient?, но не дал четкого решения проблемы. Принятое решение также не было безопасным из-за этого предупреждения из самой библиотеки:
Внимание! Это исключает проверку сертификатов SSL на каждом устройстве, использование с осторожностью.
Итак, я продолжил изучение других решений. Я закончил с рекомендацией: https://developer.android.com/training/articles/security-ssl.html. Таким образом, у меня есть что-то похожее на это:
// Load CAs from an InputStream
// (could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
// Get SocketFactory from our SSLContext
//
// !!!PROBLEM IS HERE!!!
//
javax.net.ssl.SSLSocketFactory socketFactory = context.getSocketFactory();
Как вы можете видеть в последней строке, он дает пакет SSLSocketFactory
from javax.net.ssl
. Однако для экземпляра AsyncHTTPClient
требуется
asyncHTTPClient.setSSLSocketFactory(cz.msebera.android.httpclient.conn.ssl.SSLSocketFactory)
EDIT:
Мой сервер использует самозаверяющий сертификат.