“PKIX路径构建失败”和“无法找到请求目标的有效证书路径”

时间:2014-01-12 15:04:46

标签: java jsp servlets twitter4j

我正在尝试使用 twitter4j 库为我的java项目发送推文。在我第一次运行时,我收到有关证书sun.security.validator.ValidatorExceptionsun.security.provider.certpath.SunCertPathBuilderException的错误消息。然后我通过以下方式添加了twitter证书:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

但没有成功。以下是获取噱头的程序:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("Total amount of tweets: " + result.getTweets().size());
        List<Status> tweets = result.getTweets();

        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to search tweets: " + te.getMessage());
    }

这是错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: 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(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 more
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(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

41 个答案:

答案 0 :(得分:384)

  1. 转到firefox浏览器中的URL,单击HTTPS证书链(URL地址旁边)。点击"more info" > "security" > "show certificate" > "details" > "export.."。选择名称并选择文件类型example.cer。现在你有了keystore的文件,你必须将它添加到你的JVM

  2. 确定cacerts文件的位置,例如。 C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. 接下来,在命令行中将example.cer文件导入cacerts:

  4. keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

    系统会要求您输入默认密码为changeit

    的密码

    重新启动JVM / PC。

    源: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

答案 1 :(得分:71)

在尝试构建证书文件以使我的Java 6安装与新的twitter证书一起工作数小时后,我终于偶然发现了一个非常简单的解决方案,其中包含一个留言板中的注释。只需从Java 7安装中复制cacerts文件并覆盖Java 6安装中的文件即可。可能最好先备份cacerts文件,但是你只需要复制新的文件和BOOM!它只是有效。

请注意,我实际上已将Windows cacerts文件复制到Linux安装上,并且工作正常。

该文件位于新旧Java jdk安装中的jre/lib/security/cacerts

希望这可以拯救别人几个小时的恶化。

答案 2 :(得分:23)

我偶然发现这个需要花费数小时研究才能解决的问题,特别是使用自动生成的证书,与官方证书不同,它们非常棘手,而且Java不太喜欢它们。

请检查以下链接:Solve Problem with certificates in Java

基本上,您必须将证书从服务器添加到Java Home证书。

  1. 生成或获取证书并配置Tomcat以在Servers.xml中使用它
  2. 下载类InstallCert的Java源代码并在服务器运行时执行它,提供以下参数server[:port]。不需要密码,因为原始密码适用于Java证书(“changeit”)。
  3. 程序将连接到服务器,Java将抛出异常,它将分析服务器提供的证书,并允许您在执行程序的目录中创建jssecerts文件(如果执行Eclipse然后确保在Run -> Configurations)中配置Work目录。
  4. 将该文件手动复制到$JAVA_HOME/jre/lib/security
  5. 执行这些步骤后,与证书的连接将不再在Java中生成异常。

    以下源代码很重要,它从(Sun)Oracle博客中消失,我发现它唯一的页面是在提供的链接上,因此我将其附在答案中以供参考。

    /*
     * 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.
     */
    /**
     * Originally from:
     * http://blogs.sun.com/andreas/resource/InstallCert.java
     * Use:
     * java InstallCert hostname
     * Example:
     *% java InstallCert ecc.fedora.redhat.com
     */
    
    import javax.net.ssl.*;
    import java.io.*;
    import java.security.KeyStore;
    import java.security.MessageDigest;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    /**
     * Class used to add the server's certificate to the KeyStore
     * with your trusted certificates.
     */
    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 [: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);
            }
        }
    }
    

答案 3 :(得分:22)

我的UI方法:

  1. 下载http://www.keystore-explorer.org/
  2. 打开$ JAVA_HOME / jre / lib / security / cacerts
  3. 输入PW:changeit(可以在Mac上更改)
  4. 导入.crt文件
  5. CMD线:

    1. keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
    2. 输入PW:changeit(可以在Mac上更改)

答案 4 :(得分:10)

