要忽略'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'时,会忽略证书验证错误,但这也意味着连接不再安全,因此在生产环境中应谨慎使用。

RestTemplate调用POST类型HTTPS请求,忽略证书验证错误

原文地址: https://www.cveoy.top/t/topic/qwXl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录