我正在使用com.loopj.android:android-async-http:1.4.9
作爲我對服務器的請求。它工作正常,直到我的服務器需要SSL/TLS。所以我需要修改我的AsyncHTTPClient
以在所有網址中使用HTTPS。安裝AsyncHttpClient以使用HTTPS
我檢查了這個相似的how to make HTTPS calls using 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();
正如你可以在最後一行看到,它提供了從javax.net.ssl
包的SSLSocketFactory
。然而,AsyncHTTPClient
實例需要
asyncHTTPClient.setSSLSocketFactory(cz.msebera.android.httpclient.conn.ssl.SSLSocketFactory)
編輯:
我的服務器使用的是自簽名證書。
您是否找到了一個好的解決方案?我有點失落 –
看起來像@ Prerak的解決方案下面的作品。我也會添加我自己的版本。謝謝。 – user1506104