转载:http://blog.csdn.net/faye0412/article/details/6883879
我是遇到接入国外支付要访问https 检查证书时解决的问题!
问题的根本是:
缺少安全证书时出现的异常。
解决问题方法:
将你要访问的webservice/url....的安全认证证书导入到客户端即可。
以下是获取安全证书的一种方法,通过以下程序获取安全证书:
- /*
- * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of Sun Microsystems nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.security.KeyStore;
- import java.security.MessageDigest;
- import java.security.cert.CertificateException;
- import java.security.cert.X509Certificate;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLException;
- import javax.net.ssl.SSLSocket;
- import javax.net.ssl.SSLSocketFactory;
- import javax.net.ssl.TrustManager;
- import javax.net.ssl.TrustManagerFactory;
- import javax.net.ssl.X509TrustManager;
- public class InstallCert {
- public static void main(String[] args) throws Exception {
- String host;
- int port;
- char[] passphrase;
- if ((args.length == 1) || (args.length == 2)) {
- String[] c = args[0].split(":");
- host = c[0];
- port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
- String p = (args.length == 1) ? "changeit" : args[1];
- passphrase = p.toCharArray();
- } else {
- System.out
- .println("Usage: java InstallCert <host>[:port] [passphrase]");
- return;
- }
- File file = new File("jssecacerts");
- if (file.isFile() == false) {
- char SEP = File.separatorChar;
- File dir = new File(System.getProperty("java.home") + SEP + "lib"
- + SEP + "security");
- file = new File(dir, "jssecacerts");
- if (file.isFile() == false) {
- file = new File(dir, "cacerts");
- }
- }
- System.out.println("Loading KeyStore " + file + "...");
- InputStream in = new FileInputStream(file);
- KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
- ks.load(in, passphrase);
- in.close();
- SSLContext context = SSLContext.getInstance("TLS");
- TrustManagerFactory tmf = TrustManagerFactory
- .getInstance(TrustManagerFactory.getDefaultAlgorithm());
- tmf.init(ks);
- X509TrustManager defaultTrustManager = (X509TrustManager) tmf
- .getTrustManagers()[0];
- SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
- context.init(null, new TrustManager[] { tm }, null);
- SSLSocketFactory factory = context.getSocketFactory();
- System.out
- .println("Opening connection to " + host + ":" + port + "...");
- SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
- socket.setSoTimeout(10000);
- try {
- System.out.println("Starting SSL handshake...");
- socket.startHandshake();
- socket.close();
- System.out.println();
- System.out.println("No errors, certificate is already trusted");
- } catch (SSLException e) {
- System.out.println();
- e.printStackTrace(System.out);
- }
- X509Certificate[] chain = tm.chain;
- if (chain == null) {
- System.out.println("Could not obtain server certificate chain");
- return;
- }
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- System.in));
- System.out.println();
- System.out.println("Server sent " + chain.length + " certificate(s):");
- System.out.println();
- MessageDigest sha1 = MessageDigest.getInstance("SHA1");
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- for (int i = 0; i < chain.length; i++) {
- X509Certificate cert = chain[i];
- System.out.println(" " + (i + 1) + " Subject "
- + cert.getSubjectDN());
- System.out.println(" Issuer " + cert.getIssuerDN());
- sha1.update(cert.getEncoded());
- System.out.println(" sha1 " + toHexString(sha1.digest()));
- md5.update(cert.getEncoded());
- System.out.println(" md5 " + toHexString(md5.digest()));
- System.out.println();
- }
- System.out
- .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
- String line = reader.readLine().trim();
- int k;
- try {
- k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
- } catch (NumberFormatException e) {
- System.out.println("KeyStore not changed");
- return;
- }
- X509Certificate cert = chain[k];
- String alias = host + "-" + (k + 1);
- ks.setCertificateEntry(alias, cert);
- OutputStream out = new FileOutputStream("jssecacerts");
- ks.store(out, passphrase);
- out.close();
- System.out.println();
- System.out.println(cert);
- System.out.println();
- System.out
- .println("Added certificate to keystore 'jssecacerts' using alias '"
- + alias + "'");
- }
- private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
- private static String toHexString(byte[] bytes) {
- StringBuilder sb = new StringBuilder(bytes.length * 3);
- for (int b : bytes) {
- b &= 0xff;
- sb.append(HEXDIGITS[b >> 4]);
- sb.append(HEXDIGITS[b & 15]);
- sb.append(' ');
- }
- return sb.toString();
- }
- private static class SavingTrustManager implements X509TrustManager {
- private final X509TrustManager tm;
- private X509Certificate[] chain;
- SavingTrustManager(X509TrustManager tm) {
- this.tm = tm;
- }
- public X509Certificate[] getAcceptedIssuers() {
- throw new UnsupportedOperationException();
- }
- public void checkClientTrusted(X509Certificate[] chain, String authType)
- throws CertificateException {
- throw new UnsupportedOperationException();
- }
- public void checkServerTrusted(X509Certificate[] chain, String authType)
- throws CertificateException {
- this.chain = chain;
- tm.checkServerTrusted(chain, authType);
- }
- }
- }
编译InstallCert.java,然后执行:java InstallCert hostname,比如:
java InstallCert www.twitter.com
会看到如下信息:
- java InstallCert www.twitter.com
- Loading KeyStore /usr/java/jdk1.6.0_16/jre/lib/security/cacerts...
- Opening connection to www.twitter.com:443...
- Starting SSL handshake...
- 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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
- at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
- at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
- at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
- at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)
- at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
- at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
- at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
- at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
- at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
- at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)
- at InstallCert.main(InstallCert.java:63)
- 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:221)
- at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
- at sun.security.validator.Validator.validate(Validator.java:203)
- at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
- at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)
- at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
- at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)
- ... 7 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:236)
- at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
- at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
- ... 13 more
- Server sent 2 certificate(s):
- 1 Subject CN=www.twitter.com, O=example.com, C=US
- Issuer CN=Certificate Shack, O=example.com, C=US
- sha1 2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7
- md5 dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54
- 2 Subject CN=Certificate Shack, O=example.com, C=US
- Issuer CN=Certificate Shack, O=example.com, C=US
- sha1 fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6
- md5 72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68
- Enter certificate to add to trusted keystore or 'q' to quit: [1]
输入1,回车,然后会在当前的目录下产生一个名为“ssecacerts”的证书。
将证书拷贝到$JAVA_HOME/jre/lib/security目录下,或者通过以下方式:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径");
注意:因为是静态加载,所以要重新启动你的Web Server,证书才能生效。
参考知识:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html
相关推荐
分析: 当在Java中使用URL.openConnection().connect()方法进行HTTPS请求时,如果遇到PKIX path building failed... 参考资源中《验证证书unable to find valid certification path to requested target问题解决.txt》
##ERROR: Cause: unable to find valid certification path to requested target终极解决方法 各位兄弟,觉得我的方法有用,可以赞我一下的呦 如果你是和我一样安装完Android studio,运行第一个Android程序,发现...
总之,解决" Cause: unable to find valid certification path to requested target "问题需要从多个角度进行排查,包括检查网络设置、调整仓库源、更新环境等。通过耐心尝试,大多数情况下都能找到合适的解决方案。...
参考: ...目录 一、更改镜像 二、手动将需要的插件和依赖下载放到本地厂库 三、下载阿里网站的资格证书,安装到jdk 四、设置maven的VM属性,这个...从https://start.spring.io/生成的spring boot项目,报错unable to f
手抖了一下,把AS升级到了最新版本,然后就悲剧了,公司的项目跑不起来,提示“unable to find valid certification”,新建项目也是一样的提示。之前总结的解决方案都用了,没一个好使的,经过两个下午的折腾,终于...
解决Android Studio Cause: unable to find valid certification path to requested target问题所需要证书。具体安装方法请参考https://blog.csdn.net/wanghaifeng068/article/details/99935593
Studio升级3.5报unable to find valid certification path to requested target 解决证书问题
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
解决方法: ... sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
5.1、解决报错:unable to find valid certification path to requested target。 5.2、解决报错:Server returned HTTP response code: 403 for URL。 若下载下来有合并需求的,可以看下合并工具:...
"InstallCert.zip"这个文件和其描述"mvn PKIX path building failed: 进行中央库授权, unable to find valid certification path to requested target"揭示了一个常见的问题:在使用Maven进行构建时,由于缺少信任...
unable to find valid certification path to requested target 处理这种情况的常用 Java 方法是下载站点证书,将其导入密钥库并通过-Djavax.net.ssl.trustStore=... JVM 选项使用该密钥库。 有时
demo项目sync报错unable to find valid certification path to requested target:修改项目级gradle里指定的IDE版本com.android.tools.build:gradle:x.x.x成自己的,然后把阿里云的链接换成google()和jcenter(),...
unable to find valid certification path to requested target ``` 这个错误表明Java在尝试建立SSL/TLS连接时无法验证服务器提供的证书。这通常是由于缺少正确的中间证书或根证书,或者这些证书没有正确安装在Java...
当Java程序尝试通过HTTPS连接到使用Wosign根证书签名的服务时,如Azure的REST API,可能会收到错误信息“PKIX:unable to find valid certification path to requested target”。这是因为Java的标准JRE库(JDK)的...
这个错误的主要原因是ValidatorException:PKIX path building failed : sun.security.provider.certpath.SunCertPathBuilderException : unable to find valid certification path to requested target。...
- 如果遇到“unable to find valid certification path to requested target”错误,检查`JAVA_HOME`是否指向正确的JDK,并且证书已正确导入`cacerts`。 7. **单点登录和单点退出**: - 单点登录允许用户登录一次...
具体表现为:“PKIX:unable to find valid certification path to requested target”。这是因为Java应用程序在进行HTTPS请求时,会依赖JDK自带的信任根证书来验证服务端证书的有效性。如果服务端所使用的根证书...