是的,它确实。
Retrofit允许您设置自定义HTTP客户端,该客户端已根据需要进行配置。
至于自签名的SSL证书,这里有一个讨论。该链接包含一些代码示例,这些示例可将自签名的SLL添加到AndroidDefaultHttpClient
并将该客户端加载到Retrofit。
如果需要OkHttpClient
接受自签名SSL,则需要javax.net.ssl.SSLSocketFactory
通过setSslSocketFactory(SSLSocketFactory sslSocketFactory)
方法将其传递给自定义实例。
获取套接字工厂的最简单的方法是让一个从javax.net.ssl.SSLContext
所讨论这里。
这是配置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());
okhttp3的更新代码(使用生成器):
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.build();
在client
这里现在配置为从您使用证书KeyStore
。但是KeyStore
,即使系统默认情况下信任它,它也将仅信任您中的证书,而不信任其他任何证书。(如果您只有自签名证书,KeyStore
并且尝试通过HTTPS连接到Google主页,则会得到SSLHandshakeException
)。
您可以KeyStore
从文件中获取实例,如docs所示:
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;
}
如果您使用的是Android,则可以将其放入res/raw
文件夹中,并Context
使用实例从实例中获取
fis = context.getResources().openRawResource(R.raw.your_keystore_filename);
关于如何创建密钥库,有一些讨论。例如这里
defaultClient()
入Platform.java以获取更多详细信息。