当我的系统上存在JDK和JRE 1.8.0_112时,情况略有不同。

我使用已知的命令将新的CA证书导入[JDK_FOLDER]\jre\lib\security\cacerts

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

尽管如此,我仍然得到了相同的 PKIX路径构建失败错误。

我使用java -Djavax.net.debug=all ... > debug.log将调试信息添加到java CLI。在debug.log文件中,以 trustStore开头的行是:实际指向[JRE_FOLDER]\lib\security\cacerts中的cacerts存储。

在我的情况下,解决方案是将JDK(添加了新CA)使用的cacerts文件复制到JRE使用的文件上并修复了问题。

答案 5 :(得分:10)

1。检查证书

尝试在浏览器中加载目标网址并查看网站的证书(通常可以通过带有锁定标志的图标访问该网站。它位于浏览器的左侧或右侧#39;地址栏)是否因其他原因而过期或不受信任。

2。安装最新版本的JRE和JDK

新版本通常附带更新的可信证书集。

如果可能,请卸载旧版本。这将使错误配置错误显而易见。

3。检查您的配置:

  • 检查JAVA_HOME环境变量指向的位置。
  • 检查用于运行程序的java版本。在IntelliJ检查中:
    • 文件 - &gt;项目结构...... - &gt;项目设置 - &gt;项目 - &gt; Project SDK:
    • 文件 - &gt;项目结构...... - &gt;平台设置 - &gt;的SDK

4。从新Java版本

复制整个密钥库

如果您使用JDK以外的最新版本进行开发 - 请尝试将%JAVA_HOME%/jre/lib/security/cacerts文件替换为最新安装的JRE中的新文件(首先制作备份副本),如@ jeremy-goodell在他的{{ {3}}

5。将证书添加到密钥库

如果以上没有解决您的问题,请使用keytool将证书保存到Java的密钥库中:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

带有证书的文件可以通过@MagGGG在他的answer中建议从浏览器获取。

注意1:您可能需要对链接到您站点证书的每个证书重复此操作。从根目录开始。

注2:<alias_name>在商店中的密钥中应该是唯一的,或者keytool会显示错误。

要获取您可能运行的商店中所有证书的列表:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

如果出现问题,这将有助于您从商店中删除证书:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

答案 6 :(得分:7)

我想导入smtp.gmail.com证书

只有解决方案对我有用 1.输入命令以查看此证书

  

D:\ openssl \ bin \ openssl.exe s_client -connect smtp.gmail.com:465

  1. 复制并保存&#34; ----- BEGIN CERTIFICATE -----&#34;和&#34; -----结束证书-----&#34;进入文件,gmail.cer

  2. 运行

      

    keytool -import -alias smtp.gmail.com -keystore   &#34;%JAVA_HOME%/ JRE / LIB /安全/ cacerts中&#34; -文件   C:\用户\管理员\桌面\ gmail.cer

  3. 输入密码 chageit

  4. 单击“是”以导入证书

  5. 重启java

  6. 现在运行命令,你很高兴

答案 7 :(得分:6)

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

用于跳转证书验证。

答案 8 :(得分:6)

Mac

接受的答案不适用于 Mac,因为 Mac(Chrome 或 Firefox)中没有 Export 按钮可用。请检查 this answer 以下载证书并按照下面提到的后续步骤进行操作:

  1. 列出安装在密钥库中的所有证书
cd $JAVA_HOME/jre/lib/security
keytool -list -keystore cacerts

keystore 的默认密码是:changeit

  1. 在密钥库中导入证书之前,请备份密钥库
sudo cp cacerts cacerts.bak
  1. 在密钥库中导入下载的证书
sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts
  1. 检查证书是否存储在密钥库中
sudo keytool -list -keystore cacerts -alias youralias

如果您想查看更详细的信息,请添加 -v 标志:

sudo keytool -v -list -keystore cacerts -alias youralias

答案 9 :(得分:5)

问题背景:

当我尝试在我的项目中运行mvn clean install并通过Netbeans IDE clean和build选项时,我遇到了以下错误。 此问题是由于我们通过NET beans IDE /通过命令提示符下载时无法使用证书,但能够通过浏览器下载文件。

错误

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

解决:

<强> 1。下载相关网址的证书:

  • 通过“以管理员身份运行”启动IE(否则,我们将无法下载证书)
  • 在IE-&gt;中输入网址https://url/local-repo (在我的情况下,这个网址有一个不受信任的证书enter image description here。)
  • 点击证书错误 - &gt;下载证书;查看证书
  • 选择详细信息标签 - &gt;复制到文件 - &gt;下一个 - &gt;选择“DER编码二进制X.509(.CER)
  • 将证书保存在某个位置,例如:c:/user/sheldon/desktop/product.cer
  • 恭喜!您已成功下载该站点的证书

<强> 2。现在安装密钥库以解决问题。

  • 运行keytool命令将下载的密钥库附加到    现有证书文件。
  • 命令:在jdk(JAVA_HOME)的bin文件夹中的命令下面
  

C:\ Program Files \ Java \ jdk1.8.0_141 \ jre \ bin&gt; keytool -importcert -file   “C:/user/sheldon/desktop/product.cer” - alias product -keystore   “C:/ Program Files / Java / jdk1.8.0_141 / jre / lib / security / cacerts”。

  • 系统将提示您输入密码。输入密钥库密码: 再次为“信任此证书?[否]:”输入“changeit”,输入 “是”

示例命令行命令/输出:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats!现在你应该摆脱Netbeans IDE中的“PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException”错误。

答案 10 :(得分:4)

这不是特定于Twitter的答案,但这是您在搜索此错误时出现的问题。如果您的系统在连接到在网络浏览器中查看时显示有效证书的网站时收到此错误,则可能表示该网站的证书链不完整

有关问题的简短摘要:证书颁发机构不会使用其根证书签署任何旧证书。相反,他们(通常)签署中间证书,这些证书也设置了证书颁发机构标志(即允许签署证书)。然后,当您从CA购买证书时,他们会使用其中一个中间证书对您的CSR进行签名。

您的Java信任存储很可能只有根证书,而不是中间证书。

配置错误的网站可能会返回 其签名的证书。问题:它是使用不在您的信任库中的中间证书签署的。浏览器将通过下载或使用缓存的中间证书来处理此问题;这最大化了网站兼容性。然而,像OpenSSL这样的Java和工具却没有。这将导致问题中的错误。

您可以使用Qualys SSL Test来验证此怀疑。如果您针对某个网站运行该操作并且显示

  

此服务器的证书链不完整。

然后证实了这一点。您还可以通过查看认证路径并查看文本额外下载来查看此内容。

如何修复它:服务器管理员需要配置Web服务器以返回中间证书。例如,对于Comodo,这是.ca-bundle文件派上用场的地方。例如,在使用mod_ssl的Apache配置中,您使用SSLCertificateChainFile配置设置。对于nginx,您需要连接中间证书和签名证书,并在SSL证书配置中使用它。您可以通过搜索&#34;不完整的证书链来找到更多信息&#34;在线。

答案 11 :(得分:3)

我们收到上述错误的原因是,JDK与许多受信任的证书颁发机构(CA)证书捆绑在一起,称为“ cacerts”文件,但该文件不包含我们的自签名证书。换句话说,cacerts文件没有导入我们的自签名证书,因此不会将其视为受信任的实体,因此会出现上述错误。

How to fix the above error

要解决上述错误,我们所需要做的就是将自签名证书导入cacerts文件中。

首先,找到cacerts文件。我们将需要找出JDK的位置。如果您通过Eclipse或IntelliJ Idea等IDE之一运行应用程序,请转到项目设置并确定JDK的位置。 例如,在Mac OS上,cacerts文件的典型位置将位于/ Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security 在Windows的计算机上,它将位于{{Installation_directory}} / {{JDK_version}} / jre / lib / security

找到cacerts文件后,现在我们需要将自签名证书导入此cacerts文件。如果您不知道如何正确生成自签名证书,请查阅上一篇文章。

如果您没有证书文件(.crt),而只有.jks文件,则可以使用以下命令生成.crt文件。如果您已经有一个.crt / .pem文件,则可以忽略以下命令

##从密钥库(.jks文件)生成证书####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

以上步骤将生成一个名为selfsigned.crt的文件。现在将证书导入cacerts

现在将证书添加到JRE / lib / security / cacerts(trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

例如

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

仅此而已,重新启动您的应用程序,它应该可以正常工作。如果仍然无法正常工作,请获取SSL握手异常。这可能意味着您使用的是不同于证书中注册的域。

链接with detailed explanation and step by step resolution is over here.

答案 12 :(得分:3)

经过半天的努力,找到了解决此问题的另一种方法。我能够在MAC 10.15.5(Catalina)中解决此问题。请执行以下步骤。

  • 当我们在公司代理(在我的情况下是Zscaler)中运行时,会发生此问题。
  • 打开钥匙串访问,导出CA证书。(选择CA证书,选择File->导出项目并以所需名称保存)
  • 从java文件夹复制现有cacerts的路径(/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts )
  • 打开终端并导航到Keytool文件夹(/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/bin )
  • 运行以下命令。
  • Keytool -importcert-文件(从keychainaccess导出的证书的路径)-alias(给出名称)-keystore(java文件夹中现有cacert的路径)
  • sudo Keytool -importcert-文件/Users/Desktop/RootCA.cer -alias演示-keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
  • 它将要求输入密码,输入密码为:changeit
  • 要求确认,说:是

完成所有这些步骤后,退出日食并终止新的会话。

答案 13 :(得分:3)

添加cacerts对我不起作用。 在使用标记-Djavax.net.debug=all启用日志后,就开始了解来自jssecacerts的java阅读。

导入jssecacerts终于工作了。

答案 14 :(得分:2)

我遇到了同样的问题,并使用以下简单步骤解决了问题:

1)从谷歌

下载InstallCert.java

2)使用 javac InstallCert.java

编译它

3)使用 java InstallCert.java 运行InstallCert.java,使用主机名和https端口,并在请求输入时按“1”。它会将“localhost”添加为可信密钥库,并生成名为“jssecacerts”的文件,如下所示:

