私はアンドロイドアプリを開発しており、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);
非常に簡単な第一歩:あなたのアンドロイドアプリで証明書のチェックを無効にしないでください。 – Robert
どうすれば証明書のチェックを無効にすることができますか?私は、サーバー側SSL証明書のためにletsencryptを使用します。 – mutokenji
質問にはコードは含まれていません。私たちはどのように知るべきですか?あなたの質問を編集し、コードを追加してボレーを構成する方法とリクエストを実行する方法を教えてください。 – Robert