신뢰 저장소와 키 저장소-keytool로 작성


249

키 저장소에는 일반적으로 개인 / 공개 키와 신뢰 저장소 만 공개 키 (및 통신하려는 신뢰할 수있는 당사자 목록을 나타냄)가 있음을 이해합니다. 글쎄, 그것은 나의 첫 번째 가정이므로, 그것이 맞지 않으면 아마도 잘 시작하지 않았을 것입니다 ...

keytool을 사용할 때 상점을 구별하는 방법 / 시점을 이해하는 데 관심이있었습니다.

지금까지는 키 저장소를 사용하여 만들었습니다.

keytool -import -alias bob -file bob.crt -keystore keystore.ks

내 keystore.ks 파일을 만듭니다. yesbob을 신뢰합니까?라는 질문에 대답 하지만 이것이 키 저장소 파일 또는 신뢰 저장소 파일을 작성했는지 확실하지 않습니까? 파일을 사용하도록 응용 프로그램을 설정할 수 있습니다.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

와 함께 System.setProperty( "javax.net.debug", "ssl")세트, 나는 (그러나 키 스토어 섹션에서) 신뢰할 수있는 인증에 따라 인증서를 볼 수 있습니다. 내가 가져 오는 특정 인증서에는 공개 키 만 있으며 SSL 연결을 통해 Bob에게 물건을 보내는 데 사용하려고합니다 (그러나 다른 질문에는 가장 적합합니다!).

모든 조언이나 설명은 대단히 감사하겠습니다. keytool의 결과는 가져온 것과 동일하며 하나는 키 저장소이고 다른 하나는 신뢰 저장소라고하는 규칙에 해당합니까? SSL 등을 사용할 때 어떤 관계가 있습니까?


"가져 오는 특정 인증서에는 공개 키만 있습니다"라는 의미가 무엇인지 잘 모르겠습니다. 공개 키 (예 : 인증서가 아님) 또는 비 CA 인증서입니까?
Bruno

흠, 확실하지 않습니다. 브라우저에서 PEM 파일로 내보냈습니다. 도움이 되나요?
Toby

브라우저에서 내 보낸 경우 인증서 일 수 있습니다. 서버 인증서입니까 (서버 이름과 일치하는 CN 또는 subjectAltName이있는)? CA 인증서입니까 (기본 제약 조건 아래에서 브라우저를 사용하여 볼 수 있어야합니다).
Bruno

2
tl : dr : 신뢰 저장소에는 공개, 신뢰할 수있는 루트 (CA) 인증서가 포함되지만, 신원 / 키 저장소에는 개인 ID 인증서가 포함됩니다. 그러나 파일 단위는 동일합니다.
앤드류

답변:


346

용어는 참으로 혼란 조금이지만, 모두 javax.net.ssl.keyStore와이 javax.net.ssl.trustStore지정하는 데 사용되는 두 개의 서로 다른 목적에 사용할 키 스토어. 키 스토어는 다양한 형식으로 제공되며 반드시 파일 일 필요는 없으며 ( 이 질문 참조 ), keytool다양한 작업을 수행하기위한 도구 일뿐입니다 (import / export / list / ...).

javax.net.ssl.keyStorejavax.net.ssl.trustStore매개 변수를 빌드하는 데 사용되는 기본 매개 변수입니다 KeyManager들과 TrustManager의 (각각), 다음 구축하는 데 사용 SSLContext를 통해 / TLS 연결에 SSL을 만들 때 기본적으로 사용하는 SSL / TLS 설정을 포함하는 SSLSocketFactory또는를 SSLEngine. 이러한 시스템 속성은 기본값이 나오는 곳에서 SSLContext.getDefault()사용되며 SSLSocketFactory.getDefault()예를 들어 자체적으로 사용됩니다 . (이 SSLContext목적을 위해 기본값과 특정 값을 사용하지 않으려는 경우 API를 통해 여러 곳 에서이 모든 것을 사용자 정의 할 수 있습니다 .)

사이의 차이 KeyManagerTrustManager(및 사이 javax.net.ssl.keyStorejavax.net.ssl.trustStore(인용로부터 다음과 같이)이다 JSSE 가이드 REF )

TrustManager : 원격 인증 자격 증명 (및 연결)을 신뢰할지 여부를 결정합니다.

KeyManager : 원격 호스트로 전송할 인증 자격 증명을 결정합니다.

