您的位置:首页 > 理论基础 > 计算机网络

让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来加强它自身的功能。

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,具体百度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: