【问题标题】:Error - trustAnchors parameter must be non-empty错误 - trustAnchors 参数必须为非空
【发布时间】:2018-06-01 16:03:13
【问题描述】:

我正在尝试在 Jenkins/Hudson 上配置我的电子邮件,但我不断收到错误消息:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty

我已经在网上看到了大量关于该错误的信息,但我没有得到任何工作。我在 Fedora Linux(不是 OpenJDK)上使用 Sun 的 JDK。

这是我尝试过的一些事情。我尝试按照post 的建议进行操作,但是将 cacerts 从 Windows 复制到我的托管 Jenkins 的 Fedora 机器上没有用。我尝试关注this guide,因为我试图将Gmail 配置为我的SMTP 服务器,但它也不起作用。我还尝试手动下载和移动这些 cacert 文件,然后使用 this guide 上的命令变体将它们移动到我的 Java 文件夹中。

我愿意接受任何建议,因为我目前陷入困境。我已经让它在 Windows Hudson 服务器上工作,但我在 Linux 上苦苦挣扎。

【问题讨论】:

  • 我不知道这是否有帮助,但我在 DBeaver 中遇到过这种情况,只需要修复它,它显然也使用 java 作为它的噩梦。驱动程序配置中有 3 个选项:要求 SSL、验证服务器证书、允许检索公钥。当我取消选中“验证服务器证书”时,连接成功,之前它对除 mysql 8.0 的根连接之外的任何连接都给出了同样的错误。

标签: java hudson jakarta-mail jenkins


【解决方案1】:

我是一个可移植的粉丝,所以我不安装java,只需下载tar.gz并在路径中导出一些值,一切正常。

我解决了这个问题,但没有解决方案(安装或更新操作系统证书)对我有用。

我的错误是:我的 jdk 中的 cacerts 为空。

我不知道为什么,但是我的 jdk.tar.gz 有一个空的 cacerts 文件

/../some_openjdk/jre/lib/security/cacerts 大小:32 字节

下载自:

修复

经过多次尝试,我找到了一个正确的 jdk.tar.gz,其中的 cacerts 文件大小为 101 KB

我从https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries下载了这个open jdk

我在这个 Dockerfile 中找到了这个 url:

【讨论】:

  • 对于同一个问题,我的 cacert 有 0 个条目,因此拥有正确的 cacerts 解决了我的问题
【解决方案2】:

在我的情况下,此问题的根本原因是 empty truststore(它是应用服务器信任库)。 当我添加任何 dummy x.509 证书 然后停止抛出此错误。

在信任库中添加证书的命令 vis keytool

keytool -import -alias dummy -keystore <path to keystore> -storepass <truststore password if any>

