2016-08-12 7 views
2

私はアンドロイドアプリを開発しており、SSL接続を使って自分のサーバーに接続しています。パケットキャプチャがSSL接続を解読するのを防ぐ方法

私のWebサービスに接続するには、私のサーバーhttpsのアドレスにVolley Requestを使用します。

しかし、中間の方法でmanを使用して接続を傍受するパケットキャプチャを使用して接続を傍受しようとすると、非SSL接続のように見えます。私は全体の要求と応答を見ることができます。 しかし、LINE、Facebookなどの他のアプリは、パケットキャプチャで復号化することはできません。私はLINEやFacebookのような同じデバイスからでも自分のWebサービスを保護したいと思っています。どうすればそれを達成できますか?私は誰かが私のWebサービスに送信したパラメータを知ることを望んでいません。

私のバックエンドサーバーは、Google Cloud Platformコンピューティングエンジンを使用しています。

編集:私は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); 
+2

非常に簡単な第一歩:あなたのアンドロイドアプリで証明書のチェックを無効にしないでください。 – Robert

+0

どうすれば証明書のチェックを無効にすることができますか?私は、サーバー側SSL証明書のためにletsencryptを使用します。 – mutokenji

+0

質問にはコードは含まれていません。私たちはどのように知るべきですか?あなたの質問を編集し、コードを追加してボレーを構成する方法とリクエストを実行する方法を教えてください。 – Robert

答えて

2

SSLは限り攻撃者があなたのデバイスによって受け入れられた証明書を持っているとのMITM攻撃に対して脆弱です。 *

お使いの端末では、主に2種類の証明書を受け取ります。 VerisignやThawteのような信頼できる組織が訴えたもの、あなた自身がインストールしたもの。

パケットキャプチャは、使用している場合は、それを信頼するためにデバイスに独自の証明書をインストールし、後で発信接続で証明書を偽装することができます。

外部から発せられたmitm攻撃は、同じことを簡単に行うことができないはずです。 (アプリケーションや証明書をインストールするように納得させるなど、状況によってはやはり可能です)。

これを完全に防止するには、certificate pinningを使用して、異なる証明書でコネクションを再暗号化できないようにします。

Charlesのようなプロキシを使用するなど、デバイスの外部からmitm攻撃を試みて、接続がまだ安全であることを効果的に確認する必要があります。

*:SSLは、証明書とドメイン名の間のリンクを保証することはできません。接続にサインする人は誰でもを信じていることが保証されています。 (大量の塩分を取るためには、ほとんど誰も認証なしで証明書を購入することができます)

関連する問題