是的,它确实。
Retrofit 允许您设置自定义 HTTP 客户端,该客户端已根据您的需要进行配置。
至于自签名 SSL 证书,这里有一个讨论。该链接包含将自签名 SSL 添加到 AndroidDefaultHttpClient
并将此客户端加载到 Retrofit 的代码示例。
如果您需要OkHttpClient
接受自签名 SSL,则需要javax.net.ssl.SSLSocketFactory
通过方法传递自定义实例setSslSocketFactory(SSLSocketFactory sslSocketFactory)
。
获取套接字工厂的最简单方法是从javax.net.ssl.SSLContext
此处获取。
下面是一个配置 OkHttpClient 的示例:
OkHttpClient client = new OkHttpClient();
KeyStore keyStore = readKeyStore(); //your method to obtain KeyStore
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 的代码(使用 builder):
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());
// get user password and file input stream
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);
关于如何创建密钥库有几个讨论。例如这里