安卓与HTTPS
来源:互联网 发布:电脑找不到wifi网络 编辑:程序博客网 时间:2024/05/16 15:23
公司的项目,出于安全考虑,使用https的方式来交互数据。这段时间也是被https折磨了一下,以一个新手的角度记录下Android下https的相关东西。
首先,https是需要证书才能访问到的,对于开发者来说,这个证书后台会提供的。拿到证书之后,网络请求要加上这个证书的信息有两种方式:
1、第一种就是把证书文件放置在assets下面,然后在Application的onCreate方法内加上如下代码来读取且设置证书
try { OkHttpClientManager.getInstance().setCertificates(getAssets().open("abc.cer"));} catch (IOException e) { e.printStackTrace();}这里网络请求使用的是OkHttp,“abc.cer”是证书的名字,setCertificates方法如下:
public void setCertificates(InputStream... certificates) { try { CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null); int index = 0; for (InputStream certificate : certificates) { String certificateAlias = Integer.toString(index++); keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate)); try { if (certificate != null) certificate.close(); } catch (IOException e) { } } SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); sslContext.init( null, trustManagerFactory.getTrustManagers(), new SecureRandom() ); mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); }}2、如果不想放证书进入,可以读取出来证书的内容,然后用如下方式
final String CER_XXX = "aaaaaa"; // 证书内容try { OkHttpClientManager.getInstance().setCertificates(new Buffer() .writeUtf8(CER_XXX) .inputStream());} catch (IOException e) { e.printStackTrace();}
正常情况下,使用以上任意一种方式之后,就能请求到https接口的数据了。但是作为新手总是会遇到坑... 笔者就发现,测试环境的https完全正常,但是正式环境的https却访问不到数据了,证书当然是正确的,那么是为什么呢?
原来,大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败。解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复杂一些,很容易出错;另一种办法是让httpclient信任所有的服务器证书,这种办法相对来说简单很多,但安全性则差一些,但在某些场合下有一定的应用场景。
好吧,笔者还是选择后者好了,在加了如下代码信任所有服务器证书之后,问题解决。
mOkHttpClient.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; }});
0 0
- 安卓与HTTPS
- 安卓 https 证书校验
- 安卓HTTPS操作工具类
- 安卓访问Https的主要实现
- 安卓使用https进行网络访问
- 安卓的https协议请求Demo
- charles解决安卓https抓包乱码
- 安卓自动更新,update支持http和https
- https 浅析及在安卓中的使用
- 安卓app https抓包之burpsuite
- QT与安卓
- 安卓开发-安卓与sqlite
- 安卓软件与论坛
- 安卓与java选择
- 安卓----fragment与动画
- 安卓与servlet交互
- 安卓 NDK与JNI
- 安卓 文件与缓存
- 使用C++标准模板库,实现绝对值排序
- 欢迎使用CSDN-markdown编辑器
- 网络:YYModel 使用(JSON到模型的转换)
- dede获取上级栏目名称
- C++ 设计模式 —— 控制器设计模式(实现功能模块间通信)
- 安卓与HTTPS
- oracle用户默认表空间
- MySQL安装未响应解决方法
- 为什么奇艺要把 iPad 客户端上的 MP4 流改为 TS 流呢?TS 相对于 MP4 有什么优势呢?
- 一次配置OPENCV2.4.11+VS2010
- 花生米问题(二)
- SuperMap
- spring+mybatis的注解事物 失效问题
- android官方实现Tab(二)