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


492

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에서 어려움을 겪고 있습니다.

답변:


513

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

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

아래 @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

1
감사합니다 EJP, 여기 귀하의 게시물을 보았지만 신뢰 저장소가 있는지 확인하는 방법을 모르겠습니다. 또한 server.xml 파일을 가져 왔지만 신뢰 저장소가 있는지 확인하는 방법을 모르겠습니다. keystoreFile = "conf / .keystore"pref (keystoreFile이 해당 파일에 존재하지 않음) 만 확인합니까?
David Gill

2
대답은 내가 가져 오는 방법에 관한 것입니다. 결정적인 단계를 놓친 것 같습니다. [Java Error InvalidAlgorithmParameterException] [1] [1] : jyotirbhandari.blogspot.com/2011/09/…
David Gill

2
이 답변이 맞는지 확인했습니다. Tomcat에서 오류가 발생했습니다. Tomcat이 신뢰 저장소를 찾고 있었기 때문에 신뢰 저장소가 ${CATALINA_HOME}\conf있지만 CATALINA_HOME설정되지 않았습니다 \conf.
SingleShot

4
@BubblewareTechnology 아니요, 인증서를 파일로 가져 오는 방법이 아니라 파일 이름에 오류가있었습니다. 블로그가 올바르지 않습니다. 또한 JRE $ / cacerts 파일 수정을 권장하지 않아야합니다. 다음 Java 업그레이드로 변경됩니다. 이를 복사하고 자신의 인증서를 사본에 추가하고 사본을 신뢰 저장소로 사용하는 프로세스가 필요합니다. 모든 Java 업그레이드를 반복하십시오. 그리고 Java에 자체 신뢰 저장소에 대해 전혀 말할 필요가 없으며, 자신의 신뢰 저장소가 다른 경우에만 자신의 신뢰 저장소에 대해서만 설명하면됩니다.
Lorne의 후작

3
트위스트를 추가 할 것입니다. 신뢰 저장소가 존재하고 액세스 가능하고 올바른 형식으로되어 있습니다. 완전히 비어 있으면 다양한 라이브러리 (Apache HttpClient 포함)에서 얻을 수있는 오류입니다.
Alan Franzoni

265

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


50
우분투 18 사용자, 이것을 읽으십시오! 인생의 많은 시간을 절약 할 수 있습니다! 감사합니다!
vak

5
이 답변은 Ubuntu 18.04에서 maven과 동일한 오류를 수정하는 데 도움이되었습니다. / etc / ssl / certs / java / cacerts 파일의 소유자를 루트에서 자신으로 변경하여 쓸 수있게해야했습니다. 그런 다음 다시 전환했습니다.
Yuri Gor

77
나는 실행 sudo는 RM은 / etc / SSL / 인증서 표시 / 자바 / cacerts에 다음 sudo를 갱신-CA-인증서 -f 와 쿠분투 18.04에서이 고정 내 문제.
jsn

2
솔루션 덕분에 @jsn은 리눅스 민트 19에서도 작동하며 우분투 18.04를 기반으로합니다.
Samrat

2
@ JSN의 솔루션은 + openjdk8 데비안 스트레치 근무
HRJ

105

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

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의 종속성이 아니므로 명시 적으로 설치해야합니다.


2
고마워, 우분투 15.04에서 문제가 발생했을 때 문제가 해결되었습니다.
Macil

Raspberry Pi에서 Raspbian 작업
Defozo

1
OpenJDK8과 함께 데비안 jesse 안정적인 백 포트 에서이 문제에 부딪 쳤으며 문제가 해결되었습니다. Docker 이미지를 빌드하는 동안 이것을 사용했습니다. :)
Tuxdude 2016 년

9
슬프게도 Ubuntu MATE 18.04에서는 작동하지 않습니다. Java를 다시 설치해 보겠습니다.
Pranav A.

1
@ codefx-Java 10 (기본값)이있는 Ubuntu 18.x에서 제안한 작업을 수행했지만 작동하지 않습니다.
mzedeler

