1. 问题
碰到这个问题是我们公司用的是https,证书是赛门铁克的证书是tls1.2,然后我用的是okhttp,然后在android5.0以上没问题,请求都是可以的,但是在android5.0以下,连登陆都登不进,也不闪退,点击登陆没反应,然后报如上的异常,后面各种查资料,终于找到靠谱的,其中很多人其实都不知道,在瞎说。最权威的解释在这里
httpsTLS,真心感谢这位博主。
2. 原因
其实导致出现这样的原因是,后台使用的证书TLS版本过高,如果后台原因使用低版本的tls比如1.0则我们移动端这边不用改,但是估计不现实,所以对于android5.0以下的我们要手动打开tls1.1或者tls1.2的支持,因为他们是默认关闭的。只有android5.0以上才是默认打开的。
3. 解决
再说一遍,我使用的是okhttp,所以其他网络请求框架怎样解决我也没查到。根据上面那位大神的博文,创建HttpUtil类,注意okhttp一般都有自己的HttpUtils,所以这里要注意,同时看好导包种类,继承SSLSocketFactory写出自己的Tls12SocketFactory.。代码如下
package com.wly_android.frame;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* Created by ${GuoZhaoHui} on 2016/12/30.
* Abstract:
*/
public class HttpsUtil {
public static class SSLParams
{
public SSLSocketFactory sSLSocketFactory;
public X509TrustManager trustManager;
}
public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password)
{
SSLParams sslParams = new SSLParams();
try
{
TrustManager[] trustManagers = prepareTrustManager(certificates);
KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
SSLContext