【发布时间】:2012-10-12 22:17:45
【问题描述】:
此代码连接到 HTTPS 站点,我假设我没有验证证书。但是为什么我不必为该站点在本地安装证书呢?我不应该在本地安装证书并为该程序加载它还是在幕后下载?客户端到远程站点之间的流量是否仍在加密传输中?
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class TestSSL {
public static void main(String[] args) throws Exception {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
final SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
URL url = new URL("https://www.google.com");
URLConnection con = url.openConnection();
final Reader reader = new InputStreamReader(con.getInputStream());
final BufferedReader br = new BufferedReader(reader);
String line = "";
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} // End of main
} // End of the class //
【问题讨论】:
-
这种完全不安全的
TrustManager实现甚至不符合它自己的规范。检查 Javadoc。 -
@EliteOctagon 不要在生产代码中使用它!这个 TrustManager 会简单地忽略无效的证书并使 MITM 攻击变得非常容易。
-
谢谢@binwiederhier,我会记住这一点。这甚至适用于没有人会看到的 URL,因为它们是只有我知道的?你能详细说明一下这种情况下的中间人攻击吗?
-
@EliteOctagon 这取决于数据包的传输位置,而不是 URL 是否公开。关于 MITM,我写了两篇博文:blog.philippheckel.com/2013/07/01/… 或 blog.philippheckel.com/2013/08/04/…
-
在帖子中,您必须安装受信任的 CA 才能使其工作。使用上面的信任管理器,这是没有必要的;所以这个信任经理真的很危险!