java InstallCert localhost:443

4)将jssecacerts复制到$ JAVA_HOME / jre / lib / security文件夹

这里解决问题的主要来源是:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

答案 15 :(得分:2)

问题是,您的日食无法连接它实际尝试连接的站点。 我遇到了类似的问题,下面给出的解决方案对我有用。

  1. 关闭任何第三方互联网安全应用程序,例如Zscaler
  2. 如果您已连接,有时还需要断开 VPN。

谢谢

答案 16 :(得分:2)

这是一个解决方案,但以我遇到的这个问题的形式出现:

尝试上面给出的所有解决方案(三天之内)时,我几乎已经死了,对我没有任何帮助。

我失去了所有希望。

我就此事联系了我的安全团队,因为我在代理人的身后,他们告诉他们最近更新了他们的安全策略。

我严厉责骂他们没有通知开发人员。

后来他们发布了一个包含所有证书的新“证书”文件。

我删除了%JAVA_HOME%/ jre / lib / security中存在的cacerts文件,它解决了我的问题。

因此,如果您遇到此问题,可能也是您的网络团队提供的。

答案 17 :(得分:2)

我尝试通过更新站点在Eclipse中安装Cucumber-Eclipse插件时遇到了这个问题。我收到了相同的SunCertPathBuilderException错误:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

