前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决PKIX问题:unable to find valid certification path to requested target【X509TrustManager】

解决PKIX问题:unable to find valid certification path to requested target【X509TrustManager】

作者头像
奋飛
发布2019-08-15 16:03:13
2.2K0
发布2019-08-15 16:03:13
举报
文章被收录于专栏:Super 前端Super 前端

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://ligang.blog.csdn.net/article/details/43065295

2014年11月份曾经调研过关于PKIX问题,当时总结的方案为,通过一个JAVA类InstallCert去生成一个名为jssecacerts的证书,将名为jssecacerts的证书拷贝\\%JAVA_HONME%\\jre\\lib\\security\\目录中,每次进行上述操作都需要重启对应的tomcat服务,无形间给这种对应方式带来了一些工作量。 最近,又在网上看了许多关于类似PKIX问题的文章,发现了一种通过X509TrustManager绕过https认证的一种方式,拿了几个网站做例子,果然可以实现! 下面为实现的方式:

import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.CertificateException;

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;
import javax.security.cert.X509Certificate;
/**
 * How to ignore PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
 */
public class HttpsUtil {
	/**
	 * 此方法可以绕过安全访问所需要的证书
	 * @param httpsUrl 安全请求页面地址
	 * @return
	 * @throws Exception
	 */
	public static URLConnection detourHttps(String httpsUrl)throws Exception{
		/*
		 * fix for Exception in thread "main"
		 * 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
		 */
		TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return null;
			}

			public void checkClientTrusted(X509Certificate[] certs,
					String authType) {
			}

			public void checkServerTrusted(X509Certificate[] certs,
					String authType) {
			}

			@Override
			public void checkClientTrusted(
					java.security.cert.X509Certificate[] arg0, String arg1)
					throws CertificateException {
			}

			@Override
			public void checkServerTrusted(
					java.security.cert.X509Certificate[] arg0, String arg1)
					throws CertificateException {
			}
		} };

		SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

		// Create all-trusting host name verifier
		HostnameVerifier allHostsValid = new HostnameVerifier() {
			public boolean verify(String hostname, SSLSession session) {
				return true;
			}
		};

		// Install the all-trusting host verifier
		HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);	
		URL url = new URL(httpsUrl);
		URLConnection con = url.openConnection();
		return con;
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年01月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档