[java] 오류-trustAnchors 매개 변수가 비어 있지 않아야합니다.

Jenkins / Hudson에서 전자 메일을 구성하려고하는데 계속 오류가 발생합니다.

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

온라인에서 오류에 관한 많은 정보를 보았지만 아무 일도하지 않았습니다. Fedora Linux (OpenJDK 아님)에서 Sun의 JDK를 사용하고 있습니다.

내가 시도한 몇 가지가 있습니다. 이 게시물 의 조언을 따르려고했지만 Windows에서 cacerts를 Jenkins를 호스팅하는 Fedora 상자로 복사하지 못했습니다. Gmail을 SMTP 서버로 구성하려고 할 때이 가이드 를 따르 려고했지만 작동하지 않았습니다. 또한이 cacert 파일을 수동으로 다운로드하여 옮기고이 안내서 의 다양한 명령을 사용하여 Java 폴더로 옮겼습니다 .

나는 지금 당장 붙어있는 제안에 열려 있습니다. Windows Hudson 서버에서 작동하도록했지만 Linux에서 어려움을 겪고 있습니다.



답변

이 기괴한 메시지는 지정한 신뢰 저장소가 다음을 의미합니다.

  • 빈,
  • 찾을 수 없거나
  • 예를 들어 액세스 권한으로 인해 열 수 없습니다.

아래 @AdamPlumb의 답변 도 참조하십시오 .

이 문제를 디버깅하고 ( 여기에 작성했습니다 ) 사용되는 truststore를 이해 하려면 javax.net.debug = all 속성을 추가 한 다음 truststore에 대한 로그를 필터링하면됩니다. 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


답변

에서 우분투 18.04 ,이 오류는 다른 원인이있다 (로부터 JEP 229, 스위치 jks받는 키 스토어의 기본 형식 pkcs12형식, 데비안은 새 파일에 대한 기본 사용하여 파일 생성을 cacerts로) 및 해결 방법 :

# 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

Status (2018-08-07) 버그는 Ubuntu Bionic LTS 18.04.1 및 Ubuntu Cosmic 18.10에서 수정되었습니다.


bun 우분투 1770553 : [SRU] backport ca-certificates-java from cosmic (20180413ubuntu1)

bun 우분투 1769013 : ca-certificates-java 20180413 (main)을 데비안 불안정 (main)에서 병합하십시오.

bun Ubuntu 1739631 : JDK 9로 새로 설치하면 생성 된 PKCS12 cacerts 키 저장소 파일을 사용할 수 없습니다

er docker-library 145 : 9-jdk 이미지에 SSL 문제가 있습니다

bian 데비안 894979 : ca-certificates-java : OpenJDK 9에서 작동하지 않습니다. 응용 프로그램이 InvalidAlgorithmParameterException으로 실패합니다 : trustAnchors 매개 변수는 비어 있지 않아야합니다

? JDK-8044445 : JEP 229 : 기본적으로 PKCS12 키 저장소 작성

? JEP 229 : 기본적으로 PKCS12 키 저장소 작성


이 해결 방법 후에도 문제가 계속되면 방금 수정 한 Java 배포를 실제로 실행 중인지 확인할 수 있습니다.

$ which java
/usr/bin/java

다음을 사용하여 Java 대안을 ‘auto’로 설정할 수 있습니다.

$ 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파일 을 제거 하고 게시물 맨 위에있는 해결 방법 스크립트의 마지막 행에 설명 된 방식으로 파일을 재생성하십시오.


답변

이것은 우분투에서 나에게 문제가 수정되었습니다.

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

(여기에서 찾을 수 있습니다 : https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1396760 )

ca-certificates-java Oracle JDK / JRE의 종속성이 아니므로 명시 적으로 설치해야합니다.


답변

우분투 18.04에서 근본 원인은 openjdk-11-jdk (기본값)와 그에 따른 다른 패키지 간의 충돌입니다. 이미 데비안에서 수정되었으며 곧 우분투에 포함될 것입니다. 한편 가장 간단한 해결 방법은 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


답변

EJP는 기본적으로 질문에 대답했지만 (이 답변에 허용되는 답변이 있음을 알았습니다) 방금이 최첨단 문제를 해결하고 내 솔루션을 불멸화하고 싶었습니다.

이전에 SSL 전용 액세스를 설정 InvalidAlgorithmParameterException한 호스팅 된 Jira 서버 에서 오류가 발생했습니다 . 문제는 PKCS # 12 형식으로 키 저장소를 설정했지만 신뢰 저장소는 JKS 형식이었습니다.

필자의 경우 server.xmlkeystoreType을 PKCS로 지정하기 위해 파일을 편집 했지만 truststoreType을 지정하지 않았으므로 keystoreType이 무엇이든 기본값으로 설정됩니다. JKS가 truststoreType을 명시 적으로 지정하면 나를 위해 해결되었습니다.


답변

OS X에서 OpenJDK 7을 실행할 때 trustAnchors 문제 해결 블로그 게시물 에서이 솔루션을 실행했습니다 .

OS X에서 OpenJDK 7을 실행할 때 trustAnchors 문제 해결. OS X에서 OpenJDK 7을 실행 중이고이 예외를 본 경우 :

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

간단한 수정이 있습니다. Apple의 JDK 1.6에서 사용하는 것과 동일한 cacerts 파일에 연결하면됩니다.

cd $(/usr/libexec/java_home -v 1.7)/jre/lib/security
ln -fsh /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts

설치 한 모든 OpenJDK 버전에 대해이 작업을 수행해야합니다. -v 1.7수정하려는 버전으로 변경 하십시오. /usr/libexec/java_home -V설치 한 모든 JRE 및 JDK를 보려면 실행 하십시오.

아마도 OpenJDK 사람들은 이것을 설치 스크립트에 추가 할 수 있습니다.


답변

우분투 12.10 (계량 적 퀘찰) 이상, 인증서가 개최되는 CA-인증서 – 자바 패키지로 제공된다. 사용하면 사용 -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts중인 JDK에 관계없이 사용됩니다.