虽然其他一些答案对于这个问题的具体情况是恰当和有用的,但它们对我的问题无益和误导。

就我而言,问题是为其更新站点提供的URL是:

  

https://cucumber.io/cucumber-eclipse/update-site

然而,当通过浏览器导航到它时,它会重定向到(注意添加的&#34; .github &#34;):

  

http://cucumber.github.io/cucumber-eclipse/update-site/

因此,解决方法是在eclipse中添加更新站点时,只需使用重定向版本的更新站点URL。

答案 18 :(得分:1)

如果您仍然收到此错误

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

执行以下命令后

keytool -import -alias certificatealias -keystore C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts -file certificate.crt

那么JDK中存在一些问题。尝试从受信任的提供商安装 JDK。 从受信任的提供商处重新安装后,您就不会遇到此问题。

答案 19 :(得分:1)

我遇到了同样的问题,但是在我的Linux机器上更新了错误的jre。很有可能tomcat使用的是不同的jre,并且您的cli提示符已配置为使用其他的jre。

确保您选择了正确的jre。

步骤1:

ps -ef | grep tomcat

您会看到类似的东西:

root     29855     1  3 17:54 pts/3    00:00:42 /usr/java/jdk1.7.0_79/jre/bin/java 

现在使用此:

keytool -import -alias example -keystore  /usr/java/jdk1.7.0_79/jre/lib/security/cacerts -file cert.cer
PWD: changeit

*。cer文件可以如下所示生成:(或者您可以使用自己的文件)

openssl x509 -in cert.pem -outform pem -outform der -out cert.cer

答案 20 :(得分:0)

我为 Intellij Idea 解决了该问题 我遇到了这个问题Althouh,我换了很多地方来解决问题。我找到了一个解决方案。右键单击您的项目,您将看到 Maven ,然后按 Generate Sources And Update文件夹导入 enter image description here

完成了。

答案 21 :(得分:0)

我留下了一些提示。

  1. 使用 -Dssl.debug=true 检查 SSL。
  2. 检查您是否正在创建隧道或尝试忽略它
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509CertChain, authType) -> true).build();
            httpClient = HttpClientBuilder.create()
                    .setSSLContext(sslContext)
                    .setConnectionManager(new PoolingHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create()
                            .register("http", PlainConnectionSocketFactory.INSTANCE)
                            .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE))
                            .build()
                    )).build();

