出现“javax.net.ssl.SSLHandshakeException: 链验证失败”异常通常表示SSL证书验证失败。这可能是由于证书过期、证书不可信或证书链不完整引起的。下面是一个解决该问题的代码示例:
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class SSLUtils {
// 创建一个自定义的TrustManager,用于信任所有证书
private static TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
public static void disableCertificateValidation() {
try {
// 创建一个信任所有证书的SSLContext
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
// 设置默认的SSLSocketFactory和HostnameVerifier
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// 禁用证书验证
disableCertificateValidation();
// 创建URL对象
URL url = new URL("https://example.com");
// 打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法
connection.setRequestMethod("GET");
// 获取响应码
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 关闭连接
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我们创建了一个自定义的TrustManager,它信任所有类型的证书。然后,我们创建了一个信任所有证书的SSLContext,并使用它禁用了证书验证。最后,我们使用禁用证书验证的连接打开了一个URL,并获取了响应码。
请注意,禁用证书验证可能会存在安全风险,因此在生产环境中应该避免使用。如果可能的话,您应该修复证书验证问题,而不是直接禁用它。