JavaSpring:如何向https URL发送http请求?

JavaSpring:如何向https URL发送http请求?,java,spring,rest,ssl,https,Java,Spring,Rest,Ssl,Https,我必须向一些没有任何参数的API发送GET请求,因此我编写了代码: public Boolean getData(String apiUrl) { try { RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.cl

我必须向一些没有任何参数的API发送GET请求,因此我编写了代码:

public Boolean getData(String apiUrl) {

        try {
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);

            if (responseEntity.getStatusCode().toString().equals("200")) {
                theLogger.info("Server successfully answered with response code: {} - {}", responseEntity.getStatusCode().toString(), responseEntity.getBody());
                return true;
            } else {
                theLogger.error("Something goes wrong! Server answered with response code: {} and error: {}", responseEntity.getStatusCode().toString(), responseEntity.getBody());
                return false;
            }

        } catch (Exception theException) {
            theException.printStackTrace();
            theLogger.error("Cannot send channelInfo! Exception: " + theException);
            return false;
        }

}
public Boolean getData(字符串apirl){
试一试{
RestTemplate RestTemplate=新RestTemplate();
ResponseEntity ResponseEntity=restTemplate.getForEntity(apiUrl,String.class);
if(responseEntity.getStatusCode().toString().equals(“200”)){
info(“服务器已成功响应,响应代码:{}-{}”,responseEntity.getStatusCode().toString(),responseEntity.getBody());
返回true;
}否则{
logger.error(“出现了问题!服务器用响应代码:{}和错误:{},responseEntity.getStatusCode().toString(),responseEntity.getBody()进行了响应);
返回false;
}
}捕获(异常){
异常。printStackTrace();
logger.error(“无法发送channelInfo!异常:+theException”);
返回false;
}
}
它在API url为HTTP时工作,但不适用于HTTPS。它说:

sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径

我相信这是因为我的代码不信任此证书。但我不知道该怎么处理它?API是公共的,它可以在任何web浏览器中打开—它只是一些https站点。我简直不敢相信我应该下载我使用的所有https站点的证书,并将这些证书添加到某个地方。我相信这应该是信任这些公共网站的更普遍的方式。

我找到了答案 所以,如果您必须处理由不受信任的CA颁发的证书,但在您的情况下,您并不真正关心信任。您可以通过以下代码禁用SSL证书验证:

import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class SSLCertificateValidation {

    public static void disable() {
        try {
            SSLContext sslc = SSLContext.getInstance("TLS");
            TrustManager[] trustManagerArray = { new NullX509TrustManager() };
            sslc.init(null, trustManagerArray, null);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private static class NullX509TrustManager implements X509TrustManager {
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            System.out.println();
        }
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            System.out.println();
        }
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

    private static class NullHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

}
在进行HTTPS调用之前调用SSLCertificateValidation.disable()。

我找到了答案 所以,如果您必须处理由不受信任的CA颁发的证书,但在您的情况下,您并不真正关心信任。您可以通过以下代码禁用SSL证书验证:

import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class SSLCertificateValidation {

    public static void disable() {
        try {
            SSLContext sslc = SSLContext.getInstance("TLS");
            TrustManager[] trustManagerArray = { new NullX509TrustManager() };
            sslc.init(null, trustManagerArray, null);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private static class NullX509TrustManager implements X509TrustManager {
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            System.out.println();
        }
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            System.out.println();
        }
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

    private static class NullHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

}
在进行HTTPS调用之前调用SSLCertificateValidation.disable()