【问题标题】:Securing a connection checking SSL Certificate?保护连接检查 SSL 证书?
【发布时间】:2015-02-04 08:58:10
【问题描述】:

我正在实习。 在这里,他们给了我一个 Android 应用程序的代码,该代码已由代码安全机构进行了修订,并告诉我更改文档中存在的一些要点。 现在他们担心信息泄露,因为应用程序在连接到银行服务器时没有检查 SSL 证书,从而面临“中间人”攻击的风险。

是否有任何类可以用来检查证书的到期日期。或者是否可信?

应用中的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);

【问题讨论】:

  • Android SSL 堆栈默认是安全的。只需丢弃任何自定义 SSL 内容并使用默认值。

标签: java android security ssl


【解决方案1】:

sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

漏洞就在这里。删除它。

但我会质疑任何人在没有适当简报的情况下将这项任务交给不知情的实习生的人的能力和理智,你可以告诉他们我是这么说的。我还会问一些严肃的问题,关于这行代码是如何在第一次和平中到达那里的,以及允许它保留的测试的不足。

【讨论】:

  • 通过自动删除它会检查证书是否过期,如果由证书颁发机构之一签名,检查服务器的域名是否与证书中的相同,并检查 CA 是否签署的证书是可信的?
  • 如果我把这个:sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
  • @Marvin 是的,是的,是的。无论如何,除了最终的受信任签名者检查之外,其他所有检查都会发生。无法回答您的第二个问题,但您应该可以从文档中自己解决。
  • 谢谢,我想我也得改一下trustStore.load(null, null);
猜你喜欢
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多