简体   繁体   English

无法找到到所请求目标的有效证书路径 - 即使在导入证书后也会出错

[英]Unable to find valid certification path to requested target - error even after cert imported

I have a Java client trying to access a server with a self-signed certificate.我有一个 Java 客户端试图使用自签名证书访问服务器。

When I try to Post to the server, I get the following error:当我尝试发布到服务器时,我收到以下错误:

unable to find valid certification path to requested target无法找到到所请求目标的有效认证路径

Having done some research on the issue, I then did the following.在对这个问题进行了一些研究之后,我做了以下工作。

  1. Saved my servers domain name as a root.cer file.将我的服务器域名保存为root.cer文件。

  2. In my Glassfish server's JRE, I ran this:在我的 Glassfish 服务器的 JRE 中,我运行了这个:

     keytool -import -alias example -keystore cacerts -file root.cer
  3. To check the cert was added to my cacert successfully, I did this:要检查证书是否已成功添加到我的 cacert,我这样做了:

     keytool -list -v -keystore cacerts

    I can see the cert is present.我可以看到证书存在。

  4. I then restarted Glassfish and retried the 'post'.然后我重新启动 Glassfish 并重试了“帖子”。

I am still getting the same error.我仍然遇到同样的错误。

I have a feeling this is because my Glassfish is not actually reading the cacert file that I have amended but maybe some other one.我有一种感觉,这是因为我的 Glassfish 实际上并没有读取我修改过的cacert文件,而可能是其他文件。

Have any of you had this issue and can push me in the right direction?你们有没有人遇到过这个问题,可以把我推向正确的方向?

Unfortunately - it could be many things - and lots of app servers and other java 'wrappers' are prone to play with properties and their 'own' take on keychains and what not.不幸的是 - 它可能是很多东西 - 许多应用程序服务器和其他 java '包装器' 很容易使用属性和他们对钥匙串的'自己' 承担等等。 So it may be looking at something totally different.所以它可能正在寻找完全不同的东西。

Short of truss-ing - I'd try:缺少 truss-ing - 我会尝试:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ...

to see if that helps.看看是否有帮助。 Instead of 'all' one can also set it to 'ssl', key manager and trust manager - which may help in your case.除了“全部”,还可以将其设置为“ssl”、密钥管理器和信任管理器——这可能对您的情况有所帮助。 Setting it to 'help' will list something like below on most platforms.将其设置为“帮助”将在大多数平台上列出如下内容。

Regardless - do make sure you fully understand the difference between the keystore (in which you have the private key and cert you prove your own identity with) and the trust store (which determines who you trust) - and the fact that your own identity also has a 'chain' of trust to the root - which is separate from any chain to a root you need to figure out 'who' you trust.无论如何 - 请确保您完全了解密钥库(您拥有用于证明自己身份的私钥和证书)和信任库(确定您信任的人)之间的区别 - 以及您自己的身份也对根有一个“信任链”——它与任何指向根的链是分开的,你需要弄清楚你信任的“谁”。

all            turn on all debugging
ssl            turn on ssl debugging

The   following can be used with ssl:
    record       enable per-record tracing
    handshake    print each handshake message
    keygen       print key generation data
    session      print session activity
    defaultctx   print default SSL initialization
    sslctx       print SSLContext tracing
    sessioncache print session cache tracing
    keymanager   print key manager tracing
    trustmanager print trust manager tracing
    pluggability print pluggability tracing

    handshake debugging can be widened with:
    data         hex dump of each handshake message
    verbose      verbose handshake message printing

    record debugging can be widened with:
    plaintext    hex dump of record plaintext
    packet       print raw SSL/TLS packets

Source: # See http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug来源:#见http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug

Here is the solution , follow the below link Step by Step :这是解决方案,请按照以下链接逐步操作:

http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/ http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

JAVA FILE : which is missing from the blog JAVA 文件:博客中缺少的