httpClient.execute(requisicao)

答案 22 :(得分:0)

虽然我确实将证书复制到了 cacerts 文件中,但错误并没有消失。

问题是证书上的日期过期,这就是它返回错误的原因。

我申请了一个新的有效证书,现在错误消失了。

答案 23 :(得分:0)

我在ubuntu 15.10上遇到了同样的问题。请尝试在本地下载插件,例如https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip并使用此命令安装:

sudo /usr/share/elasticsearch/bin/plugin install file:/home/dev/Downloads/elasticsearch-kopf-master.zip

根据您的环境,路径可能会有所不同。

的问候。

答案 24 :(得分:0)

1-首先,将您的crt文件导入{JAVA_HOME}/jre/security/cacerts,如果您仍然遇到此异常,请更改您的jdk版本。例如从 jdk1.8.0_17jdk1.8.0_231

答案 25 :(得分:0)

当证书比Java版本新时,会出现此错误。使用较新的Java版本将解决此问题。

答案 26 :(得分:0)

对我来说,证书错误突然出现,因为我在背景中运行小提琴手并且与证书混淆。它充当代理,如此接近并重启eclipse。

答案 27 :(得分:0)

我遇到了同样的问题,我使用的是8.1.0-3,但后来我使用的是9.2.1-0,此问题已解决,无需任何手动步骤。自签名证书可以正常工作。

答案 28 :(得分:0)

我通过将证书从pkcs12存储区导入到cacerts密钥库中,在具有Java 8的Windows Server 2016上解决了此问题。

pkcs12存储的路径:
C:\Apps\pkcs12.pfx

Java cacerts的路径:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

密钥工具的路径:
C:\Program Files\Java\jre1.8.0_151\bin

在命令提示符下(以管理员身份)使用keytool定位到文件夹后,将证书从pkcs12导入到cacerts的命令如下:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

