我们的团队抓取网站以使我们的信息保持最新。我遇到了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设置(运行该程序的服务器不会在OS级别禁用证书验证)。此外,如果我对图像和文档的请求被截获,我的代码将尝试分别将响应形成图像或pdf,并且不会启动任何恶意软件。是否存在我在某处遗漏的安全隐患?
答案 0 :(得分:4)
您面临的风险是恶意服务器可能会将您自己置于您与原始服务器之间(这是一种中间人攻击)。换句话说,您会认为您从真实服务器接收文档,但事实上您将从盗版服务器接收文档。所以它取决于文档的类型以及你用它们做什么......
答案 1 :(得分:0)
您可以禁用证书验证。您的通信仍然是安全的,您将无法验证服务器的身份。我没有看到任何问题。
答案 2 :(得分:0)
唯一真实的“拦截”场景是当客户端计算机位于随机位置的无线网络上时,例如,一家咖啡店。由于您的服务器显然没有刮,因此实际上禁用证书验证的风险为零。