Java程序禁用SSL认证的安全风险
Posted
技术标签:
【中文标题】Java程序禁用SSL认证的安全风险【英文标题】:Security risks in disabling SSL certification for Java program 【发布时间】:2012-10-16 02:30:14 【问题描述】:我们的团队会抓取网站以使我们的信息保持最新。我遇到了security exceptions when crawling HTTPS pages。问题是 Java 在接受来自页面的自签名证书时遇到问题。
我没有保留要接受的证书列表(将来可能难以维护),而是使用由 neu242 提供给disable SSL certification validation 的解决方法。
public static void disableCertificateValidation()
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]
new X509TrustManager()
public X509Certificate[] getAcceptedIssuers()
return new X509Certificate[0];
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException
// TODO Auto-generated method stub
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException
// TODO Auto-generated method stub
;
// Ignore differences between given hostname and certificate hostname
HostnameVerifier hv = new HostnameVerifier()
@Override
public boolean verify(String arg0, SSLSession arg1)
// TODO Auto-generated method stub
return true;
;
// Install the all-trusting trust manager
try
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
catch (Exception e)
当然,这会带来重大的安全风险。但是,如果我只将此代码与我的下载程序(下载图像和 pdf 文档的程序)一起使用,并且我没有使用该程序发送任何敏感信息,那么存在哪些安全风险?据我了解,此信任管理器将仅为正在运行的 JVM 设置(运行该程序的服务器不会在操作系统级别禁用证书验证)。此外,如果我对图像和文档的请求被截获,我的代码将尝试将响应分别形成图像或 pdf,并且不会启动任何恶意软件。是否存在我在某处遗漏的安全风险?
【问题讨论】:
【参考方案1】:您面临的风险是恶意服务器可能会将自己置于您和源服务器之间(这是一种中间人攻击)。换句话说,您会认为您从真实服务器接收文件,但实际上您会从盗版服务器接收文件。因此,这取决于文档的类型以及您对它们的处理方式......
【讨论】:
是的,这也是我唯一能想到的。这些文档是电器和其他产品的标准用户指南和手册,但无论出于何种原因,一些制造商选择只允许通过 HTTPS 传输它们。 https 是个好东西!只有证书分发的概念被彻底打破......【参考方案2】:您可以禁用证书验证。您的通信仍然是安全的,您只是无法验证服务器的身份。我没有发现任何问题。
【讨论】:
它仍然会被加密。但是服务器的身份不再验证,所以这会带来另一个安全问题。 @twall 没错,但是如果我尝试将响应转换为 pdf 或图像,是否存在运行恶意软件的风险? 您在与未知方交换机密数据时“没有发现任何问题”? 嗯,他们正在尝试抓取自签名证书。到那时,它已经是一个不知名的派对。他说它不用于发送任何敏感信息。基于这些参数,我没有看到任何问题。通信仍将被加密。【参考方案3】:唯一现实的“拦截”场景是客户端计算机在随机位置的无线网络上,例如一家咖啡店。由于您的抓取服务器显然不是,因此实际上禁用证书验证的风险为零。
【讨论】:
以上是关于Java程序禁用SSL认证的安全风险的主要内容,如果未能解决你的问题,请参考以下文章