系统将提示您:
 1.输入目标密钥库密码(证书密码,默认为“ changeit”)
 2.输入源密钥库密码(pkcs12密码)


为了使更改生效,请重新启动服务器计算机(或仅重新启动JVM)。

答案 29 :(得分:0)

这是答案https://stackoverflow.com/a/36427118/1491414的补充。谢谢@MagGGG

  • 请确保您拥有管理员权限
  • 请使用双引号作为密钥库路径(-keystore C:\ Program Files(x86)\ Java \ jre1.6.0_22 \ lib \ security \ cacerts“),因为在Windows操作系统中,默认安装位置将是Program Files和由于程序文件之间的空间,您将收到错误。

答案 30 :(得分:0)

如果当Java应用程序试图与另一个应用程序/站点进行通信时,您在Linux容器中看到此问题,那是因为证书已被错误地导入到负载均衡器中。导入证书需要遵循一系列步骤,如果操作不正确,您将看到类似

的问题
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

一旦正确导入了证书,就应该这样做。无需修补任何JDK证书。

答案 31 :(得分:0)

尝试复制Java cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts

答案 32 :(得分:0)

如果您正在使用CloudFoundry并遇到证书问题,则必须确保再次使用带有证书的keystore-service推动jar。仅仅解除绑定,绑定和重新启动就行不通了。

答案 33 :(得分:0)

我通过传递arg -Djavax.net.ssl.trustStore=

来使用自己的信任库而不是JRE。

无论信任库中的证书如何,我都会收到此错误。对我来说,问题是在arg行上传递的属性的顺序。 当我将-Djavax.net.ssl.trustStore=-Djavax.net.ssl.trustStorePassword=放在之前 -Dspring.config.location=-jar参数时,我能够通过https成功调用我的rest调用。

答案 34 :(得分:0)

如果您的存储库URL也可以在HTTP上使用,并且不必担心安全性,则可以转到 settings.xml (通常但并非总是位于%USERPROFILE%/.m2中)和<为<repository><pluginRepository> URL的strong>用HTTP 替换HTTPS。

例如,此:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

应替换为:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

答案 35 :(得分:0)

通常,当可信证书的PATH不匹配时会发生这种异常。检查安全通信所需的此服务器证书的配置或路径。

答案 36 :(得分:0)

使用atlassian软件ex遇到以上错误时。吉拉

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, caused by: 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

您可以将证书添加到其受信任的密钥库中(将missing_ca更改为正确的证书名称):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

如果要求输入密码,请输入changeit并确认y

之后,只需重新启动jira。

答案 37 :(得分:0)

我使用以下方法解决了此问题-

  1. 复制存在连接问题的网址
  2. 转到Android Studio->设置-> Http设置
  3. 在“测试连接”中,粘贴该网址,然后按确定
  4. 单击确定后,Android Studio将要求导入该证书 网址,将其导入
  5. 就是这样。没有别的事情可做,我的问题不见了。无需 也重新启动Studio。

答案 38 :(得分:-1)

按下证书文件,然后使用证书文件更新密钥库,如以下命令所示。

sudo keytool -importcert-别名“ aws2” -file〜/ Desktop / * aws.crt -keystore /Library/java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security/cacerts < / p>

答案 39 :(得分:-1)

如果您的主机位于防火墙/代理后面,请在cmd中使用以下命令:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

<proxy_hostname><proxy_port>替换为已配置的HTTP代理服务器。将<remote_host_name:remote_ssl_port>替换为存在证书问题的远程主机(基本上是URL)和端口之一。

获取最后打印的证书内容并进行复制(还复制开始证书和结束证书)。将其粘贴到文本文件中,并为其赋予 .crt 扩展名。现在,使用java keytool命令将此证书导入到 cacerts ,它应该可以正常工作。

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

答案 40 :(得分:-1)

