我需要忽略Java中的所有SSL证书,但我不能让我的生活让它工作。我已经查看了下面列出的以下页面,但似乎没有任何内容可用于每个https链接。
stackoverflow.com/questions/19517538/ignoring-ssl-certificate-in-apache-httpclient-4-3
stackoverflow.com/questions/13470998/ignoring-ssl-validation-in-java
stackoverflow.com/questions/12060250/ignore-ssl-certificate-errors-with-java
stackoverflow.com/questions/2694281/ignore-certificate-errors-when-requesting-a-url-in-java
stackoverflow.com/questions/6681969/java-ignore-certificate-validation
www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/
code.google.com/p/misc-utils/wiki/JavaHttpsUrl
www.exampledepot.8waytrips.com/egs/javax.net.ssl/TrustAll.html
www.obsidianscheduler.com/blog/ignoring-self-signed-certificates-in-java/
java.dzone.com/articles/how-ignore-cert-and-host-name
gist.github.com/henrik242/1510165
我有充分的理由需要这样做,所以不要担心,但我真的需要能够做到这一点。基本上,我需要浏览一个内部https链接列表并检查以确保它们仍然有效并且没有损坏的链接。一些链接工作正常,因为Java代码忽略了证书并且可以返回HTTP响应头,但是其他链接只是超时,即使它们在我的Web浏览器中正常工作。所有这些链接都是公司内部链接。
我尝试过使用HttpsURLConnection以及HttpGet和HttpClient。可能还有其他一些我没想到的东西,或者与Java无关的东西可能导致页面超时?我只是想确保链接的URL存在。以下是我得到的例外情况。
使用HttpGet / SSLContextBuilder / PoolingHttpClientConnectionManager:
org.apache.http.conn.HttpHostConnectException: Connect to -removed- [-removed-] failed: Connection timed out: connect
使用X509TrustManager使用HttpsUrlConnection:
java.net.ConnectException: Connection timed out: connect
具体来说,我根据上面发布的链接尝试了以下及其中的许多变体:
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
// Install the all-trusting trust manager
javax.net.ssl.SSLContext sc = null;
try {
sc = javax.net.ssl.SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new SecureRandom());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}
我也尝试了这个以及一些变体:https://stackoverflow.com/a/19950935/1727920
答案 0 :(得分:8)
连接超时与SSL证书没有任何关系。
您更有可能没有与浏览器相同的HTTP代理设置。您需要将系统属性http.proxyHost
和http.proxyPort
设置为浏览器使用的相同值。如果HTTPS代理设置与HTTP代理设置不同,请相应地设置https.proxyHost
和https.proxyPort
。
编辑为了完整性:许多旧资源错误地提到proxySet
属性。 JDK中没有也从未有过这样的属性。它出现在1997年短命且久违的HotJava Bean中。同样http.proxySet
也不存在。证明:在false
的情况下尝试将它们设置为true,
,并观察您的计划是否继续有效。