(다른 매개 변수도 사용 가능하며 기본값은 JSSE 참조 안내서에 설명되어 있습니다. 신뢰 저장소에 대한 기본값은 있지만 키 저장소에 대한 값은 없습니다.)

기본적으로 키 저장소는 javax.net.ssl.keyStore개인 키와 인증서 javax.net.ssl.trustStore를 포함하고 원격 당사자가 인증서를 제시 할 때 신뢰할 수있는 CA 인증서를 포함합니다. 경우에 따라 개별 저장소를 사용하는 것이 더 좋지만 (특히 파일 기반 인 경우), 동일한 저장소가 될 수도 있습니다.


답장을 보내 주셔서 감사합니다. 사용법에 관해서는 여전히 혼란 스럽습니다 .-pk를 통해 pk12 pri / pub 키 (xxx.p12)를 키 저장소 (-D를 통해)로 사용하고 신뢰 저장소에 대한 언급없이 SSL 연결을 만들 수 있습니다 D .. 오 잘.
Toby

57
일반적으로 $JAVA_HOME/lib/security/cacerts( JRE와 함께 번들로 제공되는) 기본값이 있기 때문에 신뢰 저장소를 지정할 필요가 없습니다 ( 보낸 두 번째 JSSE 참조 안내서 링크 참조). 브라우저와 마찬가지로 신뢰할 수있는 기본 CA 인증서 세트가 포함되어 있습니다. 일반적으로 클라이언트는 항상 신뢰 저장소를 사용하여 서버 인증서를 확인하지만 키 저장소는 서버가 클라이언트 인증서를 요청하는 경우에만 사용되며 서버는 항상 자체 키 + 인증에 키 저장소를 사용하지만 신뢰 저장소는 클라이언트가 클라이언트 인증서를 보내는 경우에 사용됩니다.
Bruno

2
유용한 정보를 주셔서 감사합니다. Weblogic에는 서버의 SSL 인증서를 저장하는 "identity-key-store"가 있고 서버가 신뢰하는 SSL 인증서를 저장하는 "trust-key-store"가 있으므로 "identity-key"라고 말하면 맞습니다. -store "는"keystore "일 뿐이며"trust-key-store "는"truststore "일 뿐입니 까?
hagrawal

@Bruno는 또한 "jssecacerts"가있을 때 "cacerts"는 무시된다는 것에 주목해야한다.
kommradHomer

61

일반적인 유스 케이스 / 목적 또는 평신도 방식으로 설명하려면 :

TrustStore : 이름에서 알 수 있듯이 일반적으로 신뢰할 수있는 엔터티의 인증서를 저장하는 데 사용됩니다. 프로세스는 신뢰하는 모든 신뢰할 수있는 당사자의 인증서 저장소를 유지할 수 있습니다.

keyStore : 서명 된 인증서와 함께 서버 키 (공용 및 개인용)를 저장하는 데 사용됩니다.

SSL 핸드 셰이크 동안

  1. 클라이언트가 https : //에 액세스하려고합니다.

  2. 따라서 서버는 SSL 인증서 (keyStore에 저장 됨)를 제공하여 응답합니다.

  3. 이제 클라이언트는 SSL 인증서를 수신하고 trustStore를 통해이를 검증합니다 (즉, 클라이언트의 trustStore에는 이미 신뢰하는 사전 정의 된 인증서 세트가 있습니다). 그것은 :이 서버를 신뢰할 수 있습니까? 이것은 내가 말하려고하는 동일한 서버입니까? 중간 인 공격이 없습니까?

  4. 일단 클라이언트가 신뢰하는 서버와 통신하고 있는지 확인하면 공유 비밀 키를 통해 SSL 통신이 발생할 수 있습니다.

참고 : 서버 측의 클라이언트 인증에 대해서는 여기서 이야기하지 않습니다. 서버가 클라이언트 인증도 수행하려는 경우 서버는 클라이언트를 확인하기 위해 trustStore를 유지 관리합니다.


25

키 저장소와 신뢰 저장소 파일에는 차이가 없습니다. 둘 다 독점 JKS 파일 형식의 파일입니다. 내가 아는 한, Java는 -Djavax.net.ssl.trustStoreSSL 연결을 작성할 때 신뢰할 수있는 인증서를 찾기 위해 시스템 특성에서 참조하는 저장소 만 사용합니다 . 키와 동일합니다 -Djavax.net.ssl.keyStore. 그러나 이론적으로는 신뢰 및 키 저장소에 하나의 동일한 파일을 사용하는 것이 좋습니다.