【讨论】:

    【解决方案3】:

    对我来说,这是由于信任库中缺少trustedCertEntry 造成的。

    要测试,请使用:

    keytool -list -keystore keystore.jks
    

    它给了我:

    Keystore type: JKS
    Keystore provider: SUN
    
    Your keystore contains 1 entry
    
    cert-alias, 31-Jul-2017, PrivateKeyEntry
    

    即使我的 PrivateKeyEntry 包含 CA需要单独导入

    keytool -import -alias root-ca1 -file rootca.crt -keystore keystore.jks
    

    它导入证书,然后重新运行keytool -list -keystore keystore.jks 现在给出:

    Your keystore contains 2 entries
    
    cert-alias, 31-Jul-2017, PrivateKeyEntry,
    Certificate fingerprint (SHA1): <fingerprint>
    
    root-ca1, 04-Aug-2017, trustedCertEntry,
    Certificate fingerprint (SHA1): <fingerprint>
    

    现在它有一个trustedCertEntry,Tomcat就会成功启动。

    【讨论】:

    【解决方案4】:

    错误提示系统在参数javax.net.ssl.trustStore提供的路径中找不到信任库。

    在 Windows 下,我将 jre/lib/security 中的 cacerts 文件复制到 Eclipse 安装目录(与 eclipse.ini 文件相同的位置)并在 eclipse.ini 中添加以下设置:

    -Djavax.net.ssl.trustStore=cacerts
    -Djavax.net.ssl.trustStorePassword=changeit
    -Djavax.net.ssl.trustStoreType=JKS
    

    我在 cacerts 的路径上遇到了一些问题(%java_home% 环境变量被某种方式覆盖了),所以我使用了这个简单的解决方案。

    这个想法是提供信任库文件的有效路径 - 理想情况下是使用相对路径。您也可以使用绝对路径。

    要确保商店类型是 JKS,您可以运行以下命令:

    keytool -list -keystore cacerts
    
    Keystore type: JKS
    Keystore provider: SUN
    

    注意:由于证书有过期日期,或者可能因其他原因失效,请不时检查cacerts中的证书是否仍然有效。您通常会在最新版本的 jdk 中找到证书的有效版本。

    【讨论】:

    • 这是唯一有效的答案。谢谢@razvanone
    • 我遇到了一个小问题:eclipse.ini 文件中的三行必须在实际的三行上。我最初把它们都放在一条线上,而 Eclipse 没有把它捡起来。
    • 我设法修复了这个错误,即使所有 JVM 参数都已设置。当检查到 cacerts.jks 的路径在我的 eclipse.ini 文件中不正确时。所以即使是错误的 jks 路径也会产生这个错误。修复正确的 jks 路径解决了错误
    【解决方案5】:

    这个奇怪的消息意味着你指定的trustStore是:

    • 空,
    • 未找到,或
    • 无法打开
      • (由于错误/缺失trustStorePassword,或
      • 例如文件访问权限)。

    另见@AdamPlumb 的answer below

    【讨论】:

    • 答案是我如何导入它。我似乎错过了关键的一步。请参阅 [Java 错误 InvalidAlgorithmParameterException][1] [1]:jyotirbhandari.blogspot.com/2011/09/…
    • 确认这个答案是正确的。我在Tomcat下遇到错误。我在${CATALINA_HOME}\conf 中有我的信任库,但CATALINA_HOME 没有设置,所以Tomcat 在\conf 下寻找信任库。
    • @BubblewareTechnology 不,错误出在文件名中,而不是您将证书导入文件的方式。你的博客不正确。您也不应该建议修改 JRE$/cacerts 文件。它将改变下一次 Java 升级。您需要一个复制它的进程,将您自己的证书添加到副本中,并将该副本用作信任库。重复每次 Java 升级。而且你根本不需要告诉 Java 它自己的信任库,只需要告诉你自己的,如果它不同的话。
    • 我会添加一个转折点:即使信任库存在、可访问、格式正确,如果它是完全空的,这就是您可以使用各种库(包括 Apache HttpClient)得到的错误.
    • 顺便说一句,例如发生这种情况当从 OracleJDK8 切换到 OpenJDK8 时,因为 OpenJDK 带有一个空的信任库。从 OpenJDK11 复制一个可以解决问题
    【解决方案6】:

    Marquis of Lorne's answer 是准确的,我正在添加一些信息用于调试目的:

    要调试此问题(我在here 中写了更多详细信息)并了解正在使用(或尝试使用)的信任库,您可以添加the property javax.net.debug=all 然后过滤有关信任库的日志。您还可以使用属性 javax.net.ssl.trustStore 来指定特定的信任库。例如:

    
        java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=/Another/path/to/cacerts -jar test_get_https-0.0.1-SNAPSHOT-jar-with-dependencies.jar https://www.calca.com.py 2>&1| grep -i truststore
    
    

    【讨论】:

      【解决方案7】:

      使用 Amazon SDK v2、Windows 10 和 JDK8 进行此操作。 Amazon SDK 抱怨凭据加载。
      我通过用JDK11替换JDK8的security/cacert文件解决了这个问题。

      【讨论】:

        【解决方案8】:

        Ubuntu 18.04 中,此错误有不同的原因(JEP 229,从 jks 密钥库默认格式切换到 pkcs12 格式,并且使用默认的 Debian cacerts 文件生成新文件)和workaround:

        # Ubuntu 18.04 and various Docker images such as openjdk:9-jdk throw exceptions when
        # Java applications use SSL and HTTPS, because Java 9 changed a file format, if you
        # create that file from scratch, like Debian / Ubuntu do.
        #
        # Before applying, run your application with the Java command line parameter
        #  java -Djavax.net.ssl.trustStorePassword=changeit ...
        # to verify that this workaround is relevant to your particular issue.
        #
        # The parameter by itself can be used as a workaround, as well.
        
        # 0. First make yourself root with 'sudo bash'.
        
        # 1. Save an empty JKS file with the default 'changeit' password for Java cacerts.
        #    Use 'printf' instead of 'echo' for Dockerfile RUN compatibility.
        /usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts
        
        # 2. Re-add all the CA certs into the previously empty file.
        /var/lib/dpkg/info/ca-certificates-java.postinst configure
        

        状态 (2018-08-07),该错误已在 Ubuntu Bionic LTS 18.04.1 和 Ubuntu Cosmic 18.10 中修复。


        ?Ubuntu 1770553: [SRU] backport ca-certificates-java from cosmic (20180413ubuntu1)

        ?Ubuntu 1769013: Please merge ca-certificates-java 20180413 (main) from Debian unstable (main)

        ?Ubuntu 1739631: Fresh install with JDK 9 can't use the generated PKCS12 cacerts keystore file

        ?docker-library 145: 9-jdk image has SSL issues

        ?Debian 894979: ca-certificates-java: does not work with OpenJDK 9, applications fail with InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

        ?JDK-8044445 : JEP 229: Create PKCS12 Keystores by Default

        ?JEP 229: Create PKCS12 Keystores by Default


        如果此解决方法后问题仍然存在,您可能需要确保您实际运行的是刚刚修复的 Java 发行版。

        $ which java
        /usr/bin/java
        

        您可以使用以下方法将 Java 替代设置为“自动”:

        $ sudo update-java-alternatives -a
        update-alternatives: error: no alternatives for mozilla-javaplugin.so
        

        您可以仔细检查您正在执行的 Java 版本:

        $ java --version
        openjdk 10.0.1 2018-04-17
        OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
        OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
        

        也有其他解决方法,但它们有其自身的副作用,需要额外的未来维护,而没有任何回报。

        下一个最佳解决方法是添加行

        javax.net.ssl.trustStorePassword=changeit
        

        到文件

        /etc/java-9-openjdk/management/management.properties
        /etc/java-11-openjdk/management/management.properties
        

        无论哪个存在。

        第三个问题最少的解决方法是更改​​值

        keystore.type=pkcs12
        

        keystore.type=jks
        

        在文件中

        /etc/java-9-openjdk/security/java.security
        /etc/java-11-openjdk/security/java.security
        

        无论哪个存在,然后删除 cacerts 文件并按照帖子顶部解决方法脚本最后一行中描述的方式重新生成它。

        【讨论】:

        • Ubuntu 18 用户,请阅读!这将节省您生命中的许多小时!谢谢!
        • 这个答案帮助我在 Ubuntu 18.04 上修复了与 maven 相同的错误。我必须将 /etc/ssl/certs/java/cacerts 文件的所有者从 root 更改为我自己才能写入它。然后我把它换回来了。
        • 我跑了 sudo rm /etc/ssl/certs/java/cacerts 然后 sudo update-ca-certificates -f 这解决了我的问题kubuntu 18.04 中的问题。
        • @jsn,感谢您的解决方案,它也适用于基于 ubuntu 18.04 的 linux mint 19
        • @jsn 的解决方案也适用于 Debian Stretch + openjdk8
        【解决方案9】:

        您必须将证书文件添加到您的 java 密钥库 进入chrom,打开网站,将证书保存为txt格式

        转到cmd> keytool -import -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -alias Root -import -file Trustedcaroot.txt

        https://knowledge.digicert.com/solution/SO4085.html

        这就像一个魅力

        【讨论】:

          【解决方案10】:

          我在使用 Android SDK sdkmanager 时遇到了这个问题。对我来说,这个解决方案有效:

          1. 转到/usr/lib/jvm/java-8-oracle/jre/lib/security/
          2. cacert 替换为cacert.original

          cacert 文件很小 (22B)。我已经从ppa:webupd8team/java 安装了oracle-java8-installer(根据本手册:https://docs.nativescript.org/start/ns-setup-linux)。

          【讨论】:

            【解决方案11】:

            我也遇到了同样的错误,问题不在于配置JDK,而是trust-store:参数下application.properties文件中JKS文件的简单路径错误,仔细检查路径是否正确。

            【讨论】:

              【解决方案12】:

              我跑了

              sudo update-ca-certificates -f
              

              创建一个证书文件,然后:

              sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure`
              

              然后改变jar执行的命令行:

              sudo java -cp xx.jar:lib/* co.com.ixxx.clixxxlarxa.Main
              

              【讨论】:

                【解决方案13】:

                一些 OpenJDK 供应商的发行版是由于与二进制文件一起分发了一个空的 cacerts 文件而导致的。该错误在这里解释:https://github.com/AdoptOpenJDK/openjdk-build/issues/555

                您可以将旧安装中的文件复制到adoptOpenJdk8\jre\lib\security\cacerts,例如c:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts

                AdoptOpenJDK 漏洞版本是https://github.com/AdoptOpenJDK/openjdk8-releases/releases/download/jdk8u172-b11/OpenJDK8_x64_Win_jdk8u172-b11.zip

                【讨论】:

                • 我认为这也是我的情况。在 AdoptOpenJDK 202 中存在此错误,并且在 222 中它有效。因此,如果可能,请更新您的 jdk。
                • 谢谢。你真的拯救了我的一天。
                【解决方案14】:

                EJP 基本上回答了这个问题(我意识到这是一个可以接受的答案),但我只是处理了这个边缘情况的问题,并希望让我的解决方案永垂不朽。

                我在托管的Jira 服务器上遇到了InvalidAlgorithmParameterException 错误,我之前为仅 SSL 访问设置了该服务器。问题是我以 PKCS#12 格式设置了我的密钥库,但我的信任库是 JKS 格式。

                在我的例子中,我编辑了我的 server.xml 文件以将 keystoreType 指定为 PKCS,但我没有指定 truststoreType,因此它默认为 keystoreType 是什么。明确指定 truststoreType 为 JKS 为我解决了这个问题。

                【讨论】:

                • 好吧,我会帮助您为您的边缘案例问题提供不朽的解决方案。这就是它变得有趣的地方。
                • 这正是我的问题。我使用的是 Spring Boot 1.4.2.RELEASE,并且有一个硬件密钥库和软件信任库。我指定了密钥库的提供者和类型,但没有指定信任库。结果,信任库使用了错误的提供者和类型。指定这些(SUN 和 JKS)解决了这个问题。
                • 你到底是怎么做到的? (这里是窗口)
                • 今天和我的安卓手机碰上这个问题,我几乎明白你说什么但你没有说如何解决它。无用的答案
                • 在我的情况下,我有一个由 jdk 14 keytool 生成的信任库,默认为 pkcs 格式,试图连接到使用 jks 密钥库的 kafka 集群。我修改了创建信任库的方式以使用 switch -storetype jks 并解决了它
                【解决方案15】:

                这对任何人都有帮助,但......对于任何从 Raspberry Pi 上的 Docker 映像(使用 AMD CPU)运行 Java 8 的人来说,我得到了以下 Dockerfile 来为我构建并成功运行

                FROM hypriot/rpi-java
                USER root
                
                WORKDIR /usr/build/
                
                RUN /usr/bin/printf '\xfe\xed\xfe\xed\x00\x00\x00\x02\x00\x00\x00\x00\xe2\x68\x6e\x45\xfb\x43\xdf\xa4\xd9\x92\xdd\x41\xce\xb6\xb2\x1c\x63\x30\xd7\x92' > /etc/ssl/certs/java/cacerts
                RUN update-ca-certificates -f
                RUN /var/lib/dpkg/info/ca-certificates-java.postinst configure
                
                EXPOSE 8080
                
                ARG JAR_FILE=target/app-0.0.1-SNAPSHOT.jar
                
                ADD ${JAR_FILE} app.jar
                
                ENTRYPOINT ["java", "-Djavax.net.ssl.trustStorePassword=changeit", "-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts", "-jar", "app.jar"]
                

                【讨论】:

                  【解决方案16】:

                  就我而言,我没有完全指定 VM 参数。

                  (Run Configurations.. &gt; (under Apache Tomcat) any server &gt; (x)= Arguments &gt; VM arguments:)

                  确保所有 VM 参数都设置正确。

                  【讨论】:

                    【解决方案17】:

                    我发现了这个错误的另一个原因,这与 Ubuntu 无关。

                    我尝试在 Spring Boot 2 应用程序中设置双向 TLS,并在使用只有私钥条目且没有受信任证书条目的信任库后遇到了这个问题。

                    这是我的 Spring Boot TLS 配置

                    server.port=8443
                    server.ssl.key-alias=oba-tls
                    server.ssl.key-password=mypw
                    server.ssl.key-store-password=mypw
                    server.ssl.key-store=classpath:keys/tls-keystore.pfx
                    server.ssl.key-store-type=PKCS12
                    server.ssl.enabled=true
                    server.ssl.client-auth=need
                    
                    server.ssl.trust-store=classpath:keys/truststore.pfx
                    server.ssl.trust-store-password=mypw
                    server.ssl.trust-store-type=PKCS12
                    server.ssl.ciphers=ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-AES256-SHA384
                    server.ssl.protocol=TLS
                    server.ssl.enabled-protocols=TLSv1.2
                    

                    为了生成 truststore.pfx,我必须使用以下命令使其工作。

                    openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -out cert.crt
                    
                    keytool -importcert -alias oba-trust -file cert.crt -keystore truststore.jks
                    
                    keytool -importkeystore -srckeystore truststore.jks -destkeystore truststore.pfx -srcstoretype JKS - deststoretype PKCS12 -deststorepass yourpassword
                    

                    【讨论】:

                      【解决方案18】:

                      在 Ubuntu 18.04 上,我需要使用 OpenJDK 1.7 来维护旧项目。我下载了二进制包。但是当我在上面执行我的脚本时,我得到了同样的错误。

                      解决方案是删除jre/lib/security文件夹中下载的JDK的cacerts文件,然后将其创建为/etc/ssl/certs/java/中系统cacerts文件的符号链接:

                      sudo ln -s /etc/ssl/certs/java/cacerts /path/to/downloaded/java/jre/lib/security/cacerts

                      【讨论】:

                        【解决方案19】:

                        在 ubuntu 14.04 和来自 ppa:openjdk-r/ppa 的 openjdk 11 这对我有用:

                        在 java.security 中将密钥库类型更改为

                        keystore.type=jks
                        

                        然后:

                        sudo dpkg --purge --force-depends ca-certificates-java
                        sudo apt-get install ca-certificates-java
                        

                        当您检查它是否有效时,请确保您没有使用任何仍在运行旧 java 的守护进程(例如,--no-daemon gradle 选项)

                        这个错误很好地描述了一切,将帮助您了解发生了什么https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631

                        【讨论】:

                        • 在所有这些步骤之后似乎还需要重新启动系统
                        【解决方案20】:

                        在 Ubuntu 18.04 上,根本原因是 openjdk-11-jdk(这是默认设置)和其他依赖它的包之间的冲突。它已经在 Debian 中修复,不久将包含在 Ubuntu 中。同时,最简单的解决方法是将您的 java 降级到版本 8。使用 ca-certificates-java 的其他解决方案要复杂得多。

                        首先删除冲突的包:

                        sudo apt-get remove --purge openjdk* java-common default-jdk
                        sudo apt-get autoremove --purge
                        

                        通过以下方式检查您是否成功删除了所有相关包:

                        sudo update-alternatives --config java
                        

                        系统将提示您没有可配置的 Java,否则此解决方法失败

                        然后重新安装所需的软件包:

                        sudo apt-get install openjdk-8-jdk
                        

                        【讨论】:

                        • 此描述实际上是不正确的,并且仅在与重新安装 Windows 可能会解决问题相同的意义上解决问题。无需删除所有 Java 包。如果你想走这条路,你只需要安装openjdk-8-jdk包,删除/etc/ssl/certs/java/cacerts文件,然后运行sudo update-ca-certificates -f,这是从pkcs12格式的cacerts文件切换到@987654329的迂回方式@ 格式化的,如本线程其他地方所述。
                        • @MikaelGueck 虽然逻辑似乎站在你这边,但我在这里向你保证,我之前完全按照你的评论和大多数其他投票答案中的描述以及 18.04 这是唯一有效的答案。我认为你的反对票应该变成赞成票,或者至少消失,因为这是非常不应该的。
                        • @AndreaLigios,您可以自己阅读脚本,它们很短。他们有一组硬编码的 JAVA_HOME 路径,从 8 到 10,他们一次尝试一个,他们调用 Debian CA 文件生成器,您也可以阅读它,它使用现有的文件格式,因为 JDK 密钥文件处理程序代码,它您可以通读,具有兼容性回退模式。如果您的计算机以不同方式运行这个简单的软件,您可能会遇到其他问题。您是否修改了您的 java 替代品,并调用了其他一些 JVM,因为这样删除可能会重置替代品?
                        • @MikaelGueck 是的,在之前的一次尝试中,我已经修改了我的 java 替代品,所以可能就是这样。我是第一个喜欢深入研究源代码并了解其工作原理的人,但这不是我今天的目标,它只是我在实现真正目标的过程中遇到的 5-6 个不同的意外障碍之一。这个答案让我在不到 2 分钟的时间内解决了问题!我应该花多少时间研究脚本并找到更好的解决方案?为了什么,节省一些兆字节?这很激烈,但很有效(不管问题是什么),非常感谢 OP 让那些忙得不可开交的人
                        • 我找了2天的解决方案,你的回答解决了我的问题,谢谢。我刚搬到 Kubuntu 18.04,这工作。
                        【解决方案21】:

                        我在发送电子邮件时遇到了同样的错误,但总是不是。就我而言,我每次都更改了一行代码以获取一个新的 Session 对象:

                        MimeMessage message = new MimeMessage(Session.getDefaultInstance(props, authenticator));
                        

                        MimeMessage message = new MimeMessage(Session.getInstance(props, authenticator));
                        

                        从那时起,每次都可以发送电子邮件。

                        我得到的错误:

                        javax.mail.MessagingException:无法将套接字转换为 TLS;
                        嵌套异常是:javax.net.ssl.SSLException:
                        java.lang.RuntimeException:意外错误:
                        java.security.InvalidAlgorithmParameterException:trustAnchors

                        参数必须为非空 com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907) 在
                        com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)

                        的 javax.mail.Service.connect(Service.java:317) javax.mail.Service.connect(Service.java:176) 在
                        javax.mail.Service.connect(Service.java:125) 在
                        javax.mail.Transport.send0(Transport.java:194) 在
                        javax.mail.Transport.send(Transport.java:124)

                        【讨论】:

                          【解决方案22】:

                          删除 ca-certificates-java 包并再次安装它对我有用 (Ubuntu MATE17.10 (Artful Aardvark))。

                          sudo dpkg --purge --force-depends ca-certificates-java
                          
                          sudo apt-get install ca-certificates-java
                          

                          谢谢你,jdstrand:评论 1 对错误 983302,回复:ca-certificates-java 无法在 Oneiric Ocelot 上安装 Java cacerts

                          【讨论】:

                            【解决方案23】:

                            在从 Ubuntu 16.04 LTS (Xenial Xerus) 升级到 Ubuntu 18.04 LTS (Bionic Beaver) 后,我在尝试使用 Maven 3 时遇到了这个问题。

                            检查 /usr/lib/jvm/java-8-oracle/jre/lib/security 表明我的 cacerts 文件是指向 /etc/ssl/certs/java/cacerts 的符号链接。

                            我还有一个可疑的名为 cacerts.original 的文件。

                            我将cacerts.original 重命名为cacerts,这解决了问题。

                            【讨论】:

                            • cacerts.original 文件采用 jks 格式,是使用 Ubuntu 16.04 的 Java 8 生成的,该格式使用该格式作为默认格式。 cacerts 文件采用 pkcs12 格式,由 Ubuntu 18.04 的 Java 10 生成,默认使用这种格式。正如本线程其他地方所解释的,新格式要求您将密码传递给可执行文件。但只要您生成一个新的空jkscacerts 文件或复制一个旧文件,下一个 cacerts 生成过程就会清空现有文件,并用文件系统中的 CA 证书重新填充它。
                            【解决方案24】:

                            我在 Internet 上找到的解决方案均无效,但 Peter Kriens's answer 的修改版本似乎可以解决问题。

                            首先通过运行/usr/libexec/java_home 找到您的Java 文件夹。对我来说,它是1.6.0.jdk 版本。然后转到它的lib/security 子文件夹(对我来说是/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security)。

                            如果已经有cacerts 文件,则删除该文件,并在系统上搜索sudo find / -name "cacerts" 文件。它为我找到了多个项目,在我安装的 Xcode 版本或其他应用程序中,以及我选择的 /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts

                            使用该文件并建立一个指向它的符号链接(在之前的 Java 文件夹中)sudo ln -fsh "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/cacerts",它应该可以工作。

                            我同时拥有 - Apple 的 2017-001 下载中的 Java(https://support.apple.com/kb/dl1572 - 我认为这是正确证书的来源)和 Oracle 在 Mac OS X v10.12 (Sierra) 上安装的 Java。

                            【讨论】:

                              【解决方案25】:

                              对我来说,只需将 Jenkins 插件“电子邮件扩展插件”升级到最新版本 (2.61) 即可解决。

                              这两个插件负责 Jenkins 中的邮件配置:

                              • 电子邮件扩展
                              • 电子邮件扩展模板

                              【讨论】:

                                【解决方案26】:

                                我在 Linux 上的 Java 9.0.1 上收到此错误消息。这是由于 JDK 的一个已知 bug,其中 .tar.gz 二进制包(从http://jdk.java.net/9/ 下载)中的 cacerts 文件为空。

                                请参阅 JDK 9.0.1 Release Notes 的“已知问题”段落,说“TLS 在 OpenJDK 9 上默认不工作”。

                                在 Debian/Ubuntu(可能还有其他衍生产品)上,一个简单的解决方法是将 cacerts 文件替换为“ca-certificates-java”包中的文件:

                                sudo apt install ca-certificates-java
                                cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
                                

                                在 Red Hat Linux/CentOS 上,您可以从“ca-certificates”包中执行相同操作:

                                sudo yum install ca-certificates
                                cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
                                

                                【讨论】:

                                  【解决方案27】:

                                  我在运行特定的 Android 套件以在 Ubuntu 14.04 (Trusty Tahr) 上进行测试时遇到了这个问题。按照 shaheen 的建议,有两件事对我有用:

                                  sudo update-ca-certificates -f
                                  
                                  sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
                                  

                                  【讨论】:

                                    【解决方案28】:

                                    升级到 Spring Boot 1.4.1(或更高版本)后,您也可能会遇到此错误,因为它带来了 Tomcat 8.5.5 作为其依赖项的一部分。

                                    问题在于 Tomcat 处理信任存储的方式。如果您碰巧在 Spring Boot 配置中指定了与您的密钥库相同的信任库位置,那么您可能会在启动应用程序时收到 trustAnchors parameter must be non-empty 消息。

                                    server.ssl.key-store=classpath:server.jks
                                    server.ssl.trust-store=classpath:server.jks
                                    

                                    只需删除 server.ssl.trust-store 配置,除非您知道自己需要它,在这种情况下请参阅下面的链接。

                                    以下问题包含有关该问题的更多详细信息:

                                    【讨论】:

                                    • 这个解决方案今天救了我的命,非常感谢。
                                    【解决方案29】:

                                    为了记录,没有这里的答案对我有用。我的 Gradle 构建开始因此错误神秘地失败,无法从 Maven central 获取特定 POM 文件的 HEAD。

                                    事实证明,我将 JAVA_HOME 设置为我自己的 OpenJDK 个人版本,这是我为调试 javac 问题而构建的。将其设置回我系统上安装的 JDK 即可修复它。

                                    【讨论】:

                                    • ...根据其他答案,导致无法找到信任库。
                                    • 是的,但是如果您无法弄清楚为什么找不到信任库,那么知道无法找到信任库是完全没有帮助的。它可能出错的方式有很多,当它们都不是您自己的系统出现故障的特定方式时,这令人沮丧。
                                    • 他们都“碰巧”是同一个错误:指定的信任库无法打开或为空。出现这种情况的方式有上百万种,而 SO 上没有足够的空间来一一列举。
                                    【解决方案30】:

                                    我在使用使用 IBM Websphere JDK 密钥工具以 #PKCS12 格式导出的信任库并尝试使用 Oracle JRE 上的该文件通过 SSL 进行通信时遇到此错误。

                                    我的解决方案是在 IBM JRE 上运行或使用 IBM Websphere 密钥工具将信任库转换为 JKS,因此我能够在 Oracle JRE 中运行它。

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2012-01-08
                                      • 2018-06-03
                                      • 1970-01-01
                                      • 2021-10-14
                                      • 1970-01-01
                                      • 2021-04-30
                                      相关资源
                                      最近更新 更多