android 请求https接口

来源:互联网 发布:飓风算法 是什么 编辑:程序博客网 时间:2024/05/22 00:48

随着互联网的强大,网络安全的地位也逐步增加。以前的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步

大功告成!可能有些细节没太说清,以后会回来更进的。
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 西安市住房公积金查询系统 郑州住房公积金查询 连云港市住房公积金查询系统 上海住房公积金查询个人账户 滁州住房公积金查询 住房公积金办理条件 住房公积金怎么交 住房公积金密码是什么 赣州住房公积金查询个人账户 南宁市住房公积金中心 昆山住房公积金查询 住房公积金办理 宜宾住房公积金查询 连云港住房公积金查询 柳州住房公积金管理中心 个人住房公积金查询 南宁市住房公积金 住房公积金异地买房 滁州市住房公积金管理中心 住房公积金查询个人账户查询 吉林市住房公积金 洛阳市住房公积金管理中心 河北省住房公积金查询 内蒙古住房公积金管理中心 常州住房公积金管理中心 住房公积金中心 无锡住房公积金管理中心 重庆住房公积金管理中心 吉林省住房公积金 黄石住房公积金查询个人账户 唐山住房公积金管理中心 唐山住房公积金 遵义市住房公积金查询 湖南省住房公积金查询 深圳市住房公积金 保定住房公积金管理中心 阜阳住房公积金查询 临沂住房公积金查询 呼和浩特住房公积金管理中心 住房公积金管理中心网 南京住房公积金查询