让Volley具有https请求的功能
2016-05-03 15:18
543 查看
https简介:
- https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。
- 数字证书:一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。
- 加密和认证:加密是指通信双方为了防止铭感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的骗子,采取的确认身份的方式。只有同时进行了加密和认真才能保证通信的安全,因此在SSL通信协议中这两者都被应。
因此,这三者的关系已经十分清楚了:https依赖一种实现方式,目前通用的是SSL,数字证书是支持这种安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标准化之后产生的(TSL1.0),与SSL差别很小,后者是用于无线环境下的TSL。
在移动开发中有涉及到金钱的的网络请求的为了安全基本采用https这种非对称加密方式进行网络数据的访问和交互。Volley本身是不支持https请求,但是我们可以通过修改Volley.java来加强它自身的功能。
在具体使用中将Volley源码com.android.volley导入到自己的项目中,然后将com.android.volley.toolbox下面的Volley.java换成上面的代码,然后将私钥.ert文件放到assets目录下,然后
基本上就这样吧,如果报各种异常的话,基本就是文件找不到或者是该证书不是ca机构颁发的,不被信任。具体bug,具体百度。
- https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。
- 数字证书:一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。
- 加密和认证:加密是指通信双方为了防止铭感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的骗子,采取的确认身份的方式。只有同时进行了加密和认真才能保证通信的安全,因此在SSL通信协议中这两者都被应。
因此,这三者的关系已经十分清楚了:https依赖一种实现方式,目前通用的是SSL,数字证书是支持这种安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标准化之后产生的(TSL1.0),与SSL差别很小,后者是用于无线环境下的TSL。
在移动开发中有涉及到金钱的的网络请求的为了安全基本采用https这种非对称加密方式进行网络数据的访问和交互。Volley本身是不支持https请求,但是我们可以通过修改Volley.java来加强它自身的功能。
public class Volley { private static final String DEFAULT_CACHE_DIR = "volley"; /** * 四个参数的构造返回一个具有https请求功能的RequestQueue * * @param context * @param stack * @param selfSignedCertificate * 这个参数决定是否使用自定义签名证书 * @param fileName * 放在本地的签名证书(私钥) * @return */ public static RequestQueue newRequestQueue(Context context, HttpStack stack, boolean selfSignedCertificate, String fileName) { File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR); String userAgent = "volley/0"; try { String packageName = context.getPackageName(); PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); userAgent = packageName + "/" + info.versionCode; } catch (NameNotFoundException e) { } if (stack == null) { if (Build.VERSION.SDK_INT >= 9) { if (selfSignedCertificate) { stack = new HurlStack(null, buildSSLSocketFactory(context, fileName)); } else { stack = new HurlStack(); } } else { if (selfSignedCertificate) stack = new HttpClientStack(getHttpClient(context, fileName)); else { stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent)); } } } Network network = new BasicNetwork(stack); RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network); queue.start(); return queue; } /** * 默认不支持 * * @param context * @return 默认的构造方法去调用四个参数的构造 */ public static RequestQueue newRequestQueue(Context context) { return newRequestQueue(context, null, false, null); } private static SSLSocketFactory buildSSLSocketFactory(Context context, String fileName) { KeyStore keyStore = null; try { keyStore = buildKeyStore(context, fileName); } catch (KeyStoreException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = null; try { tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keyStore); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } SSLContext sslContext = null; try { sslContext = SSLContext.getInstance("TLS"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } try { sslContext.init(null, tmf.getTrustManagers(), null); } catch (KeyManagementException e) { e.printStackTrace(); } return sslContext.getSocketFactory(); } }
在具体使用中将Volley源码com.android.volley导入到自己的项目中,然后将com.android.volley.toolbox下面的Volley.java换成上面的代码,然后将私钥.ert文件放到assets目录下,然后
Volley.newRequestQueue(mContext, null, true, "xxx.ert")
基本上就这样吧,如果报各种异常的话,基本就是文件找不到或者是该证书不是ca机构颁发的,不被信任。具体bug,具体百度。
相关文章推荐
- HttpClient学习整理
- SELinux 环境下网络服务设置 , 配置 Apache 、Samba、NFS、vsftp 、MySQL、Bind DNS
- HTTPS与SSL
- tcp三次握手和四次挥手
- 50个网络安全工具
- 2440-NFS挂载网络共享目录,出现 nfs: server 192.168.xxx.xxx not responding, still trying的解决办法
- nginx学习笔记一(开发自己的http模块)
- c++ WlanAPI 承载网络 连接无线网络
- hHTTP协议讲解
- HttpClient工具正确使用方式
- 关于AFNetworking访问网络超时的设置
- Unity网络教程翻译(三)多人游戏大厅
- ionic/angular $http post form-data请求
- NSHTTPCookieStorage
- Cookie
- Unix网络编程 第三章 笔记
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- 没有钱该如何做好新产品的网络营销推广
- Httputils请求网络数据
- OkHttp官方教程解析-彻底入门OkHttp使用