Volley的Https请求

前提:volley框架的jar,服务端ssl证书文件(crt,cet,pem格式等)

如果没有volley,我们可以通过git clone下来。地址:

https://android.googlesource.com/platform/frameworks/volley

我们再来看看volley提供的demo源码:

git://github.com/ogrebgr/android_volley_examples.git

把demo源码中的toolsbox下的一些通用类复制到自己项目下,包括:

SslHttpClient.java,SslSocketFactory.java,SsX509TrustManager.java,ExtHttpClientStack.java

还要把libs目录下的khandroid-httpclient-4.2.3.jar复制到自己项目的libs下并且引用

demo源码中包含了一个Https的例子,非常简单:

// ReplaceR.raw.test with your keystore
InputStream keyStore =getResources().openRawResource(R.raw.test);

// Usually getting the request queueshall be in singleton like in {@see Act_SimpleRequest}
// Current approach is used just for brevity
RequestQueue queue = Volley
        .newRequestQueue(Act_SsSslHttpClient.this,
                         new ExtHttpClientStack(new SslHttpClient(keyStore,"test123", 44401)));

StringRequest myReq = new StringRequest(Method.GET,
                                        "https://ave.bolyartech.com:44401/https_test.html",
                                       createMyReqSuccessListener(),
                                       createMyReqErrorListener());

在这个代码中可以看到,需要一个加密过的证书(在demo的raw目录下的一个bks文件)和这个加密密码,还有服务端提供的https的端口号。

下面我们来看怎么生成这个加密过的证书文件。

1.    首先,需要一个加密工具Bouncy Castle,下载地址:

http://www.bouncycastle.org/latest_releases.html

在SIGNED JAR FILES下面选择对应的jar包来下载,要对应电脑所安装的jdk的版本。在这里,我使用的是bcprov-jdk15on-152.jar

2.    为了方便,把服务端的ssl证书文件和这个jar包放在同一个目录,打开终端(windows下打开cmd),输入下面的代码:

keytool -importcert -v -trustcacerts -file "server_cert.crt(服务端SSL证书文件名+后缀名)" -alias 你的app包名 -keystore "my.bks(目标生成的bks文件,文件名称随便取,后缀名为bks)" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath"bcprov-jdk15on-152.jar" -storetype
BKS

过一会终端会提示输入密码,这个是加密证书的密码,我们代码中需要用到,切记这个密码,不然又要重新操作。输入两次密码结束,终端继续问,是否信任此证书,输入:y,然后回车,加密证书就生成完毕。

3.    然后把这个生成出来的my.bks放在自己项目的raw目录下,再把volley demo的https的例子代码复制过去,修改加密证书的名字和密码就可以跑了。还需要注意的是,请求的url必须是域名而不是服务器的ip地址。

但是有一个问题,通常我们测试都是在测试环境下进行,而SSL证书跟域名是绑定的。这个时候我们还需要用到模拟器,修改模拟器的hosts。模拟器的host位于/system/etc目录下。首先要把这个hosts pull出来,然后我们修改这个文件,例如加一行 192.168.232.12  www.hicsg.com,然后保存。

如果这个时候直接把修改好的hosts push回去,可能会出现out for memery的错误。这个时候,我们需要关闭模拟器,然后打开终端,输入:

emulator -avd Nexus_4_Edited_API_17(这里是模拟器的名称)-partition-size 1024

此时,终端会自动启动一个新的模拟器,并且按照内存是1024MB来执行。启动成功,还需要新启动一个终端,输入:

root remount

否则会报错,原因没有root权限。

root完了,才可以把修改好的hosts push进去。push 成功后,运行我们自己的项目就可以调试https的请求了。

注意:这样的修改模拟器的hosts只是临时的,当模拟器被关闭了,重新再次被启动,模拟器会还原为默认状态,hosts还是原来的。

实验证明:对于android来说,如果服务端没有做ssl证书的双重验证,其实不管你用什么服务端的ssl证书来加密都可以直接跑通自己服务器的https请求。

