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/

 

你可能感兴趣的:(Android)