4
javax.net.ssl.keyStoreTypejavax.net.ssl.trustStoreType시스템 속성 을 설정하여 다른 유형의 키 저장소 (예 : PKCS12)를 사용할 수 있습니다 .
Donal Fellows

1
@Donal : 좋은 추가. 지원되는 모든 컨테이너 목록이 있는지 알고 있습니까? 나는 PKCS12와 JKS에 대해서만 알고 있습니다 (이전은 시행 착오의 결과입니다 ...).
musiKk

2
키 스토어 형식은 사용 가능한 제공자에 따라 다릅니다 ( 기본적으로 Oracle JRE와 번들로 제공되는 제공자는 이 목록 참조 ). 이 질문에 대한 토론도있었습니다 . 다른 공급자 (예 : BouncyCastle)를 다른 형식으로 사용할 수 있습니다.
Bruno

21

키 저장소는 서버에서 개인 키를 저장하는 데 사용되며 Truststore는 타사 클라이언트에서 액세스하기 위해 서버에서 제공 한 공개 키를 저장하는 데 사용됩니다. 나는 프로덕션 응용 프로그램에서 그 작업을 수행했습니다. 다음은 SSL 통신을위한 Java 인증서 생성 단계입니다.

  1. Windows에서 keygen 명령을 사용하여 인증서를 생성하십시오.

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. 인증서 자체 인증 :

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. 폴더로 인증서 내보내기 :

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. 클라이언트 신뢰 저장소로 인증서 가져 오기 :

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


안녕하세요, 동일한 컨테이너 (tomcat) 내에 두 개의 다른 응용 프로그램이있는 시나리오가 있습니다. 두 애플리케이션 모두에서 나머지 엔드 포인트를 양쪽에서 각 애플리케이션으로 호출해야합니다. 마찬가지로 A에서 B와 B에서 A로 (A와 B는 두 가지 응용 프로그램입니다). 이 시나리오에서 신뢰 저장소를 사용해야합니까? 키 저장소를 사용하는 사용자 정의 휴식 클라이언트를 사용하고 있습니다. 제안 해주세요.
Deepak

0

다음은 Keytool을 사용하여 로컬 시스템에 Truststore를 작성하는 단계입니다. 로컬 시스템에서 URL에 대한 신뢰 저장소를 작성하는 단계

1) 크롬을 사용하여 브라우저에서 URL을 누르십시오.

2) 크롬에서 URL 왼쪽의 "i" 아이콘을 확인 하고 클릭하십시오

3) 인증서 옵션을 확인 하고 클릭하면 대화 상자가 열립니다.

4) "인증서 경로"탭 에서 신뢰 저장소를 작성하는 데 사용 가능한 인증서 수를 확인하십시오.

5) "details" tab -> click"Copy to File" -> Give the path and the name for the certificate만들고 싶은 곳으로 가십시오 .

6) 부모 인증서가 있는지 확인하고 "5" 지점을 따릅니다 .

7) 모든 인증서를 작성한 후 명령 프롬프트를 열고 인증서를 작성한 경로로 이동하십시오.

8) 아래 Keytool 명령을 제공하여 인증서를 추가하고 신뢰 저장소를 작성하십시오.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) 모든 인증서에 대해 keytool 명령을 제공하고이를 신뢰 저장소에 추가하십시오.

    keytool -list -v -keystore cacerts

-1

keystore는 단순히 개인 키를 저장하지만 truststore는 공개 키를 저장합니다. SSL 통신을위한 Java 인증서를 생성하려고합니다. Windows에서 keygen 명령을 사용할 수 있습니다. 아마도 가장 쉬운 해결책 일 것입니다.


신뢰 저장소는 신뢰할 수있는 인증서를
Lorne의 후작

-1

가장 간단한 용어로 :

Keystore 는 자격 증명 (서버 또는 클라이언트)을 저장 하는 데 사용되는 반면 truststore 는 다른 자격 증명 (CA의 인증서 )을 저장 하는 데 사용됩니다.

키 저장소는 SSL에서 서버 측을 설정할 때 필요하며 서버의 ID 인증서를 저장하는 데 사용되며 연결시 클라이언트의 신뢰 저장소 설정에 포함되어야하는 서버의 연결에서 클라이언트에 제공 할 서버입니다. SSL을 통해 웹 사이트에 연결하기 위해 브라우저를 사용하면 서버가 신뢰 저장소에 대해 제시 한 인증서를 확인합니다.

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