Java SSLHandshakeException: 处理空发行者 DN 证书错误
在处理javax.net.ssl.SSLHandshakeException异常时,可以尝试通过自定义X509TrustManager来忽略错误的证书验证。以下是一个示例代码:
import javax.net.ssl.*;
import java.security.cert.*;
public class IgnoreCertificateValidation {
public static void main(String[] args) {
try {
// 创建一个信任所有证书的TrustManager
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) {
}
}};
// 初始化SSL上下文
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
// 设置默认的SSLSocketFactory
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// 设置默认的HostnameVerifier
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
// 使用HttpClient发送请求
HttpClient client = new HttpClient();
// 设置SSLContext
client.getParams().setParameter(HttpClient.SSL_CONTEXT, sc);
// 发送请求...
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们创建了一个自定义的X509TrustManager,它会信任所有的证书。然后,我们使用这个TrustManager初始化了一个SSLContext,并将其设置为默认的SSLSocketFactory和HostnameVerifier。这样,就可以忽略证书验证错误。
请注意,忽略证书验证错误可能存在安全风险,因为这会使你的应用程序容易受到中间人攻击。只有在开发或测试环境中才应该使用此方法。在生产环境中,建议修复证书配置问题。
原文地址: https://www.cveoy.top/t/topic/qj6N 著作权归作者所有。请勿转载和采集!