【问题标题】:How to prevent packet capture decrypt my SSL connection如何防止数据包捕获解密我的 SSL 连接
【发布时间】: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


【解决方案1】:

只要攻击者拥有您的设备接受的证书,SSL 就容易受到中间人攻击。*

您的设备主要接受两种类型的证书:由威瑞信或 Thawte 等受信任的组织颁发的证书,以及您自己安装的证书。

我怀疑 Packet Capture(如果您正在使用它)正在设备上安装自己的证书以使其受信任,之后能够在传出连接上欺骗任何证书。

好消息是,任何源自外部的中间人攻击都不应该轻易地做同样的事情。 (在某些情况下仍有可能,例如出于可疑原因说服您安装应用程序或证书)。

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

您还应该尝试从您的设备外部进行中间人攻击,例如使用像 Charles 这样的代理来有效地查看您的连接仍然是安全的。

*:SSL 无法保证证书与域名之间的链接。它只保证签署连接的人应该是受信任的。 (与一大块盐一起服用。任何人都可以购买几乎没有验证的证书。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多