保护连接检查 SSL 证书?
Securing a connection checking SSL Certificate?
我正在实习。
在这里,他们给了我一个 Android 应用程序的代码,该应用程序已由一家机构为代码安全性进行了修订,并告诉我更改文档中存在的一些要点。
现在他们担心信息泄露,因为应用程序在连接到银行服务器时不检查 SSL 证书,有 "Man In The Middle" 攻击的风险。
是否有任何 class 可用于检查证书的到期日期。或者它是否可信?
应用程序中的 http 连接示例:
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new CustomSSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams bhttpparams = new BasicHttpParams();
HttpProtocolParams.setVersion(bhttpparams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(bhttpparams, "utf-8");
bhttpparams.setBooleanParameter("http.protocol.expect-continue", false);
HttpConnectionParams.setConnectionTimeout(bhttpparams, 20000);
HttpConnectionParams.setSoTimeout(bhttpparams, 200000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(bhttpparams, registry);
client = new DefaultHttpClient(ccm, bhttpparams);
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials("", ""));
HttpResponse response = client.execute(urlws);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"), 8);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
漏洞就在这里。删除它。
但我会质疑任何在没有适当的简报的情况下将这项任务交给不知情的实习生的人的能力和理智,你可以告诉他们我是这么说的。我还会问一些严肃的问题,比如这行代码是如何在第一次和平中出现的,以及允许它保留下来的测试不充分。
我正在实习。 在这里,他们给了我一个 Android 应用程序的代码,该应用程序已由一家机构为代码安全性进行了修订,并告诉我更改文档中存在的一些要点。 现在他们担心信息泄露,因为应用程序在连接到银行服务器时不检查 SSL 证书,有 "Man In The Middle" 攻击的风险。
是否有任何 class 可用于检查证书的到期日期。或者它是否可信?
应用程序中的 http 连接示例:
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new CustomSSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams bhttpparams = new BasicHttpParams();
HttpProtocolParams.setVersion(bhttpparams, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(bhttpparams, "utf-8");
bhttpparams.setBooleanParameter("http.protocol.expect-continue", false);
HttpConnectionParams.setConnectionTimeout(bhttpparams, 20000);
HttpConnectionParams.setSoTimeout(bhttpparams, 200000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(bhttpparams, registry);
client = new DefaultHttpClient(ccm, bhttpparams);
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials("", ""));
HttpResponse response = client.execute(urlws);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"), 8);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
漏洞就在这里。删除它。
但我会质疑任何在没有适当的简报的情况下将这项任务交给不知情的实习生的人的能力和理智,你可以告诉他们我是这么说的。我还会问一些严肃的问题,比如这行代码是如何在第一次和平中出现的,以及允许它保留下来的测试不充分。