69

우분투 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

이 설명은 실제로 올바르지 않으며 Windows를 다시 설치하면 문제가 해결 될 수있는 것과 같은 방식으로 만 문제가 해결됩니다. 모든 Java 패키지를 제거 할 필요는 없습니다. 이 방법으로 이동하려면 openjdk-8-jdk패키지 를 설치하고 /etc/ssl/certs/java/cacerts파일을 제거한 다음 이 스레드의 다른 곳에 설명 된대로 형식 sudo update-ca-certificates -fpkcs12지정된 cacerts 파일에서 jks형식이 지정된 파일로 전환하는 원형 교차로 방법 만 실행 하면 됩니다 .
Mikael Gueck 2016 년

1
@MikaelGueck 논리가 당신 편에있는 것처럼 보이지만, 나는 이전에 귀하의 의견과 가장 많은 투표 응답에 설명 된 것을 정확하게 수행했으며 18.04 년에 이것이 유일한 답이라고 확신합니다 . 나는 당신의 downvote가 가치가 없어서 upvote로 바뀌거나 적어도 사라져야한다고 생각합니다.
Andrea Ligios 2016 년

@AndreaLigios, 스크립트를 직접 읽을 수 있으며 꽤 짧습니다. 그들은 8에서 10까지의 하드 코드 된 JAVA_HOME 경로를 가지고 있으며, 한 번에 하나씩 시도하고, 읽을 수있는 데비안 CA 파일 생성기를 호출합니다.이 파일은 JDK 키 파일 핸들러 코드입니다. 읽을 수 있고 호환성 폴백 모드가 있습니다. 컴퓨터에서이 간단한 소프트웨어를 다르게 실행하면 다른 문제가있을 수 있습니다. Java 대안을 수정하고 다른 JVM을 호출 했습니까? 제거하면 대안이 재설정 될 수 있습니까?
Mikael Gueck 2016 년

1
@MikaelGueck 예, 이전 시도 중 하나에서 Java 대안을 수정 했으므로 아마도 그럴 것입니다. 나는 소스 코드를 파고 물건이 어떻게 작동하는지 찾는 것을 좋아하는 첫 번째 사람입니다. 그러나 이것은 오늘 나의 목표가 아니 었습니다. 실제 목표를 달성하는 데 5-6 가지의 예기치 않은 장애물 중 하나였습니다. 이 답변을 통해 2 분 이내에 문제를 해결할 수있었습니다. 스크립트를 조사하고 더 나은 솔루션을 찾기 위해 얼마나 많은 시간을 투자해야합니까? 그리고 무엇을 위해 몇 메가 바이트를 절약하기 위해? 이것은 과감하지만 작동하지만 (문제가 무엇이든간에) 지옥으로 바쁜 사람들을 위해 OP에 크게 감사드립니다
Andrea Ligios

1
나는 2 일 동안 해결책을 찾고 있었고, 당신의 대답은 내 문제를 해결했습니다. 감사합니다. 방금 Kubuntu 18.04로 옮겼습니다.
guepardomar

55

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

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

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


글쎄, 난 당신이 당신의 가장자리 사건에 대한 불멸의 솔루션을 도울 수 있습니다. 그것이 흥미로워지는 곳입니다.
n611x007

2
이것은 정확히 내 문제였습니다. Spring Boot 1.4.2.RELEASE를 사용하고 있으며 하드웨어 키 저장소 및 소프트웨어 신뢰 저장소가 있습니다. 키 저장소의 제공자와 유형을 지정했지만 신뢰 저장소는 지정하지 않았습니다. 그 결과, 신뢰 저장소에서 잘못된 제공자 및 유형을 사용했습니다. 이를 지정하면 (SUN 및 JKS) 문제가 해결되었습니다.
Kenco

12
정확히 어떻게 했습니까? (여기서 Windows)
tatsu

