我在Android应用中使用Retrofit。当我使用“https://example.com”作为基本网址发出请求时,它可以正常工作。但是,当我使用“https://www.example.com”作为基本URL发出请求时,它会给出SSLHandshakeException。我不明白为什么会这样。
答案 0 :(得分:1)
我用它与2.2.0
创建不验证证书链的信任管理器
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.interceptors().add(httpLoggingInterceptor);
client.readTimeout(180, TimeUnit.SECONDS);
client.connectTimeout(180, TimeUnit.SECONDS);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "keystore_pass".toCharArray());
sslContext.init(null, trustAllCerts, new SecureRandom());
client.sslSocketFactory(sslContext.getSocketFactory())
.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Common.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client.build())
.build();
serviceApi = retrofit.create(Api.class);
感谢希望这会对你有所帮助。有时ssl 1.2或更低版本也没有安装在服务器端。
答案 1 :(得分:0)
OkHttp已删除对过时HTTPS配置的支持 您尝试达到需要更新的主机。
如果您不想这样做,可以在OkHttp
中配置密码套件和TLS版本以支持这个过时的服务器。
根据我的理解,这将确保使用所有重叠的CipherSuite。以下是我在不同Android版本上测试的结果:
OkHttp 2.3.0
5.1 - 工作
5.0 - 工作
4.4.4 - 错误
4.3 - 错误
4.2.2 - 错误
4.1.1 - 错误
4.0 - 错误
OkHttp 2.2.0
5.1 - 工作
5.0 - 工作
4.4.4 - 工作
4.3 - 工作
4.2.2 - 工作
4.1.1 - 工作
4.0 - 错误