我们的团队会抓取网站以使我们的信息保持最新。我在抓取 HTTPS 页面时遇到了安全异常。问题是 Java 在接受来自页面的自签名证书时遇到问题。
我没有保留要接受的证书列表(将来可能难以维护),而是使用 neu242 提供的解决方法来禁用 SSL 证书验证。
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,并且不会启动任何恶意软件。我在某处遗漏了安全风险吗?