问题记录:app第首次安装报SSLHandshakeException,刷新后可以请求到数据
2019-02-19 09:38
99 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/code_akuma/article/details/87687738
首次安装app是,retrofit会报出 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.导致数据请求不到。
会报这个错误可能的原因有三个:
假如是第三种原因是一直无法请求道数据的。而前两种可以使用同一种方式解决,就是在本地直接信任服务器证书。
[code] private KeyStore getKeyStore() { KeyStore keyStore = null; try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream caInput = Application.getContext().getResources().openRawResource(R.raw.trust_chain); Certificate ca; try { ca = cf.generateCertificate(caInput); Log.d("SslUtils", "ca=" + ((X509Certificate) ca).getSubjectDN()); } finally { caInput.close(); } String keyStoreType = KeyStore.getDefaultType(); keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(null, null); keyStore.setCertificateEntry("ca", ca); } catch (Exception e) { Log.e("SslUtils", "Error during getting keystore", e); } return keyStore; }
[code]public static SSLContext getSslContextForCertificateFile() { try { KeyStore keyStore = getKeyStore(); SSLContext sslContext = SSLContext.getInstance("SSL"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); return sslContext; } catch (Exception e) { String msg = "Error during creating SslContext for certificate from assets"; Log.e("SslUtils", msg, e); throw new RuntimeException(msg); } }
[code] SSLContext sslContext = getSslContextForCertificateFile(); TrustManagerFactory trustManagerFactory = null; try { trustManagerFactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); } X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; okHttpClient = new OkHttpClient().newBuilder() .addInterceptor(httpLoggingInterceptor) .addInterceptor(receiveCookieInterceptor) .addInterceptor(addCookieInterceptor) .sslSocketFactory(sslContext.getSocketFactory(), trustManager) .connectTimeout(Constants.TIME_OUT, TimeUnit.MILLISECONDS) .readTimeout(Constants.TIME_OUT, TimeUnit.MILLISECONDS) .writeTimeout(Constants.TIME_OUT, TimeUnit.MILLISECONDS) .build();
参考资料:https://developer.android.google.cn/training/articles/security-ssl#SelfSigned
相关文章推荐
- 记一次因证书问题导致请求失败问题SSLHandshakeException
- Ajax中数据请求结果不刷新问题
- iOS企业发布问题记录二(企业版app在iOS8上无法安装的几个问题解决)
- 在mysql 安装后可以启动 bin-log 功能,以记录数据库的数据操作的记录,必要时候恢复数据,
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
- HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关
- 爬数据出现错误javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
- jquery ajax多次请求数据时 不刷新问题的解决方法
- iOS新机首次安装 app,请求网络权限“是否允许使用数据”
- iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”
- 记录问题:登录session过期,ajax请求被web security拦截,页面没有数据且没有重定向到login页面
- 用oralce连接.net客户端出现问题:“数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,”的解决办法
- 【Android问题记录】为什么在终端直接查询数据库可以查到数据但是用代码总是查不到
- 解决“找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题
- iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)
- iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”
- 关于ionic app $http.get()无法请求,导致页面没有数据的问题
- 【.net】DbProviderFactories找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题
- 用oralce连接.net客户端出现问题:“数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组