我发现android 4不能很好地与ssl配合使用,当尝试通过https与api联系时会导致崩溃
javax.net.ssl.SSLException:SSL握手中止:ssl = 0xb8dbad20:系统调用期间I / O错误,对等方重置连接
这是我从其他类似问题中尝试过的方法:
if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {
try {
Logger.e("under lolipop");
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
client.sslSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
Logger.e("HTTPS"+ e.getMessage() );
}
}
哪个没有影响结果
还有
if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {
try {
client.sslSocketFactory(new TLSSocketFactory(), (X509TrustManager)trustAllCerts[0])
.build();
Logger.e("SETUP TRUST SSL");
return client.build();
} catch (KeyManagementException e) {
Logger.e("SETUP TRUST SSL Failed "+e.getMessage());
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
Logger.e("SETUP TRUST SSL Failed "+e.getMessage());
e.printStackTrace();
}
}
return client.build();
}
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[0];
}
} };
此代码给出了另一个错误:
java.security.cert.CertPathValidatorException:找不到证书路径的信任锚。
反正有解决此问题的方法,我必须支持android 4并使用https
任何帮助都可以!
答案 0 :(得分:10)
前一段时间,当我们的后端放弃了对TLS 1.0和1.1的支持时,我在Android 4.4上遇到了类似的问题。我通过使用Google Play服务ProviderInstaller安装新的安全提供程序来解决此问题。
在您的应用gradle.build文件中添加
implementation "com.google.android.gms:play-services-auth:16.0.1"
在启动活动时尽早致电ProviderInstaller.installIfNeeded()
。这是尝试安装提供程序的示例方法:
private static void installGooglePlayServicesProvider(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //Devices with Android 5.1+ should support TLS 1.x out of the box
try {
ProviderInstaller.installIfNeeded(context);
} catch (GooglePlayServicesRepairableException e) {
Log.e("ProviderInstaller", "Google Play Services is out of date!", e);
GoogleApiAvailability.getInstance().showErrorNotification(context, e.getConnectionStatusCode());
} catch (GooglePlayServicesNotAvailableException e) {
Log.e("ProviderInstaller", "Google Play Services is unavailable!", e);
}
}
}
有关ProviderInstaller的更多信息,请参见Goolge开发人员页面: Patch the security provider with ProviderInstaller
使用TLS 1.2时,您可能必须强制在某些设备上启用支持。
看一下下面的acticle及其Tls12SocketFactory
的实现:Working with TLS 1.2 on Android 4.4 and Lower
答案 1 :(得分:0)
Okhttp 3.13.x放弃了对TLS1.2及以下版本的支持,仅支持Android API 21+。您必须将Okhttp 3.12.x版本分支用于Android 4.x设备。
更多here