我需要设置一个演示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设置密钥库并将http post / get发送到我的服务器,使代码工作。
我的HTTP POST代码示例(MyHttpClient is as per reference
):
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);
如果我理解正确,则密钥库步骤(在参考中),具体为:
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证书&#39;原始资源(我认为SSL握手仍然有效 - 这里需要一些确认......)。
我认为通过此更改,如果我发送由同一CA签署的证书但是对于恶意域,则没有任何证书验证的应用程序将接受该证书并开始与之通信。
如果有人可以评论我的想法,我们将不胜感激。
答案 0 :(得分:1)
所以在这里我无法控制证书的CA(如果我错了,请纠正我)。
这是一张自签名证书;没有CA.
要演示MITM,我需要由相同的CA签署证书,但对于不同的域,因此没有证书验证,应用程序将与错误的服务器通信。
没有。一个真正的中间人攻击涉及一个代理,一个伪装成你的目标服务器并拦截通信的代理。
欢迎您通过针对同一域的第二个不同的自签名证书进行测试来确认您的证书验证失败。对于MITM攻击而言,这比对不同域的不同自签名证书更为现实。