现在大部分企业或者说项目都已经开始使用HTTPS替代HTTP了,但是在项目上线以后,会遇到大量的SSLHandshakeException异常,而且只有Android 5.0以下版本才会发生,5.0以上是好的。
通过查找Android Google官方文档,SSL/TLS协议对应Android系统版本情况如下:
按照Google官方文档,Android API 16+是默认开启TLSv1.1,TLSv1.2的,但是这就像Google起的SingleTask这个名字一样荒谬,现实残酷,事实上API 20+才默认开启。Android 5.0以下默认不开起 TLS1.1和TLS1.2.因此可以采取以下方案给予解决
SSLSocketFactory noSSLv3Factory;
if(Build.VERSION.SDK_INT
对于4.4以下的系统,使用自定义的TLSSocketFactory,开启对TLS1.1和TLS1.2的支持,核心代码:
publicclassTLSSocketFactoryextendsSSLSocketFactory{
privateSSLSocketFactory internalSSLSocketFactory;
publicTLSSocketFactory()throwsKeyManagementException, NoSuchAlgorithmException{ SSLContext context = SSLContext.getInstance("TLS"); context.init(null,null,null); internalSSLSocketFactory = context.getSocketFactory(); }
publicTLSSocketFactory(SSLSocketFactory delegate)throwsKeyManagementException, NoSuchAlgorithmException{ internalSSLSocketFactory = delegate; } ......
@OverridepublicSocketcreateSocket(InetAddress address,intport, InetAddress localAddress,intlocalPort)throwsIOException{
returnenableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); }
// 开启对TLS1.1和TLS1.2的支持privateSocketenableTLSOnSocket(Socket socket){
if(socket !=null&& (socketinstanceofSSLSocket)) { ((SSLSocket)socket).setEnabledProtocols(newString[] {"TLSv1.1","TLSv1.2"}); }
returnsocket; }}
如果小伙伴们线上这个异常已经起飞,可以试一试,上车吧~~~
领取专属 10元无门槛券
私享最新 技术干货