随着互联网的强大,网络安全的地位也逐步增加。以前的http请求已经不在安全,据说ios2017年1月份开始请求https。
所有,身为android开发人员也应该会加载https请求。直接上干活
1.本人使用的是xutils框架。xutls框架默认请求时调用的是SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER(也就是不检查证书)
2.如果想使用自定义的信任证书的话,xutils的httputils里有configSSLSocketFactory()方法来设置这个
实现的步骤
第1步: 创建自签名证书和.bks 文件
1)
创建 BKS 或者 keystore, 需要用到下面这个文件,bcprov-jdk15on-146.jar, 版本很多, 我用的是这个:http://www.bouncycastle.org/download/bcprov-jdk15on-146.jar, 下载后, 把文件存到 C:\codeproject.
然后用 Keytool 生成 keystore 文件.(keytool 是 Java SDK 自带的文件, 跟javac 放在同一个目录下)在命令提示符窗口中输入 keytool 就能看到这个工具的各种选项说明. 或者输入下列路径运行.
"C:\Program Files (x86)\Java\jre7\bin>keytool".
2)
下面是用 keytool 生成 keysotre 文件的命令. 要是这个文件已经存在, 这一步可以忽略.
keytool -genkey -alias codeproject -keystore C:\codeproject\codeprojectssl.keystore -validity 365
这行命令创建一个别名为 code project 的密钥(key), 生成的文件名是 codeprojectssl.keystore. 执行文件生成过程中会要求输入密钥(key)跟keystore的密码诸如此类的东东. 这里需要注意下, 当要求你录入 Common name 的时候, 要填你的主机名. 本文例子用的是: codeproject.com
3)
keytool -export -alias codeproject -keystore C:\codeproject\codeprojectssl.keystore -file C:\codeproject\codeprojectsslcert.cer
这行命令将密钥(key)从 .keystore 文件导入 .cer 文件.
4)
keytool -import -alias codeproject -file C:\codeproject\codeprojectsslcert.cer -keystore C:\codeproject\codeprojectssl.bks -storetype BKS -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath C:\codeproject\bcprov-jdk15on-146.jar
搞定! 现在, 全部 .bks 文件都生成了. 稍后将这些文件复制到安卓应用中. 连接那些使用自签名证书的服务器的时候会用到.
第2步
把 .keystore 文件复制到 /androidappdir/res/raw/
第3步
新建一个SSLSocketFactoryEx类继承SSLSocketFactory
/**
* Created by Administrator on 2016/10/28 0028.
* user:tyk
*/
public class SSLSocketFactoryEx extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("SSL");
//SSLContext sslContext = SSLContext.getInstance("TLS");
public SSLSocketFactoryEx(KeyStore truststore)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
};
sslContext.init(null, new TrustManager[]{tm}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}
第4步
在httpUtls中设置configSSLSocketFactory
RequestParams params = new RequestParams();
params.addBodyParameter("newsId", "f5d030e8a9c8431d8dfdfd881f4b1f8e");
params.addBodyParameter("bindid", "binggou");
params.addBodyParameter("token", "888888");
HttpUtils httpUtls = new HttpUtils();
try {
KeyStore trusted = KeyStore.getInstance("BKS");
// 从资源文件中读取你自己创建的那个包含证书的 keystore 文件
InputStream in = PulltorefreshActivity.this.getResources().openRawResource(R.raw.codeprojectssl); //这个参数改成你的 keystore 文件名
// 用 keystore 的密码跟证书初始化 trusted
trusted.load(in, "123456".toCharArray());
SSLSocketFactoryEx sf = new SSLSocketFactoryEx(trusted);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
httpUtls.configSSLSocketFactory(sf);
} catch (Exception e) {
LogUtils.e("Exception",e.toString()+"123");
}
httpUtls.send(HttpRequest.HttpMethod.POST, "https://api.binggou.com", params, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> stringResponseInfo) {
String json = stringResponseInfo.result;
LogUtils.e("json", json);
new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
items = new ArrayList<String>();
items.add("我是刷新加的数据");
items.add("可下拉刷新上拉加载的ListView");
items.add("可下拉刷新上拉加载的GridView");
items.add("可下拉刷新上拉加载的ExpandableListView");
items.add("可下拉刷新上拉加载的SrcollView");
items.add("可下拉刷新上拉加载的WebView");
items.add("可下拉刷新上拉加载的ImageView");
items.add("可下拉刷新上拉加载的TextView");
adapter = new MyAdapter(PulltorefreshActivity.this, items);
listView.setAdapter(adapter);
pullToRefreshLayout.refreshFinish(PullToRefreshLayout.SUCCEED);
}
}.sendEmptyMessageDelayed(0, 1000);
}
@Override
public void onFailure(HttpException e, String s) {
LogUtils.e("onFailure", s);
pullToRefreshLayout.refreshFinish(PullToRefreshLayout.FAIL);
}
});
第5步
大功告成!可能有些细节没太说清,以后会回来更进的。