RestTemplate调用POST类型HTTPS请求,忽略证书验证错误
要忽略'java.security.cert.CertificateParsingException: Empty issuer DN not allowed in X509Certificates'错误,可以通过自定义'RestTemplate'的方式来实现。
首先,创建一个'RestTemplate'的子类,并重写'createRequestFactory()'方法。在该方法中,创建一个'SSLContext'实例,并设置'TrustManager'来信任所有证书。
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
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 CustomRestTemplate extends RestTemplate {
@Override
protected SimpleClientHttpRequestFactory createRequestFactory() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory() {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
if (connection instanceof HttpsURLConnection) {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}}, null);
((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory());
((HttpsURLConnection) connection).setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
} catch (Exception e) {
// handle exception
}
}
super.prepareConnection(connection, httpMethod);
}
};
return requestFactory;
}
}
然后,在代码中使用该自定义的'RestTemplate'来发送POST请求。例如:
CustomRestTemplate restTemplate = new CustomRestTemplate();
String url = "https://your-url";
String requestBody = "your-request-body";
String response = restTemplate.postForObject(url, requestBody, String.class);
使用自定义的'RestTemplate'时,会忽略证书验证错误,但这也意味着连接不再安全,因此在生产环境中应谨慎使用。
原文地址: https://www.cveoy.top/t/topic/qwXl 著作权归作者所有。请勿转载和采集!