目标:

  1. 使用https连接
  2. 验证SSL链
  3. 不处理cacerts
  4. 在运行时添加证书
  5. 不要丢失cacerts的证书
  6. 怎么做:

    1. 定义自己的密钥库
    2. 将证书放入密钥库
    3. 使用我们的自定义类重新定义SSL默认上下文
    4. ???
    5. 利润
    6. 我的密钥库包装文件:

      public class CertificateManager {
      
          private final static Logger logger = Logger.getLogger(CertificateManager.class);
      
          private String keyStoreLocation;
          private String keyStorePassword;
          private X509TrustManager myTrustManager;
          private static KeyStore myTrustStore;
      
          public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
              this.keyStoreLocation = keyStoreLocation;
              this.keyStorePassword = keyStorePassword;
              myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
          }
      
          public void addCustomCertificate(String certFileName, String certificateAlias)
                  throws Exception {
              TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
              tmf.init((KeyStore) null);
              Certificate certificate = myTrustStore.getCertificate(certificateAlias);
              if (certificate == null) {
                  logger.info("Certificate not exists");
                  addCertificate(certFileName, certificateAlias);
              } else {
                  logger.info("Certificate exists");
              }
              tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
              tmf.init(myTrustStore);
              for (TrustManager tm : tmf.getTrustManagers()) {
                  if (tm instanceof X509TrustManager) {
                      setMytrustManager((X509TrustManager) tm);
                      logger.info("Trust manager found");
                      break;
                  }
              }
          }
      
          private InputStream fullStream(String fname) throws IOException {
              ClassLoader classLoader = getClass().getClassLoader();
              InputStream resource = classLoader.getResourceAsStream(fname);
              try {
                  if (resource != null) {
                      DataInputStream dis = new DataInputStream(resource);
                      byte[] bytes = new byte[dis.available()];
                      dis.readFully(bytes);
                      return new ByteArrayInputStream(bytes);
                  } else {
                      logger.info("resource not found");
                  }
              } catch (Exception e) {
                  logger.error("exception in certificate fetching as resource", e);
              }
              return null;
          }
      
          public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
              try {
                  InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
                  KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                  keyStore.load(in, pass.toCharArray());
                  logger.info("Keystore was created from resource file");
                  return keyStore;
              } catch (Exception e) {
                  logger.info("Fail to create keystore from resource file");
              }
      
              File file = new File(keystore);
              KeyStore keyStore = KeyStore.getInstance("JKS");
              if (file.exists()) {
                  keyStore.load(new FileInputStream(file), pass.toCharArray());
                  logger.info("Default keystore loaded");
              } else {
                  keyStore.load(null, null);
                  keyStore.store(new FileOutputStream(file), pass.toCharArray());
                  logger.info("New keystore created");
              }
              return keyStore;
          }
      
          private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
                  IOException, KeyStoreException, NoSuchAlgorithmException {
              CertificateFactory cf = CertificateFactory.getInstance("X.509");
              InputStream certStream = fullStream(certFileName);
              Certificate certs = cf.generateCertificate(certStream);
              myTrustStore.setCertificateEntry(certificateAlias, certs);
              FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
              myTrustStore.store(out, getKeyStorePassword().toCharArray());
              out.close();
              logger.info("Certificate pushed");
          }
      
          public String getKeyStoreLocation() {
              return keyStoreLocation;
          }
      
          public String getKeyStorePassword() {
              return keyStorePassword;
          }
          public X509TrustManager getMytrustManager() {
              return myTrustManager;
          }
          public void setMytrustManager(X509TrustManager myTrustManager) {
              this.myTrustManager = myTrustManager;
          }
      }
      

      如果需要,此类将创建密钥库,并且可以管理其中的证书。现在是SSL上下文的类:

      public class CustomTrustManager implements X509TrustManager {
      
          private final static Logger logger = Logger.getLogger(CertificateManager.class);
      
          private static SSLSocketFactory socketFactory;
          private static CustomTrustManager instance = new CustomTrustManager();
          private static List<CertificateManager> register = new ArrayList<>();
      
          public static CustomTrustManager getInstance() {
              return instance;
          }
      
          private X509TrustManager defaultTm;
      
          public void register(CertificateManager certificateManager) {
              for(CertificateManager manager : register) {
                  if(manager == certificateManager) {
                      logger.info("Certificate manager already registered");
                      return;
                  }
              }
              register.add(certificateManager);
              logger.info("New Certificate manager registered");
          }
      
          private CustomTrustManager() {
              try {
                  String algorithm = TrustManagerFactory.getDefaultAlgorithm();
                  TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
      
                  tmf.init((KeyStore) null);
                  boolean found = false;
                  for (TrustManager tm : tmf.getTrustManagers()) {
                      if (tm instanceof X509TrustManager) {
                          defaultTm = (X509TrustManager) tm;
                          found = true;
                          break;
                      }
                  }
                  if(found) {
                      logger.info("Default trust manager found");
                  } else {
                      logger.warn("Default trust manager was not found");
                  }
      
                  SSLContext sslContext = SSLContext.getInstance("TLS");
                  sslContext.init(null, new TrustManager[]{this}, null);
                  SSLContext.setDefault(sslContext);
                  socketFactory = sslContext.getSocketFactory();
                  HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
      
      
                  logger.info("Custom trust manager was set");
              } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
                  logger.warn("Custom trust manager can't be set");
                  e.printStackTrace();
              }
          }
      
          @Override
          public X509Certificate[] getAcceptedIssuers() {
              List<X509Certificate> out = new ArrayList<>();
              if (defaultTm != null) {
                  out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
              }
              int defaultCount = out.size();
              logger.info("Default trust manager contain " + defaultCount + " certficates");
              for(CertificateManager manager : register) {
                  X509TrustManager customTrustManager = manager.getMytrustManager();
                  X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
                  out.addAll(Arrays.asList(issuers));
              }
              logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
              X509Certificate[] arrayOut = new X509Certificate[out.size()];
              return out.toArray(arrayOut);
          }
      
          @Override
          public void checkServerTrusted(X509Certificate[] chain,
                                         String authType) throws CertificateException {
              for(CertificateManager certificateManager : register) {
                  X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                  try {
                      customTrustManager.checkServerTrusted(chain, authType);
                      logger.info("Certificate chain (server) was aproved by custom trust manager");
                      return;
                  } catch (Exception e) {
                  }
              }
              if (defaultTm != null) {
                  defaultTm.checkServerTrusted(chain, authType);
                  logger.info("Certificate chain (server) was aproved by default trust manager");
              } else {
                  logger.info("Certificate chain (server) was rejected");
                  throw new CertificateException("Can't check server trusted certificate.");
              }
          }
      
          @Override
          public void checkClientTrusted(X509Certificate[] chain,
                                         String authType) throws CertificateException {
              try {
                  if (defaultTm != null) {
                      defaultTm.checkClientTrusted(chain, authType);
                      logger.info("Certificate chain (client) was aproved by default trust manager");
                  } else {
                      throw new NullPointerException();
                  }
              } catch (Exception e) {
                  for(CertificateManager certificateManager : register) {
                      X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                      try {
                          customTrustManager.checkClientTrusted(chain, authType);
                          logger.info("Certificate chain (client) was aproved by custom trust manager");
                          return;
                      } catch (Exception e1) {
                      }
                  }
                  logger.info("Certificate chain (client) was rejected");
                  throw new CertificateException("Can't check client trusted certificate.");
              }
          }
      
          public SSLSocketFactory getSocketFactory() {
              return socketFactory;
          }
      }
      

      此类作为单例生成,因为只允许一个defaultSSL上下文。所以,现在使用:

                  CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
                  String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
                  try {
                      certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
                  } catch (Exception e) {
                      log.error("Can't add custom certificate");
                      e.printStackTrace();
                  }
                  CustomTrustManager.getInstance().register(certificateManager);
      

      可能它不适用于此设置,因为我将证书文件保存在资源文件夹中,所以我的路径不是绝对的。但总的来说,它完美无缺。