2
오늘 내 Android Grandle 로이 문제를 해결하십시오. 나는 당신이 말하는 것을 거의 이해하지만 해결 방법을 말하지 않습니다. 도움이되지 않는 답변
Lothar

52

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 사람들은 이것을 설치 스크립트에 추가 할 수 있습니다.


1
내 "ln"명령 (OSX 10.6.8)에는 "h"옵션이 없습니다. 무엇을해야합니까?
앤드류 스완

1
아, / usr / bin (기본값)과 / bin (하나)에 두 개의 "ln"명령이있었습니다. 후자는 "h"옵션이 있었고 효과가있었습니다.
앤드류 스완

이 ln 기술을 사용하여 시스템 1.8 설치에서 cacert에 연결되는 깨진 1.6 설치를 수정했습니다. 감사!
A21z

1
미래의 리더를 들면 : 당신은 또한에있는 다른 3 개 개의 파일이 필요 보인다 security폴더 ( blacklisted.certs, local_policy.jar,와 US_export_policy.jar행복 Java 용을).
awksp

@Peter Kriens, 왜 디렉토리 cacerts아래에 링크되어 jre있습니까?
BAE

45

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


54
update-ca-certificates -fcacerts 파일을 채우기 위해 수동으로 실행 해야 한다는 것을 알았습니다.
Portablejim

4
@Portablejim 감사합니다. 귀하의 의견은 Ubuntu 15.04beta에서 Apache Spark를 빌드 한 첫 번째 문제를 해결했습니다.
Paul

1
@Portablejim에게 감사합니다. 귀하의 의견은 Ubuntu 15.04에서 저에게 효과적이었습니다.
David Berg

감사. 이것은 PhpStrom + 패치 JDK에서 내 문제가 해결되었습니다. 이 키를 "phpstorm64.vmoptions"파일에 썼습니다.
Vijit

우분투 18.04에서 나를 위해 일하지 않고 JDK는 1.8.0_62
Devendra Singraul

34

OS X v10.9 (Mavericks)로 업그레이드 한 후 JDK 1.7을 사용하여 OS X 에서이 정확한 문제가 발생했습니다 . 나를 위해 고쳐진 해결책은 http://support.apple.com/kb/DL1572 에서 구할 수있는 Apple Java 버전을 간단히 다시 설치하는 것이 었습니다 .


OSX에서 Grails가 사용하는 Java 6 에서이 문제가 발생했습니다. 또한 Oracle의 Java 7을 설치하고 Mavericks로 업그레이드했습니다. Apple 웹 사이트에서 Java 6을 다시 설치하면 문제가 해결되었습니다.
pm_labs

오픈 jdk 6을 우분투 클라우드 박스에 설치할 때 이것에 부딪 치십시오. 친숙한 얼굴을 만나서 반가워요, BTW
Ben Hutchison

30

나는 달렸다

sudo update-ca-certificates -f

인증서 파일을 작성하고 다음을 수행하십시오.

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

나는 다시 사업에 돌아갔다. 고마워. 그것은 설치에 포함되지 않은 것이 유감이지만 결국 거기에 도착했습니다.


내가 실행할 때 sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure**내가 얻을sudo: /var/lib/dpkg/info/ca-certificates-java.postinst: command not found
마법 (magick)

그냥 sudo update-ca-certificates -f와 데비안 제시에 충분하다 openjdk-8-jre-headless만큼으로,에서 제시-백 포트 ca-certificates-java설치됩니다. 설치 순서가 중요하다고 생각합니다 (JRE 이후 ca-certificates-java에는 백 포트 Java 8에 대한 트리거가 없기 때문에이 문제 가 발생할 수 있습니다).
mirabilos

2
sudo /var/lib/dpkg/info/ca-certificates-java.postinst configure 별이없는 **
Yu Jiaao

update-ca-certificates -f그것을 고친 것입니다. 나는 두 번째 명령이 필요하지 않았다
Mark Jeronimus

17

