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

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

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 등을 사용할 때 어떤 관계가 있습니까?



답변

용어는 참으로 혼란 조금이지만, 모두 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 인증서를 포함합니다. 경우에 따라 개별 저장소를 사용하는 것이 더 좋지만 (특히 파일 기반 인 경우), 동일한 저장소가 될 수도 있습니다.


답변

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

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

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

SSL 핸드 셰이크 동안

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

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

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

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

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


답변

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


답변

키 저장소는 서버에서 개인 키를 저장하는 데 사용되며 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


답변

다음은 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


답변

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


답변

가장 간단한 용어로 :

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

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