参考文章:

http://ogrelab.ikratko.com/using-android-volley-with-self-signed-certificate/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 15:05:06

Volley的Https请求的相关文章

Google Volley框架之https请求

先插一句.Google出的volley框架本身是支持https请求的,可是仅仅是针对有第三方机构认证过的. 假设自己随便在网上搞的一个证书,那volley是不支持请求的. 本文讲下怎样让volley支持自己搞的https证书. 改动volley源代码:com.android.myvolley.toolbox.HurlStack /** * Create an {@link HttpURLConnection} for the specified {@code url}. */ protected

Volley框架支持HTTPS请求。

第一次写帖子,嘿嘿. 最近了解到google2013IO大会出了个网络框架,正好项目也需要用到,就看了下. 最后发现接口都是HTTPS的,但是Volley默认是不支持HTTPS,网上找了好久,都没有对Volley HTTPS请求做解答. 所以分享下心得. bvin大神已经分析框架的帖子 在下面的传送: 谷歌Volley网络框架讲解——第一篇 谷歌Volley网络框架讲解——Network及其实现类 谷歌Volley网络框架讲解——网络枢纽 谷歌Volley网络框架讲解——HttpStack及其实

python——请求服务器(http请求和https请求)

一.http请求 1.http请求方式:get和post get一般用于获取/查询资源信息,在浏览器中直接输入url+请求参数点击enter之后连接成功服务器就能获取到的内容,post请求一般用于更新资源,通过form表单或者json.xml等其他形式提交给服务器端,然后等待服务器端给返回一个结果的方式(这个返回结果一般就是被修改之后的是否成功的状态,或者是修改后的最新数据table等). http请求,不论是get还是post请求,都会包含几个部分,分别是header,cookie,get会有

AFNetWorking3.0使用 自签名证书的https请求

前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客户端的证书和我们要信任服务器的证书,SSL双向认证的原理我这里就不赘述了,这里提供两篇博客 iOS安全系列之一:HTTPS: http://oncenote.com/2014/10/21/Security-1-HTTPS/ iOS安全系列之二:HTTPS进阶: http://oncenote.com

nodejs发起HTTPS请求并获取数据

var https = require('https'); var zlib = require('zlib'); var post_data="………………";//请求数据 var reqdata = JSON.stringify(post_data); var options = { hostname: '10.225.***.***', port: '8443', path: '/data/table/list', method: 'POST', rejectUnauthoriz

在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需要获取认证信息(如Cookie),所以返回的是HttpWebResponse对象,有了返回的HttpWebResponse实例,可以获取登录过程中返回的会话信息,也可以获取响应流. 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;

iOS内置证书,校验https请求

有些情况处于安全的考虑需要https请求,但是为了防止域名解析很多情况下会使用IP进行访问.一般的服务不会针对IP去申请证书,所以我们可以自己实现ssl登录过程,保证请求的安全性. 一.首先需要自己本地生成ssl证书以及搭建一个本地服务 Mac apache本地配置ssl证书 及 iOS OTA部署: http://www.jianshu.com/p/bd016015efe7 生成的crt转换成cer的方法 openssl x509 -in test.crt -out test.cer -out

charles4抓https请求的注意事项

最近升级charles4.0后发现抓不了https请求了,但很奇怪ssl证书一样,记得以前用3.0就可以,今天仔细研究了一下,发现4.0的ssl代理设置中有一段说明(可能3.0也有但没注意): 直接上图,only the locations listed below will be proxied!  恍然大悟,原来charles从4.0版本开始只支持用户手动输入的域名白名的https抓包代理 . 设置了所需要抓取https请求的域名白名单后抓取正常  偷懒的办法是enalbe ssl prox

【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现.在很多地方都需要验证用户身份才可以进行下一步操作,这就免不了POST请求来登录,在实际过程中发现有些网站登录是HTTPS形式的,在解决过程中遇到了一些小问题,现在跟大家分享. 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpW