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

Doz*_*ent 350 java jsp servlets twitter4j

我正在尝试使用twitter4j库为我的java项目发送推文.在我第一次运行时,我收到了关于证书sun.security.validator.ValidatorException和错误的错误sun.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"
Run Code Online (Sandbox Code Playgroud)

但没有成功.这是获得twitters的过程:

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());
    }
Run Code Online (Sandbox Code Playgroud)

这是错误:

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
Run Code Online (Sandbox Code Playgroud)

Mag*_*GGG 465

  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:

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

  • 我必须将路径放在引号中,并将其保存为Base64而不是DER (20认同)
  • 请注意,应对链中的所有证书重复说明.命令行中证书的"别名"名称也应该是唯一的. (8认同)
  • 如果你的家是JDK,请确保指定jre在其中:keytool -import -alias example -keystore"C:\ Program Files\Java\jdk1.8.0_73\jre\lib\security\cacerts"-file example.cer (5认同)
  • 对于遇到“拒绝访问”错误的任何人,请确保您以管理员身份运行命令提示符。 (5认同)
  • 哇..就像魔术一样魔术你只需点击左侧地址栏上的锁定图标,然后点击_details_ plus就不需要重启了 (3认同)
  • 由于java不是守护进程并且按需运行,如何重新启动jvm? (2认同)
  • 重启真的有必要吗?如果是这样,那就是胡说八道。 (2认同)
  • 对于 url 这只是任意随机 url 吗? (2认同)
  • 要运行 keytool 命令,请记住从 cd %JAVA_HOME%\bin 运行它 (2认同)

Jer*_*ell 76

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

请注意,我实际上将Windows cacerts文件复制到Linux安装上,它运行得很好.

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

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

  • 对于那些喜欢我的人有时会错过显而易见的事情 - 确保你要进入`$ JAVA_HOME/jre/lib`,而不是`$ JAVA_HOME/lib` - 我花了一些时间错过了这个细节. (8认同)
  • 我试图访问带有自签名证书的ssl服务器,尝试使用keytool添加它的证书,但没有运气,有什么建议吗? (4认同)

Mik*_*rer 27

我的UI方法:

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

CMD线:

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

  • 在 Windows 上,有效的命令是:`keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”` (3认同)
  • 在 mac 上,使用 CMD-Line,应该使用 sudo 来运行命令。# sudo keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts (2认同)

wil*_*824 25

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

请检查以下链接:解决Java证书问题

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

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

执行这些步骤后,与证书的连接将不再在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意创建的文件是 jssecacerts! (2认同)

Lu5*_*u55 15

1.检查证书

尝试载入目标网址的浏览器,并查看该网站的证书(通常是通过与锁标志的图标进行访问.这是在浏览器的地址栏的左侧或右侧),不管是过期或其他原因不信任.

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

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

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

3.检查您的配置:

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

4.从新Java版本复制整个密钥库

如果你的JDK比最新可用的其他下发展-尝试更换%JAVA_HOME%/jre/lib/security/cacerts与安装最新版本的JRE新一(做一个备份副本)文件作为@杰里米-古德尔在他的建议答复

5.将证书添加到密钥库

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

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>
Run Code Online (Sandbox Code Playgroud)

带有证书的文件可以从@MagGGG在他的回答中建议的浏览器中获得.

注意1:您可能需要对链中的每个证书重复此操作,以获取您站点的证书.从根目录开始.

注2:<alias_name>商店中的键应该是唯一的,否则keytool会显示错误.

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

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
Run Code Online (Sandbox Code Playgroud)

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

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
Run Code Online (Sandbox Code Playgroud)

  • 鉴于这是多么详尽的阐述,它应该是公认的答案。 (4认同)

M. *_* F. 11

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

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

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>
Run Code Online (Sandbox Code Playgroud)

尽管如此,我仍然保持相同的PKIX路径构建失败错误.

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

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


Rei*_*eid 10

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

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

您的 Java 信任库很可能只有根证书,而没有中间证书。

配置错误的站点可能返回他们签名的证书。问题:它是用不在您的信任库中的中间证书签名的。浏览器会通过下载或使用缓存的中间证书来处理这个问题;这最大限度地提高了网站兼容性。但是,Java 和 OpenSSL 之类的工具不会。这将导致问题中的错误。

您可以使用Qualys SSL 测试来验证这种怀疑。如果你对一个网站运行它,它说

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

那么就证实了这一点。您还可以通过查看认证路径并查看文本Extra Download来了解这一点。

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

  • 你太聪明了。谢谢你!我的 Java 服务器的新构建出现了问题,因为我忘记删除 SSLCertificateChainFile 前面的 #!确实解释得很好。 (3认同)

Abd*_*sin 9

解决此异常的简单步骤(我在 java 11 上做到了),

  • 首先,您需要下载您尝试调用的目标域的公共 SSL 证书文件
  • 在 Chrome 中打开目标域网站(示例:https://amazonservice.domain.com
  • 单击浏览器中 URL 前面的小锁图标
  • 单击查看证书
  • 现在点击证书有效,如下图所示
  • 在此输入图像描述
  • 现在将打开一个新的弹出窗口,如下所示, 去
  • 打开详细信息选项卡
  • 选择顶部的 RootCert
  • 单击导出并将 .cer 文件保存到系统的目录中

现在您已经拥有了要在 java 应用程序中调用的目标域的公钥库,现在我们需要将该密钥库导入到您的 jre 中,为此,请转到 $JAVA_HOME/bin 目录并运行以下命令

./keytool -importcert -alias someAliasName -keystore {JAVA_HOME}/lib/security/cacerts -file {PathToDownloads}/certificateFileName.cer
Run Code Online (Sandbox Code Playgroud)

它会询问您密码,如果您知道密码,请输入密码,证书的默认密码是changeit

参考

  1. https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html
  2. https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html


小智 8

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

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

谢谢


gor*_*ums 7

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
Run Code Online (Sandbox Code Playgroud)

它用于跳转证书验证。

  • 它忽略了安全性。这不是一个好习惯。 (26认同)
  • 这是绝对不安全的,不应尝试。 (12认同)
  • 除非您要冒在机器上运行任意恶意代码的风险,否则请不要这样做。投票不足,因为它有可能损害任何运行它的计算机。 (5认同)
  • @AceKing 关键是,如果您不验证证书,它就是*不* 受信任的代码。也就是说,我认为这仍然是一个有用的答案。这样做的人只需要了解风险。 (5认同)
  • @EgorHans 这是相当危险的,如果你采取这种方法,你就会让自己容易受到 MITM 攻击。证书验证的要点之一是,如果有人劫持 URL,您*不会*被搞砸,因为您知道这种情况何时发生。 (4认同)
  • 用于跳转证书验证 (3认同)
  • @gorums如何在Eclipse中进行设置? (2认同)
  • 仅仅因为它“有效”并不意味着它是安全的,您将每个遵循此建议的人置于危险之中。我投反对票 (2认同)

小智 7

我想为smtp.gmail.com导入证书

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

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

  1. 将"----- BEGIN CERTIFICATE -----"和"----- END CERTIFICATE -----"之间的行复制并保存到文件gmail.cer中

  2. keytool -import -alias smtp.gmail.com -keystore"%JAVA_HOME%/ jre/lib/security/cacerts"-file C:\ Users\Admin\Desktop\gmail.cer

  3. 输入密码chageit

  4. 单击"是"以导入证书

  5. 重启java

现在运行命令,你很高兴

  • 如果您在证书导入期间收到“输入不是 X.509 证书”错误消息,请确保您还复制了 BEGIN CERTIFICATE 和 END CERTIFICATE 文本。 (2认同)

Bar*_*i r 7

问题背景:

当我尝试在我的项目中并通过Netbeans IDE clean and build选项运行mvn clean install时,出现以下错误。此问题归因于当我们通过NET bean 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  
Run Code Online (Sandbox Code Playgroud)

解析度:

1.下载相关网址的证书:

  • 通过“以管理员身份运行”启动IE(否则,我们将无法下载证书)
  • 在IE-> https:// url / local-repo中输入网址 (在我的情况下,该网址具有不受信任的证书在此处输入图片说明
  • 通过单击证书错误->查看证书下载证书
  • 选择详细信息选项卡->复制到文件->下一步->选择“ 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> keytool -importcert-文件“ C:/user/sheldon/desktop/product.cer”-别名产品-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
Run Code Online (Sandbox Code Playgroud)
  • 恭喜!现在您应该摆脱了Netbeans IDE中的“ PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException”错误。


小智 7

折腾了半天,又找到了解决这个问题的方法。我能够在 MAC 10.15.5 (Catalina) 中解决这个问题。按照以下步骤操作。

  • 当我们在公司代理(在我的情况下是 Zscaler)后面运行时会出现此问题。
  • 打开钥匙链访问,导出 CA 证书。(选择 CA 证书,文件->导出项目并使用所需名称保存)
  • 从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 - 文件(从钥匙串访问导出证书的路径)-alias(给出名称)-keystore(java 文件夹中现有 cacerts 的路径)
  • sudo Keytool -importcert -file /Users/Desktop/RootCA.cer -alias demo -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
  • 它会要求输入密码,输入:changeit
  • 它要求确认,说:是的

在所有这些步骤之后,退出 eclipse 和终端开始新的会话。


Arv*_*ash 7

苹果电脑

接受的答案不适用于 Mac,因为ExportMac(Chrome 或 Firefox)中没有可用的按钮。请检查此答案以下载证书并按照以下步骤操作:

  1. 列出安装在密钥库中的所有证书
cd $JAVA_HOME/lib/security
keytool -list -keystore cacerts
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 密钥库的默认密码是:changeit
  • 对于 Java-8 或更低版本使用命令, cd $JAVA_HOME/jre/lib/security
  1. 在密钥库中导入证书之前,请备份密钥库
sudo cp cacerts cacerts.bak
Run Code Online (Sandbox Code Playgroud)
  1. 在密钥库中导入下载的证书
sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts
Run Code Online (Sandbox Code Playgroud)
  1. 检查证书是否存储在密钥库中
sudo keytool -list -keystore cacerts -alias youralias
Run Code Online (Sandbox Code Playgroud)

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

sudo keytool -v -list -keystore cacerts -alias youralias
Run Code Online (Sandbox Code Playgroud)


Abh*_*oda 6

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

如何解决以上错误

要解决以上错误,我们需要将自签名证书导入cacerts文件。

首先,找到cacerts文件。我们将需要找出JDK的位置。如果通过Eclipse或IntelliJ Idea等IDE之一运行应用程序,请转到项目设置并找出JDK的位置。例如,在Mac OS上,cacerts文件的典型位置将位于Windows计算机上的/ Library / Java / JavaVirtualMachines / {{JDK_version}} / Contents / Home / jre / lib / security处,该位置位于{{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
Run Code Online (Sandbox Code Playgroud)

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

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

例如

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts
Run Code Online (Sandbox Code Playgroud)

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

详细说明和逐步解决方法的链接已在此处结束。


Vik*_*mar 6

这是一个解决方案,但以我对这个问题的故事的形式:

尝试上面给出的所有解决方案(3 天)我几乎死了,但没有任何效果对我有用。

我失去了所有希望。

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

我骂他们不通知开发商。

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

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

因此,如果您遇到此问题,则可能来自您的网络团队也同样如此。


alk*_*453 5

添加cacerts对我不起作用。启用带有标志的日志后-Djavax.net.debug=all,便开始了解 java 读取jssecacerts.

导入jssecacerts终于工作了。

  • 这里缺少的解释是 Java 将使用 `jssecacerts`(如果存在),否则使用 `cacerts`。 (3认同)

Ank*_*ain 5

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

1)从谷歌下载InstallCert.java

2) 使用javac InstallCert.java编译它

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

java安装证书本地主机:443

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

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

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


归档时间:

查看次数:

992034 次

最近记录:

6 年,1 月 前