【发布时间】:2016-12-19 11:48:10
【问题描述】:
我正在开发一个安卓应用程序并使用 SSL 连接来连接到我的服务器。
要连接到我的网络服务,我使用 Volley 请求到我的服务器 https' 地址。
但是,当我尝试使用中间人方法拦截我的连接的数据包捕获来拦截我的连接时,它看起来像一个非 SSL 连接。我可以看到整个请求和响应。 但是,LINE、Facebook 等其他应用程序无法通过 Packet Capture 进行解密。我想保护我的网络服务,即使是像 LINE 和 Facebook 一样的设备。我怎样才能做到这一点?我不希望有人知道发送到我的网络服务的任何参数。
我的后端服务器使用谷歌云平台计算引擎。
编辑:我使用 Letsencrypt.org SSL 证书。
代码:
我的自定义请求
public class CustomRestRequest extends Request<JSONObject> implements Serializable {
private static final String SERVER_URL = "https://myapiurl.com/";
private Map<String, String> mHeaders = new HashMap<>();
private Response.Listener<JSONObject> listener;
private Map<String, String> params;
public UberGUARestRequest(String action, Map<String, String> params,
Response.Listener<JSONObject> responseListener, Response.ErrorListener errorListener) {
super(Method.POST, SERVER_URL + action, errorListener);
this.listener = responseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
listener.onResponse(response);
}
@Override
public Map<String, String> getHeaders() {
return mHeaders;
}
public void setBearerAuthorization(String token) {
mHeaders.put("Authorization", "Bearer " + token);
}
}
我的请求示例:
Map<String, String> params = new HashMap<>();
params.put("message", message);
final CustomRestRequest request = new CustomRestRequest("user/support", params,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
if (response.getString("status").equals("00")) {
result.status = "00";
mListener.onSupportTaskPostExecute(result);
} else {
result.status = "99";
isRunning = false;
mListener.onSupportTaskPostExecute(result);
}
} catch (Exception ex) {
result.status = "99";
isRunning = false;
mListener.onSupportTaskPostExecute(result);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
result.status = "88";
isRunning = false;
mListener.onSupportTaskPostExecute(result);
error.printStackTrace();
}
});
request.setBearerAuthorization(AppHelper.getAuthCode(getContext()));
RequestQueue queue = Volley.newRequestQueue(getContext());
queue.add(request);
【问题讨论】:
-
一个非常简单的第一步:不要在你的安卓应用中禁用证书检查。
-
我怎么知道我禁用了证书检查?我将letsencrypt用于服务器端ssl证书。
-
您的问题中没有包含任何代码。我们应该怎么知道?也许您应该编辑您的问题并添加代码如何配置 volley 以及如何执行请求?
-
我只是添加我的代码来执行请求。
-
我的理解是Packet Capture是一个Android应用,安装在同一台设备上?如果是这样,您能否在问题中添加该信息,它与应用程序执行证书欺骗的能力非常相关。
标签: android ssl https android-volley packet-sniffers