Java 错误-trustAnchors参数必须为非空

Java 错误-trustAnchors参数必须为非空,java,hudson,jakarta-mail,jenkins,Java,Hudson,Jakarta Mail,Jenkins,我试图在Jenkins/Hudson上配置我的电子邮件,但我不断收到错误: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 我在网上看到了大量关于这个错误的信息,但是我没有得到任何有用的信息。我在FedoraLinux(不是OpenJDK)上使用Sun的JDK 以下是我尝试过的几件事。我试着按照这个建议做,但是从Windows复制cacerts到

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

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be
    non-empty
我在网上看到了大量关于这个错误的信息,但是我没有得到任何有用的信息。我在FedoraLinux(不是OpenJDK)上使用Sun的JDK

以下是我尝试过的几件事。我试着按照这个建议做,但是从Windows复制cacerts到我的Fedora盒托管Jenkins没有用。当我试图将Gmail配置为我的SMTP服务器时,我尝试了以下操作,但也没有成功。我还尝试手动下载和移动这些cacert文件,并使用上的各种命令将它们移到我的Java文件夹中


我愿意接受任何建议,因为我目前正陷于困境。我已经从Windows Hudson服务器上获得了它,但我在Linux上遇到了困难。

这个奇怪的消息意味着您指定的
信任库是:

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

另请参见@AdamPlumb。

我从博客中找到了这个解决方案:

修复在OSX上运行OpenJDK 7时的信任锚问题。如果您在OSX上运行OpenJDK 7,并且看到此异常:

意外错误:java.security.invalidalgorithParameterException:信任锚
参数必须为非空
有一个简单的解决办法。只需在苹果JDK 1.6使用的相同cacerts文件中链接:

cd$(/usr/libexec/java_home-v1.7)/jre/lib/security
ln-fsh/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts
您需要为已安装的每个OpenJDK版本执行此操作。只需将
-v1.7
更改为要修复的版本。运行
/usr/libexec/java_home-V
查看您安装的所有JRE和JDK


也许OpenJDK的伙计们可以将此添加到他们的安装脚本中。

在(Quantal Quetzal)或更高版本中,证书保存在包中。使用
-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts
无论您使用的是什么JDK,都会获取它们。

升级到(Mavericks)后,我在OSX上使用JDK1.7遇到了这个问题。对我有效的修复方法是简单地重新安装Java的Apple版本,可在上获得。

在更新OSX v10.9(Mavericks)后,当使用旧的Java 6并试图访问HTTPS URL时,我在OS X上也遇到了这种情况。修正案与彼得·克里恩斯相反;我需要将
cacerts
从1.7空间复制到1.6版本链接的位置:

(as root)
umask 022
mkdir -p /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
cp $(/usr/libexec/java_home -v 1.7)/jre/lib/security/cacerts \
    /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security

升级到(Mavericks)后,我遇到了很多安全问题:

  • AmazonAWS的SSL问题
  • 未使用Maven和Eclipse对对等机进行身份验证
  • trustAnchors
    参数必须为非空

我应用了这个Java更新,它解决了我的所有问题:

EJP基本上回答了这个问题(我意识到这有一个公认的答案),但我只是处理了这个边缘案例,我想让我的解决方案永垂不朽

我以前为仅SSL访问设置的托管服务器上出现了
InvalidalgorithParameterException
错误。问题是我已经用PKCS#12格式设置了我的密钥库,但我的信任库是JKS格式的


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

在Red Hat Linux上,我通过将证书导入
/etc/pki/java/cacerts
解决了这个问题。这为我在Ubuntu上解决了这个问题:

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
(可在此处找到:)


ca证书java
在Oracle JDK/JRE中不是依赖项,因此必须显式安装。

我希望这样,因为我在我的系统中使用了一个备用JVM(目前只支持JDK 1.7)。为了安全起见,我使用8。。。反正

  • 更新您的证书存储:

    sudo update-ca-certificates -f
    
然后

  • 在初始化参数中添加新值

    sudo gedit $(path to your architecture specific ini i.e. TOS_DI...ini)
    
    Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts
    
对我来说,第二个条目起了作用。我认为,根据Talend Open Studio/TEnt+JVM的版本,它有不同的参数名,但它查找相同的密钥库文件。

sudo update-ca-certificates -f
要创建证书文件,请执行以下操作:

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

我又开始做生意了,谢谢你们。遗憾的是,它没有包含在安装中,但我最终做到了。

在我的例子中,客户端应用程序中使用的JKS文件已损坏。我创建了一个新的,并在其中导入了目标服务器SSL证书。然后我在客户端应用程序中使用新的JKS文件作为信任存储,如:

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);
资料来源:


我使用(keystoreexplorer)工具来创建新的jk。您可以从这个链接下载它。

错误表明系统无法在参数
javax.net.ssl.truststore
提供的路径中找到信任库

在Windows下,我将
cacerts
文件从
jre/lib/security
复制到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中的证书是否仍然有效
System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");
server.ssl.key-store=classpath:server.jks
server.ssl.trust-store=classpath:server.jks
keytool -list -keystore keystore.jks
-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts
sudo apt install ca-certificates-java
sudo update-ca-certificates -f

sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure
sudo apt install ca-certificates-java
cp /etc/ssl/certs/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
sudo yum install ca-certificates
cp /etc/pki/java/cacerts /path/to/jdk-9.0.1/lib/security/cacerts
sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java
sudo apt-get remove --purge openjdk* java-common default-jdk
sudo apt-get autoremove --purge
sudo update-alternatives --config java
sudo apt-get install openjdk-8-jdk
keystore.type=jks
sudo dpkg --purge --force-depends ca-certificates-java
sudo apt-get install ca-certificates-java
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"]