내 JVM이 어떤 키 저장소를 사용하고 있는지 어떻게 알 수 있습니까?


125

내 JVM 키 저장소로 인증서를 가져와야합니다. 다음을 사용하고 있습니다.

keytool -import -alias daldap -file somecert.cer

그래서 아마도 내 전화를 다음과 같이 변경해야 할 것입니다.

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit

1
서명 된 CSR이 아닌 경우 인증서를 JVM 신뢰 저장소 로 가져와야합니다.이 경우 인증서를 자체 키 저장소 로 가져와야 하며 그 위치를 이미 알고 있어야합니다. 그렇지 않으면 인증서 를 생성 할 수 없었을 것입니다. 키 쌍 또는 CSR.
Marquis of Lorne

답변:


129

키 저장소는 JAVA_HOME---> JRE -->lib---> security--> cacerts. JAVA_HOME이 구성되어있는 위치 (가능하면 다음 위치 중 하나)를 확인해야합니다.

  1. 컴퓨터 ---> 고급-> 환경 변수 ---> JAVA_HOME

  2. 서버 시작 배치 파일.

가져 오기 명령 -keystore cacerts에서 (단지 cacerts를 말하는 대신 여기에 위의 JRE에 대한 전체 경로를 제공하십시오).


6
/ Library / Java / Home / lib / security / cacerts (Mac OS X 10.9)
Sam Barnum

9
* "JAVA_HOME ---> JRE-> lib ---> 보안-> cacerts"향후 독자를 위해 끝에있는 "s"에 유의하십시오.
Keir Nellyer

4
따라서 새 버전의 Java를 설치하고 JAVA_HOME이 새 디렉토리를 가리키는 경우 인증서 문제가 발생합니까?
Kirill Yunussov 2015

1
@Murphy :이 힘의 도움을 당신이 stackoverflow.com/questions/5251323/...
한국 철강 협회

4
이것은 내가 생각하는 키 저장소 위치가 아니라 신뢰 저장소 위치입니다.
user2001850

35

키 저장소 위치

각 keytool 명령에는 keytool에서 -keystore관리하는 키 저장소에 대한 영구 키 저장소 파일의 이름과 위치를 지정 하는 옵션이 있습니다. 키 저장소는 기본적으로 .keystore"user.home"시스템 등록 정보에 의해 결정된대로 사용자의 홈 디렉토리에 이름이 지정된 파일에 저장됩니다 . 사용자 이름 uName이 주어지면 "user.home"속성 값의 기본값은

C:\Users\uName on Windows 7 systems
C:\Winnt\Profiles\uName on multi-user Windows NT systems
C:\Windows\Profiles\uName on multi-user Windows 95 systems
C:\Windows on single-user Windows 95 systems

따라서 사용자 이름이 "cathy"이면 "user.home"의 기본값은

C:\Users\cathy on Windows 7 systems
C:\Winnt\Profiles\cathy on multi-user Windows NT systems
C:\Windows\Profiles\cathy on multi-user Windows 95 systems

http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html


이 미스터리 ~/.keystore파일을 찾고있었습니다 ! -keystore매개 변수를 생략하면 기본 키 저장소 keytool타겟팅을 파악할 수 없습니다 . 나는 cacerts기계에서 다른 곳을 계속 찾고 있었다 . 내가 생성하는 키 도구 기대하지 않았다 ~/.keystore홈 디렉토리에 않으며의 이름은 할 .keystore대신 cacerts. 자바 사람들이 문서화해야 할 빈칸을 채웠습니다! 감사합니다!
George Pantazes

26

Java 1.8이 설치된 Mac OS X 10.12 :

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

거기에서 다음과 같습니다.

./jre/lib/security

거기에 cacerts 키 저장소가 있습니다.

이를 VM 옵션으로 지정하려면 :

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

나는 이것이 올바른 방법이라고 말하는 것이 아닙니다 (왜 자바가 JAVA_HOME 내에서 보는 것을 알지 못합니까?).하지만 이것이 작동하도록하기 위해해야 ​​할 일입니다.


16

"홈"디렉토리에서 찾을 수 있습니다.

Windows 7의 경우 :

C:\Users\<YOUR_ACCOUNT>\.keystore

Linux (Ubuntu) :

/home/<YOUR_ACCOUNT>/.keystore

4
이 디렉토리가 Windows에 없습니다
simgineer 2013

1
나는 현재 디렉토리에 하나를 만들 것으로 예상하여 키 저장소를 지정하지 않고 -keygen을 수행했지만 말한대로 내 집에서 만들었습니다. ~ / .keystore 오랫동안 찾을 수 없었습니다! :-) 감사.
Eurospoofer

내가 cygwin 아래에 Windows 경로가 사용된다는 것을 추가하겠습니다. Java 속성 user.home이 cygwin에 의해 설정된 $HOMEDRIVE$HOMEPATH것이 아니라 Windows에 의해 설정된 것과 같기 때문에 $HOME여기서 HOMEDRIVE=C:그리고HOMEPATH=\Users\[YOUR ACCOUNT]
user1708042

13

이것은 나를 위해 작동합니다.

#! / bin / bash

CACERTS = $ ( readlink - e $ ( dirname $ ( readlink - e $ ( which keytool ))) /../ lib / security / cacerts )

