android https - 在缺少证书验证时演示 MITM

标签 android ssl https

我需要设置一个演示 Android 应用程序,以帮助了解忽略证书验证如何导致 MITM。

目前,我的测试服务器有一个自签名证书,创建如下(参见 here):

 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

现在要使用此服务器(具有自签名证书)测试 Android 应用程序,我使用此 reference 使代码正常工作用于设置 keystore 并将 http post/get 发送到我的服务器。

我的 HTTP POST 代码示例(MyHttpClient 按照引用):

HttpClient httpclient = new MyHttpClient(getApplicationContext());

HttpPost httpPost = new HttpPost("https://www.testwebsite.com/api/rest/json/?");
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("method", "gettoken"));
nvps.add(new BasicNameValuePair("username",<Username> ));
nvps.add(new BasicNameValuePair("password", <Password>));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = httpclient.execute(httpPost);

如果我理解正确, keystore 步骤(在引用资料中),具体来说:

 final KeyStore ks = KeyStore.getInstance("BKS");
 final InputStream inputStream = appContext.getResources().openRawResource(R.raw.certs);
 ks.load(inputStream, appContext.getString(R.string.store_pass).toCharArray());
 inputStream.close();

 ret = new SSLSocketFactory(ks);

完全信任我想要的证书。所以这里我无法控制证书的CA(如果我错了请纠正我)。

为了演示 MITM,我需要由同一个 CA 签署的证书,但对于不同的域,因此如果没有证书验证,应用程序将与错误的服务器通信。

我有一个关于如何修正我的演示的想法,并想确认它是否是正确的方向。

我的想法是,在我的 Apache 服务器上,我将首先创建一个 CA,然后使用该 CA 为良性域创建一个证书。

在我的应用程序中,我正在考虑用 CA 的文件替换自签名证书文件并更改上面的代码以引用保存在应用程序原始资源中的 CA 证书(我认为 SSL 握手仍然有效 - 需要在这里进行一些确认..)。

我认为通过此更改,如果我发送由同一个 CA 签名但针对恶意域的证书,则未经任何证书验证的应用将接受该证书并开始与之通信。

如果有人能对我的想法发表评论,我们将不胜感激。

最佳答案

So here I don't have control over the CA of the certificate (correct me if I'm wrong).

是自签名证书;没有CA。

To demo MITM, I need to have certificate signed by same CA, but for a different domain, and so without certificate validation, the app will talk to the wrong server.

没有。真正的中间人攻击涉及代理,它伪装成您的目标服务器并拦截通信。

欢迎您通过针对同一域的第二个不同的自签名证书进行测试来确认您的证书验证失败。对于 MITM 攻击来说,这比针对不同域的不同自签名证书更现实。

关于android https - 在缺少证书验证时演示 MITM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290635/

相关文章:

android - 从 firebase 数据库中获取多个值

apache - 主域名的 SSL 不起作用,但子域可以

proxy - 开源 HTTP 或 HTTPS 代理

go - 如何为 ListenAndServeTLS 功能提供 CA 证书

android - 单击后退按钮时在 RecyclerView 中获得相同的项目位置

android - AccountManager 无法在 Sony XZ 7.1.1 上添加帐户

java - 如何在android json中使用反斜杠

c# - 如何使用带有客户端证书的 (Microsoft.AspNetCore.TestHost)TestServer

python - 认证为什么/如何因 AUTH_URL/auth/tokens "No such file"错误而失败?

javascript - 在没有服务器的情况下使用 Google Cloud Messaging 发送通知