URL myUrl = new URL("https://www.....");
网站的 SSL 证书已过期。如何避免它并使 URL() 起作用?
你应该建立一个TrustManager
包装默认的信任管理器,捕获CertificiateExpiredException并忽略它。
注:详见这个答案,这是否安全很大程度上取决于实现。特别是,它依赖于在正确检查其他所有内容之后最后完成的日期验证。
沿着这些思路的东西应该有效:
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
tmf.init((KeyStore)null);
TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];
TrustManager[] wrappedTrustManagers = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return origTrustmanager.getAcceptedIssuers();
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
origTrustmanager.checkClientTrusted(certs, authType);
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
try {
origTrustmanager.checkServerTrusted(certs, authType);
} catch (CertificateExpiredException e) {}
}
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, wrappedTrustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
信托经理抛出CertificateExceptions(有关详细信息,请参阅子类)当证书出现问题时。具体说明您想要捕获/忽略的内容。您真正想要验证的所有内容都必须在您捕获的内容可能被抛出之前进行检查,否则您也必须手动验证它。任何比这更轻松的操作(特别是不执行任何操作,因此不会抛出任何异常)将完全忽略证书验证和验证,这与使用匿名密码套件或忽略身份验证大致相同。这将违背使用 SSL/TLS 的安全目的(而不是在到期日上稍微灵活一点)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)