오류는 시스템이 매개 변수와 함께 제공된 경로에서 신뢰 저장소를 찾을 수 없음을 나타냅니다. javax.net.ssl.trustStore .

Windows에서 cacerts파일을 jre/lib/securityEclipse 설치 디렉토리 ( 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

2
이것이 실제로 효과가있는 유일한 대답입니다. 감사합니다 @ razvanone
Akshar Patel

1
하나의 작은 "gotcha"를 기록했습니다. eclipse.ini 파일의 세 줄은 실제로 세 줄로되어 있어야합니다. 나는 처음에 그것들을 모두 한 줄에 넣고 일식은 그것을 얻지 못했습니다.
SiKing

16

ca-certificates-java 패키지를 제거하고 다시 설치하면 나에게 도움이되었습니다 ( Ubuntu MATE 17.10 (Artful Aardvark)).

sudo dpkg --purge --force-depends ca-certificates-java

sudo apt-get install ca-certificates-java

감사합니다. jdstrand : 버그 983302에 대한 설명 1, Re : ca-certificates-java가 Oneiric Ocelot에 Java cacert를 설치하지 못합니다 .


11

OS X v10.9 (Mavericks)로 업그레이드 한 후 많은 보안 문제가있었습니다 .

  • Amazon AWS의 SSL 문제
  • Maven 및 Eclipse로 인증되지 않은 피어
  • trustAnchors 매개 변수는 비어 있지 않아야합니다.

이 Java 업데이트를 적용했으며 모든 문제가 해결되었습니다. http://support.apple.com/kb/DL1572?viewlocale=en_US


5
어. Java 6은 공개 지원이 끝난 지 수년이 지났으며 보안 허점으로 가득 차 있습니다. Apple은 Java 7/8로 실행할 수없는 이전 소프트웨어를 계속 실행할 수 있도록 다운로드 할 수 있도록하지만 공용 인터넷 서비스 (예 : 1. AWS, 2. Maven)에 SSL 연결을 만드는 데 사용해서는 안됩니다. 중앙 3. 다른 것.
Zac Thompson

10

Talend Open Studio 에서 대체 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 버전에 따라 매개 변수 이름이 다르지만 동일한 키 저장소 파일을 찾습니다.


4
부동산 javax.net.ssl.trustAnchors을 어디서 구했 습니까? JSSE 문서에는 언급되어 있지 않습니다.
Lorne의 후작

10

나를 위해 그것은 truststore에 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이 성공적으로 시작됩니다.


키 저장소 및 신뢰 저장소 (spring-security-x509 프로젝트)를 생성하는 바로 가기로 유용한 Makefile이 포함 된 NB check baeldung 튜토리얼 baeldung.com/x-509-authentication-in-spring-security
hello_earth

9

일부 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를 업데이트하십시오.
Marty

6

JDK9 및 Maven과 함께 Ubuntu 에서이 문제가 발생하면이 JVM 옵션을 추가 할 수 있습니다. 먼저 경로가 있는지 확인하십시오.

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts

파일이 누락 된 경우 누군가 지적한대로 ca-certificates-java를 설치하십시오.

sudo apt install ca-certificates-java

docker를 사용하는 경우 "maven : 3-jdk-9"대신 "maven : 3-jdk-9-slim"이미지를 사용해도됩니다.
Konstantin Pavlov

덕분에,이 우분투에 오픈 JDK-8-JDK 나를 위해 18.04 일
아프 탑 Naveed

4

Linux의 Java 9.0.1에서이 오류 메시지가 표시되었습니다. JDK의 알려진 버그로 인해 cacerts 파일이 .tar.gz 바이너리 패키지 ( http://jdk.java.net/9/ 에서 다운로드 됨)에 비어 있습니다.

"TLS는 기본적으로 OpenJDK 9에서 작동하지 않습니다"라는 JDK 9.0.1 릴리스 노트 의 "알려진 문제"단락을 참조하십시오 .

데비안 / 우분투 (및 아마도 다른 파생물)에서 간단한 해결 방법은 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

4

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형식 및 기본으로 해당 형식을 사용 우분투 16.04의 Java 8로 생성되었습니다. cacerts파일이 있었다 pkcs12우분투 18.04에 의해 생성 된 형식의 기본값으로이 형식을 사용하는 자바 (10)가있다. 이 스레드의 다른 곳에서 설명했듯이 새 형식을 사용하려면 암호를 실행 파일에 전달해야합니다. 그러나 비어있는 새 jks cacerts파일을 생성하거나 기존 파일을 복사하는 한 다음 cacerts 생성 프로세스는 기존 파일을 비우고 파일 시스템의 CA 인증서로 다시 채 웁니다.
Mikael Gueck 2016 년

3

이전 Java 6을 사용하고 HTTPS URL에 액세스하려고 시도했을 때 OS X v10.9 (매버릭스)를 업데이트 한 후 OS X에서도이 문제가 발생했습니다. 이 수정은 Peter Kriens의 반대였습니다. cacerts1.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

1
여기서 명령은 디렉토리를 파일로 복사하려고 시도합니다. 전혀 말이되지 않습니다.
praseodym

역 솔루션 사용에 대한 평가에 동의합니다. jdk1.6에 소프트 링크 /Library/Java/JavaVirtualMachines/1.6.0_33-b03-424.jdk/Contents/Home/lib/security/cacerts-> /System/Library/Java/Support/CoreDeploy.bundle이 손상되었습니다. / 목차 / 홈 / lib / security / cacerts. 그래서 깨진 소프트 링크를 다운로드 한 다음 jdk1.7 설치에서 cacerts를 복사했습니다.
James A Wilson

참고 : 완료되면 권한을 확인하기 위해 복사 한 cacerts 파일을 분류 할 수 있어야합니다.
회색

또한 올바른 방향으로 이동하도록 cp를 수정하고 mkdir 및 cp에 umask를 추가했습니다.
그레이

3

필자의 경우 클라이언트 응용 프로그램에 사용 된 JKS 파일이 손상되었습니다. 새 인증서를 만들어 대상 서버 SSL 인증서를 가져 왔습니다. 그런 다음 클라이언트 응용 프로그램의 새 JKS 파일을 다음과 같이 신뢰 저장소로 사용했습니다.

System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);

소스 : Java SSL 및 인증서 키 저장소

(KeyStore Explorer) 도구를 사용하여 새 JKS를 만듭니다. KeyStore Explorer 링크에서 다운로드 할 수 있습니다 .


keystore-explorer 가 나를 위해 일했습니다. 기본 키 저장소를 작성하고 사이트 / 호스트의 인증서 파일을 검사하고 저장하면됩니다.
Shantha Kumara

3

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필요하지 않다면 구성을 제거하면 됩니다.이 경우 아래 링크를 참조하십시오.

다음 문제에는 문제에 대한 자세한 내용이 포함되어 있습니다.


3

Android SDK sdkmanager 에서이 문제가 발생했습니다. 나 에게이 솔루션은 효과가 있었다.

  1. 이동 /usr/lib/jvm/java-8-oracle/jre/lib/security/
  2. 교체 cacertcacert.original

cacert파일은 작은 하나 (22B)이었다. 내가 설치 한 oracle-java8-installer에서 ppa:webupd8team/java(이 설명서에 따라 https://docs.nativescript.org/start/ns-setup-linux ).


2

기록을 위해 여기에 대한 답변 중 어느 것도 나를 위해 일 하지 않았습니다 . 내 Gradle 빌드 가이 오류로 신비스럽게 실패하기 시작 하여 특정 POM 파일에 대해 Maven Central 에서 HEAD를 가져올 수 없습니다 .

JAVA_HOME이 javac 문제를 디버깅하기 위해 빌드 한 OpenJDK의 개인 빌드로 설정되었습니다. 시스템에 설치된 JDK로 다시 설정하면 문제가 해결되었습니다.


... 다른 답변에 따라 신뢰 저장소를 찾지 못했습니다.
Lorne의 후작

1
예, 그러나 신뢰 저장소를 찾을 수 없다는 것을 알 수 없다면 신뢰 저장소를 찾을 수 없다는 것을 아는 것은 전적으로 도움이되지 않습니다. 잘못 될 수있는 방법에는 여러 가지가 있으며, 그 중 어느 것도 자신의 시스템에 실패한 특정 방법이 아닌 경우에는 실망합니다.
user3562927

모두 동일한 오류가 '발생'합니다. 지정된 신뢰 저장소를 열 수 없거나 비어있었습니다. 이 상황이 발생할 수있는 방법은 백만 가지가 있으며이를 모두 열거하기에 충분한 공간이 없습니다.
Lorne의 후작

1

Red Hat Linux에서 인증서를로 가져 와서이 문제를 해결했습니다 /etc/pki/java/cacerts.


1
System.setProperty("javax.net.ssl.trustStore", "C:\\Users\\user-id\\Desktop\\tomcat\\cacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "passwd");

위의 두 줄을 코드에 추가해야합니다. 신뢰 저장소를 찾을 수 없습니다.


2
그렇지 않으면 JRE 신뢰 저장소를 사용하게되며 확실히 찾을 수 있습니다. 오류는 이러한 매개 변수의 값이 아닌 잘못된 값으로 인해 발생합니다. 코드에 이름이 지정된 파일은 일반적으로 설치가 아닌 설치에만 적용됩니다.
론 후작

이러한 특성을 설정하는 올바른 방법은 명령 행에 전달하는 것입니다. java -Djavax.net.ssl.trustStore=/tmp/cacerts ...또는 JDK로 실행되는 모든 프로그램에 대해 전역으로 설정하려면 JDK management.properties파일에 행을 추가 하십시오.
Mikael Gueck

1

우분투 14.04 (Trusty Tahr) 에서 테스트하기 위해 특정 Android 제품군을 실행하는 동안이 문제에 직면했습니다 . Shaheen이 제안한대로 두 가지가 나를 위해 일했습니다.

sudo update-ca-certificates -f

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

1

인터넷에서 찾은 솔루션은 효과가 없었지만 Peter Kriens의 답변 은 수정 된 버전 으로 작동합니다.

먼저을 실행하여 Java 폴더를 찾으십시오 /usr/libexec/java_home. 나를 위해 그것은 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 다운로드 ( https://support.apple.com/kb/dl1572- 올바른 인증서가있는 것으로 가정) 의 Java 와 Mac OS X v10.12 에 설치된 Oracle의 Java (Sierra) .


1

ppa : openjdk-r / ppa의 openjdk 11이있는 우분투 14.04에서 이것은 나를 위해 일했습니다.

java.security에서 키 저장소 유형을

keystore.type=jks

그때:

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

작동하는지 확인하면 오래된 java가 여전히 실행중인 데몬을 사용하지 않아야합니다 (예 : --no-daemongradle 옵션)

이 버그는 모든 것을 잘 설명하고 https://bugs.launchpad.net/ubuntu/+source/ca-certificates-java/+bug/1739631 의 상황을 이해하는 데 도움이됩니다.


1

우분투 18.04에서 오래된 프로젝트의 유지 관리를 위해 OpenJDK 1.7을 사용해야했습니다. 이진 패키지를 다운로드했습니다. 그러나 스크립트를 실행할 때 동일한 오류가 발생했습니다.

해결 방법은 cacerts다운로드 한 JDK 파일을 jre/lib/security폴더에서 제거한 다음 다음 위치의 시스템 cacerts파일에 대한 심볼릭 링크로 만드는 것 입니다 /etc/ssl/certs/java/.

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


1

슬림 기회는 누구에게나 도움이 될 것입니다 ... 라즈베리 파이의 Docker Image에서 Java 8을 실행하는 모든 사람 (AMD CPU 사용) 다음 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"]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.