第一步生成服务端证书。配置服务端的https服务。这里,我们通过nginx 做。好处是不用配置修改服务器端代码。
这里请看。https://blog.csdn.net/liuno0/article/details/108308254。
这时候,服务端配置好了。证书也有了。你想看https 通了没,可以看看,你服务端的测试接口。
第二步生成客户端证书。安卓使用的是BKS格式,但是我们只有P12格式。
P12转BKS,这里可以看。https://blog.csdn.net/liuno0/article/details/108362318
CER放到证书库里。这里可以看。https://blog.csdn.net/liuno0/article/details/109143196
如果没有转换工具,给我留言。
第三部拿到生成的client.bks 和 client.truststore通过okhttp 就可以实现安卓的https 双向认证了。
安卓端,这里面是全部的代码。包括 同步 异步 get post 上传 下载。可以根据自己使用情况修改。
只有修改AjaxUtil这个工具类,
酌情修改HttpsUtil
修改SSLHelper里面证书的信息。
如果,报错Context 这个问题。自己想办法。我用了一个取巧的方法。
在
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
public class NetConfig {
private static List CERTIFICATES_DATA = new ArrayList();
public synchronized static void addContext(Context context) {
if (context != null) {
CERTIFICATES_DATA.add(0,context);
// CERTIFICATES_DATA.add(context);
}
}
public static Context getContextData() {
return (Context)CERTIFICATES_DATA.get(0);
}
}
在MainActivity放进去。
NetConfig.addContext(this);
package com.ssl;
import io.dcloud.common.DHInterface.StandardFeature;
import android.os.Environment;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.util.JSUtil;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class AjaxUtil extends StandardFeature {
String muiAppDoc= "apps/H5FA67A95";
public JSONArray resultMsg;
public JSONArray resultMsgSync;
public IWebview webview;
String callbackId;
private int serversLoadTimes =0;
private static final int maxLoadTimes =3; // 最大重连次数
OkHttpClient okHttpClient=null ;
String encrydataStr;
String url;
/**
* 同步调用原生的方法
* @param webview 调用这个原生方法的js所在的webview
* @param json js调用时传入的参数列表
* @return 返回给js的值
* */
public String functionSync(IWebview webview, JSONArray json) throws JSONException {
resultMsgSync=new JSONArray();
JSONArray paramJSONArray= json.getJSONArray(0);
String url=paramJSONArray.optString(4).trim();
String paramStr=paramJSONArray.optString(5).trim();
String datatypeparam=paramJSONArray.optString(6).trim();
String typeparam=paramJSONArray.optString(7).trim();
if(datatypeparam.equals("json")&&typeparam.equals("post")){
if(paramStr.equals(null)||paramStr.equals("")){
postFunctionSyncNoparam(json);
}else {
postSyncRequest(json);
// String valuess=(String) resultMsgSync.get(0);
// //解密动作
// String encrydataStr1=EncryptionUtil.decrypt(valuess);
// resultMsgSync.put(0,encrydataStr1);
}
}else
if(datatypeparam.equals("jsonNoJiaMi")&&typeparam.equals("post")){
postSyncRequestNojiami(json);
}
// Log.e(TAG, String.format("webview = %s, jsonArray = %s", webview, json));
// Log.e(TAG, String.format("thread name = %s, id = %s", Thread.currentThread().getName(), Thread.currentThread().getId()));
// webview.evalJS("(function(){alert('webview.evalJS')})();");
String values=null;
for(int i=0;i<1000;i++){
// while (true) {
if(resultMsgSync.length()>0){
values=(String) resultMsgSync.get(0);
break;
}
}
// String values=(String) resultMsgSync.get(0);
return JSUtil.wrapJsVar(values);
}
/**
* 发送同步的post请求,不修改请求,请求不加密,返回不加密
*/
public void postSyncRequestNojiami(JSONArray json) throws JSONException {
JSONArray paramJSONArray= json.getJSONArray(0);
url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
JSONObject jsonObject=new JSONObject(paramValues);
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//创建一个RequestBody(参数1:数据类型 参数2传递的json串)
RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));
okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();//创建OkHttpClient对象。
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(requestBody)//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
try {
Response response = okHttpClient.newCall(request).execute();
String aaa=response.body().string();
resultMsgSync.put(0,aaa);
} catch (IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
resultMsgSync.put(0,"4044");
}
}
/**
* 发送同步的post请求
*/
public void postSyncRequest(JSONArray json) throws JSONException {
if(resultMsgSync.length()>0){
resultMsgSync.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(0);
url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
int index=url.indexOf("appSessionOut");
String userId =null;
if(index!=-1) {
JSONObject jsonObject3=new JSONObject(paramValues);
userId = jsonObject3.getString("userId");
UserConfig.addUser(userId);
}
String enc3=EncryptionUtil.encrypt3(paramValues);
String timestampStr= getPrecisionStandardTime();
JSONObject jsonObject2=new JSONObject();
jsonObject2.put("olddata",paramValues);
jsonObject2.put("auth2",enc3);
jsonObject2.put("timestamp",timestampStr);
String jsonStr2=jsonObject2.toString();
encrydataStr=EncryptionUtil.encrypt2(jsonStr2);
okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("encrydata",encrydataStr);//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
try {
Response response = okHttpClient.newCall(request).execute();
String aaa=response.body().string();
//解密动作
resultMsgSync.put(0,EncryptionUtil.decrypt(aaa));
} catch (IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
resultMsgSync.put(0,"4044");
}
}
/**
* post 不带参数,同步
* @param json
* @throws JSONException
*/
private void postFunctionSyncNoparam(JSONArray json) throws JSONException {
if(resultMsgSync.length()>0){
resultMsgSync.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(0);
String url=paramJSONArray.optString(4).trim();
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
try {
Response response = okHttpClient.newCall(request).execute();
resultMsgSync.put(0,response.body().string());
} catch (IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
resultMsgSync.put(0,"4044");
}
}
/**
* 异步调用原生的方法
* @param webview1 调用这个原生方法的js所在的webview
* @param json js调用时传入的参数列表
* */
public void functionAsync(final IWebview webview1, JSONArray json){
if(resultMsg==null){
resultMsg=new JSONArray();
}
okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();//创建OkHttpClient对象。
webview=webview1;
try {
callbackId = json.optString(0);
JSONArray paramJSONArray= json.getJSONArray(1);
String datatypeparam=paramJSONArray.optString(6).trim();
String typeparam=paramJSONArray.optString(7).trim();
String paramStr=paramJSONArray.optString(5).trim();
if(datatypeparam.equals("json")&&typeparam.equals("post")){
if(paramStr.equals(null)||paramStr.equals("")){
postFunctionNoparam(json);
}else {
postFunction(json);
}
}
if(datatypeparam.equals("jsonnojiami")&&typeparam.equals("post")){
postFunctionNojiami(json);
}
if(datatypeparam.equals("jsonreqjiami")&&typeparam.equals("post")){
postFunctionReqjiami(json);
}
if(datatypeparam.equals("filedownload")&&typeparam.equals("get")){
postFunctiondownFile(json);
}
if(datatypeparam.equals("fileup")&&typeparam.equals("post")){
postFunctionupFile(json);
}
}catch (Exception e){
e.printStackTrace();
}
// handler.postDelayed(new Runnable() {
// @Override
// public void run() {
//
// if (resultMsg.length() == 0) {
// JSONArray jsonyMSG11=new JSONArray();
// jsonyMSG11.put("请求超时");
// JSUtil.execCallback(webview1, callbackId, jsonyMSG11, JSUtil.OK, false);
// }
// }
// }, 6000);
}
/**
* 调用okhttp,这里面有ssl
* @param json
*/
public void gettFunction(JSONArray json) throws JSONException {
resultMsg.remove(0);
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
//创建日志拦截器,用于日志打印
// HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
// interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();
Request request = new Request.Builder()
.url(url)
.get()
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
resultMsg.put(response.body().string());
String b=response.message();
// LogUtils.i("请求成功" + response.body().toString());
// LogUtils.i("请求成功" + response.message());
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 异步请求
* @param json
* @throws JSONException
*/
private void postFunction(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
int index=url.indexOf("appSessionOut");
String userId =null;
if(index!=-1) {
JSONObject jsonObject3=new JSONObject(paramValues);
userId = jsonObject3.getString("userId");
UserConfig.addUser(userId);
}
String enc3=EncryptionUtil.encrypt3(paramValues);
String timestampStr= getPrecisionStandardTime();
JSONObject jsonObject2=new JSONObject();
jsonObject2.put("olddata",paramValues);
jsonObject2.put("auth2",enc3);
jsonObject2.put("timestamp",timestampStr);
String jsonStr2=jsonObject2.toString();
String encrydataStr=EncryptionUtil.encrypt2(jsonStr2);
// okHttpClient = new OkHttpClient().newBuilder()
// .connectTimeout(50000, TimeUnit.MILLISECONDS)
// .readTimeout(50000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("encrydata",encrydataStr);//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// LogUtils.i("请求失败:"+e.getMessage());
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//解密动作
String encrydataStr1=EncryptionUtil.decrypt(response.body().string());
try {
resultMsg.put(0,encrydataStr1);
} catch (JSONException e) {
e.printStackTrace();
}
// resultMsg.put(encrydataStr1);
String b=response.message();
// LogUtils.i("请求成功" + response.body().toString());
// LogUtils.i("请求成功" + response.message());
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 异步请求 不加密,
* @param json
* @throws JSONException
*/
private void postFunctionNojiami(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
//String转JSONObject
JSONObject result = new JSONObject(paramValues);
//取数据
String olddata= (String) result.get("olddata");
//取数据
String auth2= (String) result.get("auth2");
// OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
// .connectTimeout(50000, TimeUnit.MILLISECONDS)
// .readTimeout(50000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("olddata",olddata);//传递键值对参数
formBody.add("auth2",auth2);//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// LogUtils.i("请求失败:"+e.getMessage());
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// resultMsg.put(response.body().string());
try {
resultMsg.put(0,response.body().string());
} catch (JSONException e) {
e.printStackTrace();
}
String b=response.message();
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 异步请求 请求加密,请求的数据在前段已经加好密了
* @param json
* @throws JSONException
*/
private void postFunctionReqjiami(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
//String转JSONObject
JSONObject result = new JSONObject(paramValues);
//取数据
String encryptedReq= (String) result.get("encryptedReq");
// okHttpClient = new OkHttpClient().newBuilder()
// .connectTimeout(50000, TimeUnit.MILLISECONDS)
// .readTimeout(50000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("encryptedReq",encryptedReq);//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
resultMsg.put(0,response.body().string());
} catch (JSONException e) {
e.printStackTrace();
}
String b=response.message();
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 不带参数,
* @param json
* @throws JSONException
*/
private void postFunctionNoparam(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
//
// OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
// .connectTimeout(50000, TimeUnit.MILLISECONDS)
// .readTimeout(50000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
resultMsg.put(0,response.body().string());
} catch (JSONException e) {
e.printStackTrace();
}
String b=response.message();
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 下载文件,
* @param json
* @throws JSONException
*/
private void postFunctiondownFile(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String fileUrlOld=paramJSONArray.getString(5);
final String fileUrl=fileUrlOld.substring(1);
// OkHttpClient okHttpClientdown = new OkHttpClient().newBuilder()
// .connectTimeout(120000, TimeUnit.MILLISECONDS)
// .readTimeout(120000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.get()
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.ERROR, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = response.body().byteStream();//从服务器得到输入流对象
String[] fileArray=fileUrl.split("/");
//获取程序的cache路径
File gcjslrcache= NetConfig.getContextData().getExternalCacheDir();
String gcjslrcacheUrl= gcjslrcache.getPath();
//截取字符串去掉cache
String gcjslrUrl=gcjslrcacheUrl.substring(0,gcjslrcacheUrl.length()-6);
//拼接成doc的路径
File newFile = new File(gcjslrUrl+File.separator+muiAppDoc+File.separator+fileArray[0]);
if(!newFile.exists()){
newFile.mkdirs();
}
File newFile1 = new File(newFile,fileArray[1]);
FileOutputStream fos = new FileOutputStream(newFile1);
byte[] buf = new byte[1024*8];
int len = 0;
while ((len = is.read(buf)) != -1){
fos.write(buf, 0, len);
}
fos.flush();
JSONObject jsonObjectr=new JSONObject();
try {
jsonObjectr.put("resultCode",response.code());
} catch (JSONException e) {
e.printStackTrace();
}
String jsonStrr=jsonObjectr.toString();
try {
resultMsg.put(0,jsonStrr);
} catch (JSONException e) {
e.printStackTrace();
}
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* post 上传文件
* @param json
* @throws JSONException
*/
private void postFunctionupFile(JSONArray json) throws JSONException, IOException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String fileUrlOld=paramJSONArray.getString(5);
String fileUrl=fileUrlOld.substring(1);
String[] fileArray=fileUrl.split("/");
//获取程序的cache路径
File gcjslrcache= NetConfig.getContextData().getExternalCacheDir();
String gcjslrcacheUrl= gcjslrcache.getPath();
//截取字符串去掉cache
String gcjslrUrl=gcjslrcacheUrl.substring(0,gcjslrcacheUrl.length()-6);
//拼接成doc的路径
File newFile = new File(gcjslrUrl+File.separator+muiAppDoc+File.separator+fileArray[0]);
//文件的路径
File newFile1 = new File(newFile,fileArray[1]);
okHttpClient = new OkHttpClient().newBuilder()
.sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
.hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
.build();//创建OkHttpClient对象。
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("sjjl", newFile1.getName(),
RequestBody.create(MediaType.parse("multipart/form-data"), newFile1))
.build();
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(requestBody)
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
JSONArray resultMsgErr=new JSONArray();
JSONObject jsonObjectE=new JSONObject();
try {
jsonObjectE.put("resultCode","4044");
} catch (JSONException e1) {
e1.printStackTrace();
}
try {
resultMsgErr.put(0,jsonObjectE);
} catch (JSONException e1) {
e1.printStackTrace();
}
JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
// JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
JSONObject jsonObjectr=new JSONObject();
try {
jsonObjectr.put("resultCode",response.code());
} catch (JSONException e) {
e.printStackTrace();
}
String jsonStrr=jsonObjectr.toString();
try {
resultMsg.put(0,jsonStrr);
} catch (JSONException e) {
e.printStackTrace();
}
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
/**
* 格式化时间,精确到毫秒
*
*/
public String getPrecisionStandardTime(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
Date date = new Date(System.currentTimeMillis());
String time = sdf.format(date);
return time;
}
}
package com.ssl;
import android.content.Context;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
public class SSLHelper {
private static final String TAG = "SSLHelper";
private final static String CLIENT_PRI_KEY = "client.bks";
// private final static String TRUSTSTORE_PUB_KEY = "root.bks";
private final static String TRUSTSTORE_PUB_KEY = "client.truststore";
private final static String CLIENT_BKS_PASSWORD = "123456";
private final static String TRUSTSTORE_BKS_PASSWORD = "123456";
private final static String KEYSTORE_TYPE = "BKS";
private final static String PROTOCOL_TYPE = "TLS";
private final static String CERTIFICATE_STANDARD = "X509";
public static SSLSocketFactory getSSLCertifcation(Context context) {
SSLSocketFactory sslSocketFactory = null;
try {
// 服务器端需要验证的客户端证书,其实就是客户端的keystore
KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
// 客户端信任的服务器端证书
KeyStore trustStore = KeyStore.getInstance(KEYSTORE_TYPE);
//读取证书
InputStream ksIn = context.getAssets().open(CLIENT_PRI_KEY);
InputStream tsIn = context.getAssets().open(TRUSTSTORE_PUB_KEY);
//加载证书
keyStore.load(ksIn, CLIENT_BKS_PASSWORD.toCharArray());
trustStore.load(tsIn, TRUSTSTORE_BKS_PASSWORD.toCharArray());
ksIn.close();
tsIn.close();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(CERTIFICATE_STANDARD);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(CERTIFICATE_STANDARD);
trustManagerFactory.init(trustStore);
keyManagerFactory.init(keyStore, CLIENT_BKS_PASSWORD.toCharArray());
//初始化SSLContext
SSLContext sslContext = SSLContext.getInstance(PROTOCOL_TYPE);
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new java.security.SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslSocketFactory;
}
}
package com.ssl;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class HttpsUtil {
public static class SSLParams
{
public SSLSocketFactory sSLSocketFactory;
public X509TrustManager trustManager;
}
public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password)
{
SSLParams sslParams = new SSLParams();
try
{
TrustManager[] trustManagers = prepareTrustManager(certificates);
KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
SSLContext sslContext = SSLContext.getInstance("TLS");
X509TrustManager trustManager = null;
if (trustManagers != null)
{
trustManager = new MyTrustManager(chooseTrustManager(trustManagers));
} else
{
trustManager = new UnSafeTrustManager();
}
sslContext.init(keyManagers, new TrustManager[]{trustManager},null);
sslParams.sSLSocketFactory = sslContext.getSocketFactory();
sslParams.trustManager = trustManager;
return sslParams;
} catch (NoSuchAlgorithmException e)
{
throw new AssertionError(e);
} catch (KeyManagementException e)
{
throw new AssertionError(e);
} catch (KeyStoreException e)
{
throw new AssertionError(e);
}
}
public static class UnSafeHostnameVerifier implements HostnameVerifier
{
@Override
public boolean verify(String hostname, SSLSession session)
{
return true;
}
}
public static class UnSafeTrustManager implements X509TrustManager
{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException
{
}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[]{};
}
}
private static TrustManager[] prepareTrustManager(InputStream... certificates)
{
if (certificates == null || certificates.length <= 0) return null;
try
{
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates)
{
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try
{
if (certificate != null)
certificate.close();
} catch (IOException e)
{
}
}
TrustManagerFactory trustManagerFactory = null;
trustManagerFactory = TrustManagerFactory.
getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
return trustManagers;
} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
} catch (CertificateException e)
{
e.printStackTrace();
} catch (KeyStoreException e)
{
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static KeyManager[] prepareKeyManager(InputStream bksFile, String password)
{
try
{
if (bksFile == null || password == null) return null;
KeyStore clientKeyStore = KeyStore.getInstance("BKS");
clientKeyStore.load(bksFile, password.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(clientKeyStore, password.toCharArray());
return keyManagerFactory.getKeyManagers();
} catch (KeyStoreException e)
{
e.printStackTrace();
} catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
} catch (UnrecoverableKeyException e)
{
e.printStackTrace();
} catch (CertificateException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers)
{
for (TrustManager trustManager : trustManagers)
{
if (trustManager instanceof X509TrustManager)
{
return (X509TrustManager) trustManager;
}
}
return null;
}
private static class MyTrustManager implements X509TrustManager
{
private X509TrustManager defaultTrustManager;
private X509TrustManager localTrustManager;
public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException
{
TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
var4.init((KeyStore) null);
defaultTrustManager = chooseTrustManager(var4.getTrustManagers());
this.localTrustManager = localTrustManager;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
{
try
{
defaultTrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException ce)
{
localTrustManager.checkServerTrusted(chain, authType);
}
}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[0];
}
}
}
这时候就可以https 通信了。
在安卓里添加。
这里我原来是ajax请求,后来改成了okhttp。在manifest.json添加。
写了一个ajaxutil.js
document.addEventListener( "plusready", function()
{
// 声明的JS“扩展插件别名”
var _BARCODE = 'ajaxutil',
B = window.plus.bridge;
var ajaxutil =
{
//同步方法
functionSync:function(Argus){
return B.execSync(_BARCODE, "functionSync", [Argus]);
},
//异步方法
functionAsync : function(Argus,successCallback, errorCallback )
{
var success = typeof successCallback !== 'function' ? null : function(args)
{
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code)
{
errorCallback(code);
};
callbackID = B.callbackId(success, fail);
return B.exec(_BARCODE, "functionAsync", [callbackID, Argus]);
}
};
window.plus.ajaxutil = ajaxutil;
}, true );
异步的调用,模仿ajax。
var urlm=serverAddress+"/IndexController/gettsrecord/"+pageNum+"/"+pageSize+"/"+total;
var datam=JSON.stringify(searchJson);
var typem="post";
var dataTypem="json";
plus.ajaxutil.functionAsync(["Html5", "Plus", "SyncFunction", "ArrayArgument!",urlm,datam,dataTypem,typem],
function(result) {
var data=JSON.parse(result);
setValues('install-debug-list-online', data.data);
},
function(result) {
alert("网络异常!");
});
同步的调用
var urlm=serverAddress + "/IndexController/getDataCounts";
var dataaaa = {
userid: userId,
counttype: "azts",
condition: jsonstr
};
var datam=JSON.stringify(dataaaa);
var typem="post";
var dataTypem="json";
var result= plus.ajaxutil.functionSync(["Html5", "Plus", "SyncFunction", "ArrayArgument!",urlm,datam,dataTypem,typem]);
if(result=="4044"){
setCounts("online");
alert("网络异常,请检查网络!");
return;
}
var data=JSON.parse(result);
setCounts("online", data.data);
这时候,由原来的ajax 的http请求全部修改成安卓的okhttp 的https请求。
这篇比较长。慢慢来。不懂可以留言。