만약 키 도구 - 목록 - 키 스토어 $ cacerts에 - StorePass를 changeit를 > / dev에 / 널 (null) ; 그때  
    에코 $ CACERTS
else 
    echo 'cacerts 파일을 찾을 수 없습니다.' > & 2 
    출구 1 fi 

Linux 전용입니다. 내 Solaris에는 읽기 링크가 없습니다. 결국 나는이 Perl-Script를 사용했습니다.

#! / usr / bin / env perl use strict ; 사용 경고 ; 사용 CWD QW ( realpath ); 
$ _ = 실제 경로 (( grep { -x && - f }


   map { "$ _ / keytool" } split ( ':' , $ ENV { PATH })) [ 0 ]); die "keytool을 찾을 수 없습니다" 정의 되지 않은 경우 $ _ ; $ keytool = $ _ ; 인쇄
  

 " '$ keytool'사용. \ n" ; 
s / keytool $ / /;
$ _ = realpath ($ _. '../ lib / 보안 / cacerts ');
die "cacerts를 찾을 수 없습니다", -f $ _가 아니면;
내 $ cacerts = $ _;
print " ' $ cacerts ' 로 가져 오기 . \ n";
`$ keytool -list -keystore "$ cacerts"-storepass changeit`;
$가 아니면 "키 컨테이너를 읽을 수 없습니다." == 0;
종료하면 $ ARGV [0] 당량 ' - D를 ';
foreach (@ARGV) {
    내 $ cert = $ _;
    s /\.[^.]+$//;
    내 $ alias = $ _;
    print " ' $ cert '를 ' $ alias ' 가져 오는 중 입니다. \ n";
    `keytool -importcert -file "$ cert"-alias "$ alias"-keystore "$ cacerts"-storepass changeit`;
    "인증서를 가져올 수 없습니다 : $?"경고 $가 아니면? == 0;
}

6

DimtryB가 언급했듯이 기본적으로 키 저장소는 사용자 디렉터리 아래에 있습니다. 그러나 cacertsJVM이 키를 선택할 수 있도록 파일 을 업데이트하려는 경우에서 파일을 업데이트해야 cacerts합니다 jre/lib/security. 명령 keytool -list -keystore cacerts을 실행 하여 인증서가 추가되었는지 확인하여 키를 볼 수도 있습니다 .


keytool 명령 lib/security이 상대 이름 만 제공하면 자동으로 올바른 경로를 추가한다는 사실을 알게되어 기쁩니다 .
13시 58 분

1
그러나 이것은 -importcert. list 명령은 시스템 전체 인증서를 표시하지만 import 명령은 현재 디렉토리에 새 파일을 생성합니다.
ceving

1
updatedb; locate cacertscacerts 파일의 설치 위치를 찾는 데 도움이됩니다.
sjas

5

Debian에서는 openjdk 버전 "1.8.0_212"를 사용하여 여기에서 cacerts를 찾았습니다.

 /etc/ssl/certs/java/cacerts

물론이 경로를 출력하는 표준 명령이 있다면 편리합니다.


1

공식 OpenJDK 12 Docker 이미지를 사용하는 경우 Java 키 저장소의 위치는 다음과 같습니다.

/usr/java/openjdk-12/lib/security/cacerts

이것은 키 저장소가 아니라 신뢰 저장소입니다.
Marquis of Lorne

1
첫째 : 질문 (그리고 자신의 의견)을주의 깊게 읽으면 인증서를 가져와야하는 Truststore처럼 들립니다. 둘째, Truststore와 Keystore의 차이점은 상당히 혼란 스럽습니다. 둘 다 형식을 모두 사용하기 때문에 "Keystore"btw라는 용어를 사용합니다. 셋째 : import 명령 keytool -import -file example.crt -alias exampleCA -keystore truststore.jks을 살펴보면 매개 변수도 사용합니다 -keystore. IMHO는 매우 명확하지 않습니다. 그리고 마지막으로 중요한 것은 바로 그 정확한 문제에 대해 찾고 있었는데 그 질문을 발견했습니다. 다른 사람들도 똑같이 경험할 수 있습니다.
jonashackt

또한 다른 모든 답변은 JDK가 유효성을 검사하는 데 사용하는 소위 "Truststore"를 참조합니다. 그래서 다른 모든 답변에도 반대 투표를 했습니까? 나는 이미 찬성 투표를 받았으므로 이미 내 대답이 도움이 된 사람이 있습니다.
jonashackt

0

자동 jre 업데이트 후 (거의 완전히) 제거 된 jre 디렉토리에서 실행중인 Tomcat에서이 문제가 발생하여 실행중인 jre가 더 이상 존재하지 않기 때문에 더 이상 jre ... / lib / security / cacerts를 찾을 수 없습니다.

Tomcat을 다시 시작하면 (다른 jre 위치에서 실행되도록 구성을 변경 한 후) 문제가 해결되었습니다.


0

위의 모든 답변 외에도 :

JRE 디렉토리에서 cacerts 파일을 업데이트해도 도움이되지 않으면 JDK에서 업데이트 해보십시오.

C : \ Program Files \ Java \ jdk1.8.0_192 \ jre \ lib \ security

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.