Ja tut es.
Mit Retrofit können Sie Ihren benutzerdefinierten HTTP-Client einstellen, der Ihren Anforderungen entsprechend konfiguriert ist.
Für selbstsignierte SSL-Zertifikate wird hier diskutiert . Der Link enthält Codebeispiele zum Hinzufügen selbstsignierter SLL zu Android DefaultHttpClientund zum Laden dieses Clients in Retrofit.
Wenn Sie OkHttpClientselbstsigniertes SSL akzeptieren müssen, müssen Sie die benutzerdefinierte javax.net.ssl.SSLSocketFactoryInstanz über die setSslSocketFactory(SSLSocketFactory sslSocketFactory)Methode übergeben.
Die einfachste Methode, um eine Sockelfabrik zu erhalten, besteht darin, eine javax.net.ssl.SSLContextwie hier beschrieben zu beziehen .
Hier ist ein Beispiel für die Konfiguration von OkHttpClient:
OkHttpClient client = new OkHttpClient();
KeyStore keyStore = readKeyStore();
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(),trustManagerFactory.getTrustManagers(), new SecureRandom());
client.setSslSocketFactory(sslContext.getSocketFactory());
Aktualisierter Code für okhttp3 (mit Builder):
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.build();
Das clienthier ist jetzt so konfiguriert, dass Zertifikate von Ihrem verwendet werden KeyStore. Es vertraut jedoch nur den Zertifikaten in Ihrem KeyStoreund nichts anderem, selbst wenn Ihr System ihnen standardmäßig vertraut. (Wenn Sie nur selbstsignierte Zertifikate in Ihrem haben KeyStore und versuchen, über HTTPS eine Verbindung zur Google-Hauptseite herzustellen, erhalten Sie SSLHandshakeException).
Sie können die KeyStoreInstanz aus einer Datei abrufen, wie in den Dokumenten gezeigt :
KeyStore readKeyStore() {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
char[] password = getPassword();
java.io.FileInputStream fis = null;
try {
fis = new java.io.FileInputStream("keyStoreName");
ks.load(fis, password);
} finally {
if (fis != null) {
fis.close();
}
}
return ks;
}
Wenn Sie auf Android sind, können Sie es in einen res/rawOrdner legen und von einer ContextInstanz mit abrufen
fis = context.getResources().openRawResource(R.raw.your_keystore_filename);
Es gibt verschiedene Diskussionen zum Erstellen Ihres Keystores. Zum Beispiel hier
defaultClient()in Platform.java .