Android中进行https请求信任证书问题(效率解决,小白适用)
2017-01-19 12:50
507 查看
前言
Volley 框架信任所有https证书
基于Okhttpclient信任https所有证书
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
举个栗子
送上代码
举个栗子
送上代码
Volley 框架信任所有https证书
基于Okhttpclient信任https所有证书
前言
在Android开发项目中难免要进行https请求,如果你也遇到这样的问题,那么我想这片博客能对你有些帮助。
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
这个异常指的是找不到指定的信任证书。为了避免本地一个一个添加证书的麻烦,尤其是在测试情况下。可以通过一定方法去信任所有证书,免去麻烦。 注:这个方法虽然省事,但是缺乏安全性,使用前自行考虑。另外,本文所有方法并非自己研究所得,我只是个搬运工,为一些新人们提供方法,也给自己留作笔记.
Volley 框架信任所有https证书
关于Volley的使用在此不做介绍。 信任所有证书,只有两个简单的步骤: 1.复制粘贴一个工具类,该类源自网络,针对HttpsURLConnection证书信任问题。 2.在进行联网请求前调用该类allowAllSSL()方法
举个栗子
//在进行联网请求前调用该类allowAllSSL()方法 FakeX509TrustManager.allowAllSSL(); queue = Volley.newRequestQueue(context); //封装请求省略 queue.add(request);
送上代码
import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * Created by Yangmu on 16/12/16. */ public class FakeX509TrustManager implements X509TrustManager { private static TrustManager[] trustManagers; private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {}; @Override public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { //To change body of implemented methods use File | Settings | File Templates. } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException { //To change body of implemented methods use File | Settings | File Templates. } public boolean isClientTrusted(X509Certificate[] chain) { return true; } public boolean isServerTrusted(X509Certificate[] chain) { return true; } @Override public X509Certificate[] getAcceptedIssuers() { return _AcceptedIssuers; } public static void allowAllSSL() { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { // TODO Auto-generated method stub return true; } }); SSLContext context = null; if (trustManagers == null) { trustManagers = new TrustManager[] { new FakeX509TrustManager() }; } try { context = SSLContext.getInstance("TLS"); context.init(null, trustManagers, new SecureRandom()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); } }
基于Okhttpclient信任https所有证书
关于Okhttpclient的使用在此依然不做介绍。 只有两个简单的步骤: 1.复制粘贴工具类,针对Okhttpclient证书信任问题。(方法还是源自网络,自行整理) 2.初始化OkHttpClient对象时进行信任证书的操作 注意:是基于Okhttpclient,也就是说类似Square公司非常好用的Retrofit的library也能使用。
举个栗子
//初始化OkHttpClient对象时进行信任证书的操作 OkHttpClient.Builder mBuilder = new OkHttpClient.Builder(); mBuilder.sslSocketFactory(TrustAllCerts.createSSLSocketFactory()); mBuilder.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier()); client = mBuilder.build();
送上代码
import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * Created by Yangmu on 17/1/19. */ public class TrustAllCerts implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];} public static SSLSocketFactory createSSLSocketFactory() { SSLSocketFactory ssfFactory = null; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[] { new TrustAllCerts() }, new SecureRandom()); ssfFactory = sc.getSocketFactory(); } catch (Exception e) { } return ssfFactory; } public static class TrustAllHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } } }
关于使用方法就是这么easy,有兴趣可以研究下https证书相关模块。
相关文章推荐
- Android中进行https请求信任证书问题
- Android 7.0解决抓取不到https请求的问题
- BlueCoat SG设备对非标准HTTPS应用访问提示不可信任发行者证书问题解决
- 新浪微博请求数据出错(Android Volley Https证书不信任)的解决方案
- react native 使用fetch进行网络请求(https),解决SSLHandshake问题,以及怎样进行二次封装
- Android 7.0解决抓取不到https请求的问题
- 解决GoAgent打开https网站SSL证书错误 (安全证书不受信任)问题
- Android-OKhttp解决https安全链接请求问题
- Java进行https请求需要证书的问题 unable to find valid certification path to requested target
- java开发https请求ssl不受信任问题解决方法
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- Android _实现SSL解决不受信任的证书问题
- 关于android使用okhttpUtils使用请求https请求证书签名问题
- https p12证书请求解决问题过程
- Android https 证书信任问题
- 如何使用自定义证书解决postman请求https不了问题!
- Android 使用自带的HttpClient进行https请求出现403的解决过程记录
- Android _实现SSL解决不受信任的证书问题
- Android网络编程——https 不验证证书方式(信任所有证书)
- Android 编程下引入第三方jar包进行代码混淆时的问题解决