/*
 * 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.*;
import java.net.URL;

import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

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);
    }
    }

}

You need to configuring JSSE System Properties, specifically point to client certificate store.您需要配置 JSSE 系统属性,特别是指向客户端证书存储。

Via command line:通过命令行:

java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client

or via Java code:或通过 Java 代码:

import java.util.Properties;
    ...
    Properties systemProps = System.getProperties();
    systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore");
    systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks");
    systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts");
    systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore");
    System.setProperties(systemProps);
    ...

For more refer to details on RedHat site .有关详细信息,请参阅RedHat 网站上的详细信息。

(repost from my other response ) (从我的其他回复转贴)
Use cli utility keytool from java software distribution for import (and trust! ) needed certificates使用 java 软件分发中的 cli 实用程序keytool来导入(和信任! )所需的证书

Sample:样本:

  1. From cli change dir to jre\bin从 cli 更改目录到 jre\bin

  2. Check keystore (file found in jre\bin directory)检查密钥库(在 jre\bin 目录中找到的文件)
    keytool -list -keystore ..\lib\security\cacerts keytool -list -keystore ..\lib\security\cacerts
    Password is changeit密码是changeit

  3. Download and save all certificates in chain from needed server.从所需的服务器下载并保存链中的所有证书。

  4. Add certificates (before need to remove "read-only" attribute on file ..\lib\security\cacerts ), run:添加证书(在需要删除文件..\lib\security\cacerts上的“只读”属性之前),运行:

    keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore.\lib\security\cacerts -file "r:\root.crt" keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore.\lib\security\cacerts -file "r:\root.crt"

accidentally I found such a simple tip.无意中发现了这么简单的提示。 Other solutions require the use of InstallCert.Java and JDK其他解决方案需要使用 InstallCert.Java 和 JDK

source: http://www.java-samples.com/showtutorial.php?tutorialid=210来源: http ://www.java-samples.com/showtutorial.php?tutorialid=210

I had the same problem with sbt .我对sbt有同样的问题。
It tried to fetch dependencies from repo1.maven.org over ssl它试图通过 ssl 从repo1.maven.org获取依赖项
but said it was "unable to find valid certification path to requested target url".但表示“无法找到请求的目标 URL 的有效认证路径”。
so I followed this post and still failed to verify a connection.所以我关注了这篇文章,但仍然无法验证连接。
So I read about it and found that the root cert is not enough, as was suggested by the post,so -所以我阅读了它,发现根证书是不够的,正如帖子所建议的那样,所以 -
the thing that worked for me was importing the intermediate CA certificates into the keystore .对我有用的事情是将中间 CA 证书导入密钥库
I actually added all the certificates in the chain and it worked like a charm.我实际上添加了链中的所有证书,它就像一个魅力。

Solution when migrating from JDK 8 to JDK 10从 JDK 8 迁移到 JDK 10 时的解决方案

JDK 10 JDK 10

root@c339504909345:/opt/jdk-minimal/jre/lib/security #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 80 entries

JDK 8 JDK 8

root@c39596768075:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts #  keytool -cacerts -list
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 151 entries

Steps to fix修复步骤

  • I deleted the JDK 10 cert and replaced it with the JDK 8我删除了 JDK 10 证书并将其替换为 JDK 8
  • Since I'm building Docker Images, I could quickly do that using Multi-stage builds由于我正在构建 Docker 映像,因此我可以使用多阶段构建快速完成此操作
    • I'm building a minimal JRE using jlink as /opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...我正在使用jlink作为/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...构建一个最小的 JRE

So, here's the different paths and the sequence of the commands...所以,这是不同的路径和命令的顺序......

# Java 8
COPY --from=marcellodesales-springboot-builder-jdk8 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/cacerts /etc/ssl/certs/java/cacerts

# Java 10
RUN rm -f /opt/jdk-minimal/jre/lib/security/cacerts
RUN ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts

I came across this error while trying to access a https url from my application which was using self-signed certificate.我在尝试从使用自签名证书的应用程序访问https url 时遇到了这个错误。 What they provide is a .cert file and I was not sure where to put that.他们提供的是一个.cert文件,我不知道该放在哪里。 I solved it the following way:我通过以下方式解决了它:

keytool location is under JDK/bin folder keytool 位置在 JDK/bin 文件夹下

Method 1: Add the certificate to default Java Truststore - cacerts:方法1:将证书添加到默认Java Truststore - cacerts:

keytool -import -alias myCert -file C://certificate.cert -keystore C://Program Files//Java//jdk1.8.0_271//jre//lib//security//cacerts

Password: changeit密码:changeit

Method 2:方法二:

Create a Trust Store:创建信任库:

keytool -import -alias myCert -file C://certificate.cert -keystore myTrustStore

It gives you the following prompts, which can be filled up as:它为您提供以下提示,可填写为:

Enter keystore password:changeit
Re-enter new password:changeit
Trust this certificate?yes

This will create a myTrustStore file inside a folder where you ran this command.这将在您运行此命令的文件夹中创建一个myTrustStore文件。 Copy this "mytrustStore" to a convenient location.将此“mytrustStore”复制到方便的位置。

Use the Trust Store:使用信任库:

While you are running your application/server pass these JVM arguments:在运行应用程序/服务器时,传递这些 JVM 参数:

-Djavax.net.ssl.trustStore=C://myTrustStore -Djavax.net.ssl.trustStorePassword=changeit

I am working on a tutorial for REST web services at www.udemy.com (REST Java Web Services).我正在 www.udemy.com(REST Java Web 服务)上编写 REST Web 服务教程。 The example in the tutorial said that in order to have SSL, we must have a folder called "trust_store" in my eclipse "client" project that should contain a "key store" file (we had a "client" project to call the service, and "service" project that contained the REST web service - 2 projects in the same eclipse workspace, one the client, the other the service).教程中的示例说,为了拥有 SSL,我们必须在我的 Eclipse“客户端”项目中有一个名为“trust_store”的文件夹,该文件夹应该包含一个“密钥存储”文件(我们有一个“客户端”项目来调用服务,以及包含 REST Web 服务的“服务”项目 - 同一个 Eclipse 工作区中的 2 个项目,一个是客户端,另一个是服务)。 To keep things simple, they said to copy "keystore.jks" from the glassfish app server (glassfish\domains\domain1\config\keystore.jks) we are using and put it into this "trust_store" folder that they had me make in the client project.为简单起见,他们说从我们正在使用的 glassfish 应用服务器 (glassfish\domains\domain1\config\keystore.jks) 复制“keystore.jks”,并将其放入他们让我制作的“trust_store”文件夹中客户项目。 That seems to make sense: the self-signed certs in the server's key_store would correspond to the certs in the client trust_store.这似乎是有道理的:服务器的 key_store 中的自签名证书将对应于客户端 trust_store 中的证书。 Now, doing this, I was getting the error that the original post mentions.现在,这样做,我得到了原始帖子提到的错误。 I have googled this and read that the error is due to the "keystore.jks" file on the client not containing a trusted/signed certificate, that the certificate it finds is self-signed.我已经用谷歌搜索并读到错误是由于客户端上的“keystore.jks”文件不包含受信任/签名的证书,它找到的证书是自签名的。

To keep things clear, let me say that as I understand it, the "keystore.jks" contains self-signed certs, and the "cacerts.jks" file contains CA certs (signed by the CA).为了清楚起见,让我说,据我了解,“keystore.jks”包含自签名证书,“cacerts.jks”文件包含 CA 证书(由 CA 签名)。 The "keystore.jks" is the "keystore" and the "cacerts.jks" is the "trust store". “keystore.jks”是“keystore”,“cacerts.jks”是“信任库”。 As "Bruno", a commenter, says above, "keystore.jks" is local, and "cacerts.jks" is for remote clients.正如评论者“Bruno”在上面所说,“keystore.jks”是本地的,“cacerts.jks”是用于远程客户端的。

So, I said to myself, hey, glassfish also has the "cacerts.jks" file, which is glassfish's trust_store file.于是,我对自己说,嘿嘿,glassfish还有“cacerts.jks”文件,就是glassfish的trust_store文件。 cacerts.jsk is supposed to contain CA certificates. cacerts.jsk 应该包含 CA 证书。 And apparently I need my trust_store folder to contain a key store file that has at least one CA certificate.显然我需要我的 trust_store 文件夹来包含一个至少有一个 CA 证书的密钥库文件。 So, I tried putting the "cacerts.jks" file in the "trust_store" folder I had made, on my client project, and changing the VM properties to point to "cacerts.jks" instead of "keystore.jks".因此,我尝试将“cacerts.jks”文件放在我在客户端项目中创建的“trust_store”文件夹中,并将 VM 属性更改为指向“cacerts.jks”而不是“keystore.jks”。 That got rid of the error.这摆脱了错误。 I guess all it needed was a CA cert to work.我想它所需要的只是一个 CA 证书才能工作。

This may not be ideal for production, or even for development beyond just getting something to work.这对于生产来说可能并不理想,甚至对于开发来说也不是很理想。 For instance you could probably use "keytool" command to add CA certs to the "keystore.jks" file in the client.例如,您可以使用“keytool”命令将 CA 证书添加到客户端的“keystore.jks”文件中。 But anyway hopefully this at least narrows down the possible scenarios that could be going on here to cause the error.但无论如何,希望这至少可以缩小可能导致错误的可能场景。

ALSO: my approach seemed to be useful for the client (server cert added to client trust_store), it looks like the comments above to resolve the original post are useful for the server (client cert added to server trust_store).另外:我的方法似乎对客户端有用(将服务器证书添加到客户端 trust_store),看起来上面解决原始帖子的评论对服务器很有用(客户端证书添加到服务器 trust_store)。 Cheers.干杯。

Eclipse project setup: Eclipse 项目设置:

  • MyClientProject我的客户项目
  • src源代码
  • test测试
  • JRE System Library JRE 系统库
  • ... ...
  • trust_store信任库
    ---cacerts.jks ---keystore.jks ---cacerts.jks ---keystore.jks

Snippet from MyClientProject.java file: MyClientProject.java 文件中的片段:

static {
  // Setup the trustStore location and password
  System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
  // comment out below line
  System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
  System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
  //System.setProperty("javax.net.debug", "all");

  // for localhost testing only
  javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
        public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
          return hostname.equals("localhost");
        }

  });
}

My problem was that a Cloud Access Security Broker, NetSkope, was installed on my work laptop through a software update.我的问题是云访问安全代理 NetSkope 通过软件更新安装在我的工作笔记本电脑上。 This was altering the certificate chain and I was still not able to connect to the server through my java client after importing the entire chain to my cacerts keystore.这改变了证书链,在将整个链导入到我的 cacerts 密钥库后,我仍然无法通过我的 java 客户端连接到服务器。 I disabled NetSkope and was able to successfully connect.我禁用了 NetSkope 并能够成功连接。

Check if the file $JAVA_HOME/lib/security/cacerts exists!检查文件$JAVA_HOME/lib/security/cacerts是否存在! In my case it was not a file but a link to /etc/ssl/certs/java/cacerts and also this was a link to itself (WHAT???) so due to it JVM can't find the file.就我而言,它不是文件,而是指向/etc/ssl/certs/java/cacerts的链接,而且这也是指向自身的链接(什么???),因此 JVM 无法找到该文件。

Solution: Copy the real cacerts file ( you can do it from another JDK ) to /etc/ssl/certs/java/ directory and it'll solve your problem :)解决方案:将真正的 cacerts 文件(您可以从另一个 JDK复制)复制到/etc/ssl/certs/java/目录,它会解决您的问题:)

Wasted a lot of time on that issue.在这个问题上浪费了很多时间。 If you imported the certificate and you can see it listed here.如果您导入了证书,您可以在此处看到它。

keytool -list -v -keystore $JAVA_HOME/lib/security/cacerts

Then create the new one, with the following command, replace SITE_NAME, SITE_PORT, CERTIFICATE_NAME and path to save file.然后创建一个新的,使用以下命令,替换 SITE_NAME、SITE_PORT、CERTIFICATE_NAME 和保存文件的路径。

echo -n | openssl s_client -connect SITE_NAME:SITE_PORT  \
| openssl x509 > /path/to/save/CERTIFICATE_NAME.cert

In my case, I experienced problem using Keycloak with Spring.就我而言,我在使用带有 Spring 的 Keycloak 时遇到了问题。 After I created certificate with this command and imported to keystore, the problem was solved and it works fine在我使用此命令创建证书并导入密钥库后,问题得到解决并且工作正常

*** note for eclipse / Sts users: because eclipse uses it's own jre, you should add certs to it's own jre. *** eclipse / Sts 用户注意事项:因为 eclipse 使用它自己的 jre,所以您应该将证书添加到它自己的 jre。 I had this issue until I added certs to Sts's jre.在我将证书添加到 Sts 的 jre 之前,我遇到了这个问题。 Ssl log: SSL日志:

`javax.net.ssl|DEBUG|1A|restartedMain|2021-12-06 23:04:00.874` IRST|TrustStoreManager.java:113|trustStore is: D:\sts-4.12.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_16.0.2.v20210721-1149\jre\lib\security\cacerts

This is the full path: "sts-4.12.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_16.0.2.v20210721-1149\jre\lib\security\cacerts"这是完整路径:“sts-4.12.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_16.0.2.v20210721-1149\jre\lib\security\cacerts”

In my case I was facing the problem because in my tomcat process specific keystore was given using就我而言,我遇到了这个问题,因为在我的 tomcat 进程中,使用了特定的密钥库

-Djavax.net.ssl.trustStore=/pathtosomeselfsignedstore/truststore.jks

Wheras I was importing the certificate to the cacert of JRE/lib/security and the changes were not reflecting.当我将证书导入 JRE/lib/security 的 cacert 时,更改没有反映出来。 Then I did below command where /tmp/cert1.test contains the certificate of the target server然后我做了下面的命令,其中 /tmp/cert1.test 包含目标服务器的证书

keytool -import -trustcacerts -keystore /pathtosomeselfsignedstore/truststore.jks -storepass password123 -noprompt -alias rapidssl-myserver -file /tmp/cert1.test

We can double check if the certificate import is successful我们可以仔细检查证书导入是否成功

keytool -list -v -keystore /pathtosomeselfsignedstore/truststore.jks

and see if your taget server is found against alias rapidssl-myserver并查看是否针对别名 rapidssl-myserver 找到了您的 taget 服务器

In my case, I was getting error connecting to AWS Gov Postgres RDS.就我而言,我在连接到 AWS Gov Postgres RDS 时遇到错误。 There is a separate link for GOV RDS CA certs- https://s3.us-gov-west-1.amazonaws.com/rds-downloads/rds-combined-ca-us-gov-bundle.pem GOV RDS CA 证书有一个单独的链接- https://s3.us-gov-west-1.amazonaws.com/rds-downloads/rds-combined-ca-us-gov-bundle.pem

Add this pem certs to cacerts of java.将此 pem 证书添加到 java 的 cacerts。 You can use below script.您可以使用以下脚本。

------WINDOWDS STEPS------- ------窗口步骤-----

  1. Use VSCODE editor and install openssl, keytool plugins使用VSCODE编辑器并安装openssl、keytool插件
  2. create a dir in C:/rds-ca在 C:/rds-ca 中创建一个目录
  3. place 'cacerts' file and below script file - 'addCerts.sh' inside dir 'rd-ca'将 'cacerts' 文件和脚本文件下方 - 'addCerts.sh' 放在 dir 'rd-ca' 内
  4. run from vscode: 4.1 cd /c/rds-ca/ 4.2 ./addCerts.sh从 vscode 运行:4.1 cd /c/rds-ca/ 4.2 ./addCerts.sh
  5. Copy cacerts to ${JAVA_HOME}/jre/lib/security将 cacerts 复制到 ${JAVA_HOME}/jre/lib/security

Script code:脚本代码:

#!/usr/bin/env sh

OLDDIR="$PWD"

CACERTS_FILE=cacerts

cd /c/rds-ca

echo "Downloading RDS certificates..."

curl  https://s3.us-gov-west-1.amazonaws.com/rds-downloads/rds-combined-ca-us-gov-bundle.pem > rds-combined-ca-bundle.pem

csplit -sk rds-combined-ca-bundle.pem "/-BEGIN CERTIFICATE-/" "{$(grep -c 'BEGIN CERTIFICATE' rds-combined-ca-bundle.pem | awk '{print $1 - 2}')}"

for CERT in xx*; do
    # extract a human-readable alias from the cert
    ALIAS=$(openssl x509 -noout -text -in $CERT |
                   perl -ne 'next unless /Subject:/; s/.*CN=//; print')
    echo "importing $ALIAS"
    
    keytool -import \
            -keystore  $CACERTS_FILE \
            -storepass changeit -noprompt \
            -alias "$ALIAS" -file $CERT
done

cd "$OLDDIR"
echo "$NEWDIR"

I created a ubuntu on my windows 10 laptop and I ran into issue when I was trying to load CMAK site download from https://github.com/yahoo/CMAK site.我在 Windows 10 笔记本电脑上创建了一个 ubuntu,当我尝试从https://github.com/yahoo/CMAK站点加载 CMAK 站点下载时遇到了问题。 First it gave fatal ssl error.首先它给出了致命的 ssl 错误。

openssl s_client -showcerts -servername github.com -connect github.com:443 </dev/null 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'  > github-com.pem

and use the following command (make sure you put right path for ca-cert)并使用以下命令(确保为 ca-cert 放置正确的路径)

cat github-com.pem | sudo tee -a /etc/ssl/certs/ca-certificates.crt

Then use the following statement (make sure the path for cert is correct):然后使用以下语句(确保 cert 的路径正确):

git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt

Then I was able to download CMAK but ran into issue when i tried ./sbt clean statement.然后我能够下载 CMAK,但在尝试./sbt clean语句时遇到了问题。 It was giving a pkix path error.它给出了一个pkix path错误。 The reason is that I do not have my company issue cert stored in my cacert file.原因是我的 cacert 文件中没有存储公司颁发的证书。

I have downloaded the company cert (google on how to do it) and followed this article to add my downloaded cert to cacert file.我已经下载了公司证书(谷歌如何做到这一点)并按照这篇文章将我下载的证书添加到 cacert 文件中。 Used sudo update-ca-certificates one more time before ./sbt ../sbt之前再使用一次sudo update-ca-certificates It worked for me.它对我有用。

Note: You may have to switch between root and exit when you are following above steps.注意:执行上述步骤时,您可能需要在 root 和 exit 之间切换。

This is what I did.这就是我所做的。

I wanted to develop the app on Java 10, and I had the Eclipse IDE 2020-06.我想在 Java 10 上开发应用程序,并且拥有 Eclipse IDE 2020-06。 The cert import solution did not work for me.证书导入解决方案对我不起作用。 So then I installed Java 11 JDK, switched to the latest Eclipse IDE (which runs on Java 11), and made sure that the source-code still gets compiled against the Java 10, by adding these statemements under Maven POM:然后我安装了 Java 11 JDK,切换到最新的 Eclipse IDE(在 Java 11 上运行),并通过在 Maven POM 下添加以下语句来确保源代码仍然针对 Java 10 进行编译:

    <maven.compiler.target>1.10</maven.compiler.target>
    <maven.compiler.source>1.10</maven.compiler.source>
    <maven.compiler.release>10</maven.compiler.release>

And it works like a charm;它就像一个魅力; no errors.没有错误。

I added this in my pom.xml file and it worked for me我在我的 pom.xml 文件中添加了它,它对我有用

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
        </plugins>
</build>

Lets say if you are using classpath variables like ${JAVA_HOME} in pom.xml. 假设您在pom.xml中使用$ {JAVA_HOME}之类的类路径变量。

<target>
                    <property name="compile_classpath" refid="maven.compile.classpath"/>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <property name="test_classpath" refid="maven.test.classpath"/>
                    <property name="plugin_classpath" refid="maven.plugin.classpath"/>
                    <property name="jaxb-api.jar" value="${maven.dependency.javax.xml.bind.jaxb-api.jar.path}"/>
                    <property name="project_home" value="${PROJECT_HOME}"/>
                    <property name="java_home" value="${JAVA_HOME}"/>
                    <property name="ant_home" value="${ANT_HOME}"/>
                    <property name="common_home" value="${COMMON_HOME}"/>
                    <property name="JAXP_HOME" value="${common_home}/lib"/>
                    <property name="ejfw_home" value="${PROJECT_HOME}/lib"/>
                    <property name="weblogic_home" value="${WL_HOME}"/>
                    <property name="fw_home" value="${FW_HOME}"/>
                    <property name="env" value="${BUILDENV}"/>
                    <property name="tokenfile" value="${BUILDENV}${BUILDENV_S2S}.properties"/>

On goals, add the classpath variables. 在目标上,添加类路径变量。 ie.., -DANT_HOME , -DJAVA_HOME 即..,-DANT_HOME,-DJAVA_HOME

clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 PKIX路径构建失败:无法找到请求的目标的有效证书路径-导入的CERT - PKIX path building failed: unable to find valid certification path to requested target - imported CERT CAS登录后找不到指向请求目标的有效证书路径-&gt; - Unable to find valid certification path to requested target -> after CAS login 无法找到到请求目标的有效证书路径 - unable to find valid certification path to requested target 无法找到到请求目标的有效证书路径 - unable to find a valid certification path to requested target 间歇性 SSL 错误:无法找到到请求目标的有效认证路径 - Intermittent SSL error: unable to find valid certification path to requested target 需要帮助运行带有证书文件的 Spring restTemplate - 无法找到请求目标的有效证书路径 - Need help running Spring restTemplate with cert files - unable to find valid certification path to requested target 将 certificate.pfx 导入 cacerts,但仍然收到“PKIX...无法找到到请求目标的有效证书路径”错误。 做什么? - imported a certificate.pfx into cacerts and still getting "PKIX...unable to find valid certification path to requested target" error. What do? gradlew 无法找到请求目标的有效认证路径 - gradlew unable to find valid certification path to requested target 突然“无法找到到请求目标的有效认证路径” - Sudden "unable to find valid certification path to requested target" SunCertPathBuilderException:无法找到所请求目标的有效证书路径 - SunCertPathBuilderException: unable to find valid certification path to requested target`
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM