Android 4.x 在 https 协议下无法利用 okhttp 进行网络访问的临时解决办法
来源:互联网 发布:java 时间戳 编辑:程序博客网 时间:2024/05/18 07:53
最近公司项目迁移了服务器,同样的也由http变成了https协议。不过调试的时候发现4.x的设备都无法进行访问网络了,5.0及以上的设备没有遇到问题。百度许久未果,在谷歌爸爸上找到了答案。
原文地址:https://github.com/square/okhttp/issues/2372
解决方法如下:
1.添加以下内容的Tls12SocketFactory.java
类
import java.io.IOException;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import javax.net.ssl.SSLSocket;import javax.net.ssl.SSLSocketFactory;/** * Enables TLS v1.2 when creating SSLSockets. * <p/> * For some reason, android supports TLS v1.2 from API 16, but enables it by * default only from API 20. * @link https://developer.android.com/reference/javax/net/ssl/SSLSocket.html * @see SSLSocketFactory */public class Tls12SocketFactory extends SSLSocketFactory { private static final String[] TLS_V12_ONLY = {"TLSv1.2"}; final SSLSocketFactory delegate; public Tls12SocketFactory(SSLSocketFactory base) { this.delegate = base; } @Override public String[] getDefaultCipherSuites() { return delegate.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { return delegate.getSupportedCipherSuites(); } @Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return patch(delegate.createSocket(s, host, port, autoClose)); } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return patch(delegate.createSocket(host, port)); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { return patch(delegate.createSocket(host, port, localHost, localPort)); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { return patch(delegate.createSocket(host, port)); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return patch(delegate.createSocket(address, port, localAddress, localPort)); } private Socket patch(Socket s) { if (s instanceof SSLSocket) { ((SSLSocket) s).setEnabledProtocols(TLS_V12_ONLY); } return s; }}
2.在代码中添加下面的方法
public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) { if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) { try { SSLContext sc = SSLContext.getInstance("TLSv1.2"); sc.init(null, null, null); client.sslSocketFactory(new Tls12SocketFactory(sc.getSocketFactory())); ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_2) .build(); List<ConnectionSpec> specs = new ArrayList<>(); specs.add(cs); specs.add(ConnectionSpec.COMPATIBLE_TLS); specs.add(ConnectionSpec.CLEARTEXT); client.connectionSpecs(specs); } catch (Exception exc) { Log.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc); } } return client;}
3.最后在实例化okhttp客户端的时候,作类似如下的处理
private OkHttpClient getNewHttpClient() { OkHttpClient.Builder client = new OkHttpClient.Builder() .followRedirects(true) .followSslRedirects(true) .retryOnConnectionFailure(true) .cache(null) .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS); return enableTls12OnPreLollipop(client).build();}
采用了上面的方法后,4.x的设备也可以正常的进行网络访问了,不过又遇到了新的坑。在4.x下,第三方的图片加载框架,无论是glide还是imageloader,都无法正常加载。看来这是网站配置证书的问题,毕竟用的是免费证书,遇到问题也不足为怪了。
0 0
- Android 4.x 在 https 协议下无法利用 okhttp 进行网络访问的临时解决办法
- 在IE8中无法在https协议下显示图片的解决办法
- okhttp实现https访问,支持Android 4.X系统https访问
- Android解决okhttpUtils框架无法在4.4.4以下系统访问https协议的问题
- Android 中从4.0以后无法在主线程访问网络的解决办法。
- 使用OKHttp进行网络访问
- Android 网络--Volley+OkHttp+Https
- Android 网络: Volley+OkHttp+Https
- Android中进行基于 HTTP协议的网络访问
- Android中进行基于HTTP协议的网络访问基础
- NAT模式下,虚机静态ip无法连网络的临时解决办法
- 使用OkHttp访问ssl(https)网络
- HTTPS 网络安全传输协议下的访问
- Android使用OkHttp访问自签名证书的Https接口
- android如何用okhttp进行https的交互
- Android之HttpsURLConnection访问网络(android https协议)
- ubuntu 在虚拟机环境下显示联网但无法连接外网的解决办法(利用虚拟网络编辑器)
- Android 网络--我是怎么做的: Volley+OkHttp+Https
- 中华数据库与运维大会2017 众多大咖嘉宾名单披露!
- Android 数据结构以及常用的算法
- 箭头函数
- POJ 3069 Saruman's Army (贪心)
- HTML5使用manifest缓存
- Android 4.x 在 https 协议下无法利用 okhttp 进行网络访问的临时解决办法
- 快速理解工厂类模式
- AndroidStudio签名打包爬坑记
- SVN服务器的本地搭建和使用(一)
- SVN服务器搭建和使用(二)
- ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常
- Linux下的SVN服务器搭建
- javaFX与spring整合方法
- SVN服务器搭建和使用(三)