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 DefaultHttpClient
und zum Laden dieses Clients in Retrofit.
Wenn Sie OkHttpClient
selbstsigniertes SSL akzeptieren müssen, müssen Sie die benutzerdefinierte javax.net.ssl.SSLSocketFactory
Instanz über die setSslSocketFactory(SSLSocketFactory sslSocketFactory)
Methode übergeben.
Die einfachste Methode, um eine Sockelfabrik zu erhalten, besteht darin, eine javax.net.ssl.SSLContext
wie 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 client
hier ist jetzt so konfiguriert, dass Zertifikate von Ihrem verwendet werden KeyStore
. Es vertraut jedoch nur den Zertifikaten in Ihrem KeyStore
und 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 KeyStore
Instanz 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/raw
Ordner legen und von einer Context
Instanz 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 .