解决SSLHandshakeException:PKIX path building failed

加了证书之后,调用https的请求,不受信任,就会报如下错误信息:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
	at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
	at cn.com.webservice.util.HttpRequestUtil.sendGet(HttpRequestUtil.java:149)
	at cn.com.webservice.WeChat.AccessTokenTest.main(AccessTokenTest.java:15)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
	at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
	at sun.security.validator.Validator.validate(Validator.java:260)
	at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
	at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
	at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
	... 12 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
	at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
	at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)

解决方法是信任所有SSL证书,所以在每次https请求的时候,忽略掉证书就可以了
SslUtils.java

package cn.com.webservice.WeChat.util;

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.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 * 
 * @author Miss.Ru
 *
 */
public class SslUtils {
	private static void trustAllHttpsCertificates() throws Exception {
    TrustManager[] trustAllCerts = new TrustManager[1];
    TrustManager tm = new miTM();
    trustAllCerts[0] = tm;
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, null);
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
 
static class miTM implements TrustManager,X509TrustManager {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
 
    public boolean isServerTrusted(X509Certificate[] certs) {
        return true;
    }
 
    public boolean isClientTrusted(X509Certificate[] certs) {
        return true;
    }
 
    public void checkServerTrusted(X509Certificate[] certs, String authType)
            throws CertificateException {
        return;
    }
 
    public void checkClientTrusted(X509Certificate[] certs, String authType)
            throws CertificateException {
        return;
    }
}
 
/**
 * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
 * @throws Exception
 */
public static void ignoreSsl() throws Exception{
    HostnameVerifier hv = new HostnameVerifier() {
        public boolean verify(String urlHostName, SSLSession session) {
            System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
            return true;
        }
    };
    trustAllHttpsCertificates();
    HttpsURLConnection.setDefaultHostnameVerifier(hv);
 }
}

测试SslUtils
HttpRequestUtil.java

/**
 * http请求工具类
 * @author Mr.Ru
 * @create 2018-08-29 10:12
 */
public class HttpRequestUtil {

 /**
	* 向指定URL发送GET方法的请求
    *
	* @param requestUrl 发送请求的URL
	* @param param      请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
    * @return URL 所代表远程资源的响应结果
	* @throws Exception 
     */
    public static String sendGet(String requestUrl, String param) throws Exception  {
    	 
    	URL u = new URL(requestUrl);
    	//注意:重点知识,此句判断用于信任所有的https请求
    	if("https".equalsIgnoreCase(u.getProtocol())){
    	   //测试SslUtils
            SslUtils.ignoreSsl();
        }
        String result = "";
        BufferedReader in = null;
        try {
            String urlString = requestUrl + "?" + param;
            URL url = new URL(urlString);
            // 打开和URL之间的连接
            URLConnection connection = url.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }
}

当你再次调用https请求的时候,就可以请求成功啦~
亲测有效~

package cn.com.webservice.WeChat;
import cn.com.webservice.util.HttpRequestUtil;

public class AccessTokenTest {
	public static void main(String[] args) throws Exception{
	
        String corpid="wxf9291cddfe5";//企业微信id           
		String corpsecret="InWpADosVs7RXG5MwBl8TSTsZ0khvzSK2LQ0";//应用密钥
		 String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
        String param = "corpid=" + corpid + "&corpsecret=" + corpsecret;
        
        String result = HttpRequestUtil.sendGet(url, param);
        System.out.println(result);
    }
}

### 使用 Navicat 导入 Excel 数据至 MySQL 数据库 为了将 Excel 中的数据导入到已创建好的 MySQL 数据库表中,需确保 Excel 文件的第一行包含字段名,并且这些字段名应与目标数据库表中的字段相对应[^1]。 #### 准备工作 确认所使用的 Navicat 版本支持连接到 MySQL 并能够执行数据传输功能。此外,保证 Excel 文档保存路径无误并可被正常访问。 #### 开始导入过程 当准备就绪后,在 Navicat 的对象浏览器里定位到想要填充数据的目标表上点击鼠标右键菜单选项“导入向导”,这一步骤启动了图形化的交互界面来指导完成整个流程[^2]。 在弹出窗口中选择源文件类型为 Microsoft Excel (*.xls; *.xlsx),随后浏览选取待上传的具体文档位置。对于含有日期类型的单元格内容,务必核对其格式设置以匹配数据库预期接收的标准形式;否则可能导致解析失败或丢失精度等问题发生[^3]。 #### 字段映射配置 随着导航逐步推进直至到达字段映射环节时,仔细对照两侧列表项——左侧代表来自电子表格里的原始列标题而右侧则是目的端关系型存储结构内的属性标识符。通过拖拽连线方式建立起两者间一对一关联关系,即使它们之间存在排列次序差异也完全不影响最终效果呈现[^4]。 一旦所有必要的参数均已设定完毕,则继续前进直到遇到最后确认提示处停止。此时再次审视各项细节确保万无一失后再按下“完成”按钮正式提交任务请求给后台处理引擎去执行实际迁移动作。 ```sql -- 示例 SQL 语句用于验证导入后的记录数是否正确 SELECT COUNT(*) FROM your_table_name; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值