http请求绕过https的ssl证书

报错信息:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
ubable to find valid certification path to requested garget

网上有好多种解决办法,都一一试了下并没有直接解决该问题;
我遇到的问题是在本地电脑环境上使用httpClient 调用https接口正常,但是在服务器中就报以上异常。
根据网上搜索到大部分解决思路是 根据 SSLContextBuilder创建httpClient 方向是正确的,但是有的是创建时获取系统默认的证书方式绕过ssl证书验证(我系统上要是访问接口的ssl证书就不报上面的异常了)。
在这说下我本地电脑环境为什么可以访问接口成功但是服务器中不可以,因为之前我在浏览器中调试过,浏览器自动把该接口的ssl证书下载到系统当中了,所以才可以。


/**
* 忽略SSL证书的HTTP Client
* @return
*/
public static CloseableHttpClient createIgnoreSSLHttpClient(){
	try{
		SSLContext sslContext = SSLContextBuilder
				.create()
				.setTrustManagers(DefaultTrustManagers.INSTANCE)
				.build();
		SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE);
		return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();
	}catch(Exception e){
		//打印 创建忽略SSL证书的HTTP Client 异常日志
	}
	return HttpClient.createDefault();
}



    /**
     * http post 请求
     * @param url
     * @param json
     * @param token
     * @return
     */
    public static String doPost(String url,String json,String token){
        
        CloseableHttpClient httpClient = createIgnoreSSLHttpClient();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            //创建Http post请求
            HttpPost httpPost = new HttpPost(url);
            // 如果不需传token验证则无需该行代码
            httpPost.setHeader("Authorization",token);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            //执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(),"utf-8");
        }catch (Exception e){
    
            //HttpClient--post请求异常日志
        }finally {
            close(response,httpClient);
        }
        return resultString;
    }

	/**
     * 关闭流
     * @param response
     * @param httpClient
     */
    public static void close(CloseableHttpResponse response,CloseableHttpClient httpClient){
        try {
            if(response != null){
                response.close();
            }
            if(httpClient != null){
                httpClient.close();
            }
        }catch (Exception e){
            // msg 关闭流异常日志
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我不建议您在生产环境中绕过SSL证书进行Java HTTPS请求。这是因为SSL证书是保护数据传输安全的重要组成部分,绕过它可能导致安全漏洞。如果您确实需要在测试环境中绕过SSL证书,可以使用以下代码: ```java import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class HttpsClient { public static void main(String[] args) throws Exception { // 创建信任管理器 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} public X509Certificate[] getAcceptedIssuers() { return null; } } }; // 创建SSL上下文 SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // 设置HTTPS连接的默认上下文 HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); // 创建主机名验证器 HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { return true; } }; // 设置主机名验证器 HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); // 发送HTTPS请求 URL url = new URL("https://example.com"); HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); InputStream is = con.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } reader.close(); } } ``` 这段代码创建了一个信任所有证书的信任管理器,并将其设置为HTTPS连接的默认上下文。同时,它还创建了一个主机名验证器,该验证器接受所有主机名。请注意,这段代码仅适用于测试环境,并且不应在生产环境中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值