Android 如何防止数据包捕获解密我的SSL连接

Android 如何防止数据包捕获解密我的SSL连接,android,ssl,https,android-volley,packet-sniffers,Android,Ssl,Https,Android Volley,Packet Sniffers,我正在开发android应用程序,并使用SSL连接连接到我的服务器 为了连接到我的web服务,我对我的服务器https地址使用截击请求 但是,当我试图用包捕获的方法来拦截我的连接时,中间人使用中间方法拦截我的连接,看起来像是非SSL连接。我可以看到整个请求和响应。 但是,诸如LINE、Facebook等其他应用程序无法通过数据包捕获进行解密。我想保护我的网络服务,即使是像LINE和Facebook那样使用相同的设备。我怎样才能做到这一点?我不希望有人知道发送到我的web服务的任何参数 我的后端服

我正在开发android应用程序,并使用SSL连接连接到我的服务器

为了连接到我的web服务,我对我的服务器https地址使用截击请求

<>但是,当我试图用包捕获的方法来拦截我的连接时,中间人使用中间方法拦截我的连接,看起来像是非SSL连接。我可以看到整个请求和响应。 但是,诸如LINE、Facebook等其他应用程序无法通过数据包捕获进行解密。我想保护我的网络服务,即使是像LINE和Facebook那样使用相同的设备。我怎样才能做到这一点?我不希望有人知道发送到我的web服务的任何参数

我的后端服务器使用谷歌云平台计算引擎

编辑:我使用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);
    }

}
public类CustomRestRequest扩展请求实现可序列化{
私有静态最终字符串服务器\u URL=”https://myapiurl.com/";
私有映射mHeaders=newhashmap();
私人回应。倾听者;
私有映射参数;
公共UberGuareRequest(字符串操作、映射参数、,
Response.Listener responseListener,Response.ErrorListener ErrorListener){
super(Method.POST、SERVER\u URL+action、errorListener);
this.listener=responseListener;
this.params=params;
}
受保护的映射getParams()
抛出com.android.volley.AuthFailureError{
返回参数;
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
试一试{
String jsonString=新字符串(response.data,
HttpHeaderParser.parseCharset(response.headers));
返回Response.success(新的JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(响应));
}捕获(不支持的编码异常e){
返回Response.error(新的ParseError(e));
}捕获(JSONException je){
返回Response.error(newparseerror(je));
}
}
@凌驾
受保护的void deliverResponse(JSONObject响应){
onResponse(response);
}
@凌驾
公共映射getHeaders(){
返回mHeaders;
}
public void setBearerAuthorization(字符串标记){
mHeaders.put(“授权”、“持票人”+代币);
}
}
我的请求示例:

    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);
Map params=newhashmap();
参数put(“消息”,消息);
最终CustomRestRequest请求=新CustomRestRequest(“用户/支持”,参数,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
if(response.getString(“status”).equals(“00”)){
result.status=“00”;
mListener.onSupportTaskPostExecute(结果);
}否则{
result.status=“99”;
isRunning=false;
mListener.onSupportTaskPostExecute(结果);
}
}捕获(例外情况除外){
result.status=“99”;
isRunning=false;
mListener.onSupportTaskPostExecute(结果);
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
result.status=“88”;
isRunning=false;
mListener.onSupportTaskPostExecute(结果);
错误。printStackTrace();
}
});
request.setBearerAuthorization(AppHelper.getAuthCode(getContext());
RequestQueue=Volley.newRequestQueue(getContext());
添加(请求);

只要攻击者拥有设备接受的证书,SSL就容易受到MitM攻击*

您的设备主要接受两种类型的证书:由可信组织(如Verisign或Thawte)颁发的证书和由您自己安装的证书

我怀疑数据包捕获(如果您正在使用的话)是在设备上安装自己的证书以使其受信任,以后可以在传出连接上伪造任何证书

好消息是,任何来自外部的mitm攻击都不应该那么容易做到同样的事情。(在某些情况下,这仍然是可能的,例如出于可疑的原因说服您安装应用程序或证书)

为了完全防止这种情况,您可以使用来确保您的连接不能使用其他证书重新加密

您还应该尝试从设备外部进行mitm攻击,例如使用类似代理的方法来有效地确保连接仍然安全


*:SSL无法保证证书和域名之间的链接。它只保证对连接进行签名的人是可信的。(这是一个非常简单的第一步:不要在android应用程序中禁用证书检查。我怎么知道我禁用了证书检查?我使用letsencrypt作为服务器端ssl证书。您的问题中没有包含任何代码。我们怎么知道?也许你应该编辑你的问题并添加代码如何配置截击以及如何执行请求?我只是添加代码来执行请求。我的理解是,数据包捕获是安装在同一设备上的Android应用程序?如果是这样的话,您能否在问题中添加该信息,这与应用程序执行证书欺骗的能力非常相关。