신뢰 저장소와 키 저장소-keytool로 작성
키 저장소에는 일반적으로 개인 / 공개 키와 신뢰 저장소 만 공개 키 (및 통신하려는 신뢰할 수있는 당사자 목록을 나타냄)가 있음을 이해합니다. 글쎄, 그것은 나의 첫 번째 가정이므로, 그것이 맞지 않으면 아마도 잘 시작하지 않았을 것입니다 ...
keytool을 사용할 때 저장소를 어떻게 / 언제 구별하는지 이해하는 데 관심이있었습니다.
지금까지는 키 저장소를 사용하여 만들었습니다.
keytool -import -alias bob -file bob.crt -keystore keystore.ks
내 keystore.ks 파일을 만듭니다. yes
bob을 신뢰합니까?라는 질문에 대답 하지만 이것이 키 저장소 파일 또는 신뢰 저장소 파일을 작성했는지 확실하지 않습니까? 파일을 사용하도록 응용 프로그램을 설정할 수 있습니다.
-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.keyStore
및 javax.net.ssl.trustStore
매개 변수를 빌드하는 데 사용되는 기본 매개 변수입니다 KeyManager
들과 TrustManager
의 (각각), 다음 구축하는 데 사용 SSLContext
를 통해 / TLS 연결에 SSL을 만들 때 기본적으로 사용하는 SSL / TLS 설정을 포함하는 SSLSocketFactory
또는를 SSLEngine
. 이러한 시스템 속성은 기본값이 나오는 곳에서 SSLContext.getDefault()
사용되며 SSLSocketFactory.getDefault()
예를 들어 자체적으로 사용됩니다 . (이 SSLContext
목적을 위해 기본값과 특정 값을 사용하지 않으려는 경우 API를 통해 여러 곳 에서이 모든 것을 사용자 정의 할 수 있습니다 .)
사이의 차이 KeyManager
와 TrustManager
(및 사이 javax.net.ssl.keyStore
및 javax.net.ssl.trustStore
(인용로부터 다음과 같이)이다 JSSE 가이드 REF )
TrustManager : 원격 인증 자격 증명 (및 연결)을 신뢰할지 여부를 결정합니다.
KeyManager : 원격 호스트로 전송할 인증 자격 증명을 결정합니다.
(다른 매개 변수를 사용할 수 있으며 해당 기본값은 JSSE 참조 안내서에 설명되어 있습니다. 신뢰 저장소에 대한 기본값은 있지만 키 저장소에 대한 값은 없습니다.)
기본적으로 키 저장소는 javax.net.ssl.keyStore
개인 키와 인증서 javax.net.ssl.trustStore
를 포함하고 원격 당사자가 인증서를 제시 할 때 신뢰할 수있는 CA 인증서를 포함합니다. 개별 저장소 (특히 파일 기반 인 경우)를 사용하는 것이 더 좋지만 경우에 따라 하나의 저장소와 동일한 저장소가 될 수도 있습니다.
일반적인 유스 케이스 / 목적 또는 평신도 방식으로 설명하려면 :
TrustStore : 이름에서 알 수 있듯이 일반적으로 신뢰할 수있는 엔터티의 인증서를 저장하는 데 사용됩니다. 프로세스는 신뢰할 수있는 모든 신뢰할 수있는 당사자의 인증서 저장소를 유지 관리 할 수 있습니다.
keyStore : 서명 된 인증서와 함께 서버 키 (공용 및 개인용)를 저장하는 데 사용됩니다.
SSL 핸드 셰이크 동안
클라이언트가 https : //에 액세스하려고합니다.
따라서 서버는 SSL 인증서 (keyStore에 저장 됨)를 제공하여 응답합니다.
이제 클라이언트는 SSL 인증서를 수신하고 trustStore를 통해이를 검증합니다 (즉, 클라이언트의 trustStore에는 이미 사전 정의 된 인증서 세트가 신뢰합니다). 이 서버를 신뢰할 수 있습니까? 이것은 내가 말하려고하는 동일한 서버입니까? 중간 인 공격이 없습니까?
일단 클라이언트가 신뢰하는 서버와 통신하고 있는지 확인하면 공유 비밀 키를 통해 SSL 통신이 발생할 수 있습니다.
참고 : 서버 측의 클라이언트 인증에 대해서는 여기서 이야기하지 않습니다. 서버가 클라이언트 인증도 수행하려는 경우 서버는 클라이언트를 확인하기 위해 trustStore를 유지 관리합니다.
키 저장소와 신뢰 저장소 파일에는 차이가 없습니다. 둘 다 독점적 인 JKS 파일 형식의 파일입니다. 내가 아는 한, Java는 javax.net.ssl.trustStore
SSL 연결을 만들 때 신뢰할 인증서를 찾기 위해 참조하는 저장소 만 사용합니다 . 키와 동일합니다 javax.net.ssl.keyStore
. 그러나 이론적으로는 신뢰 및 키 저장소에 하나의 동일한 파일을 사용하는 것이 좋습니다.
키 저장소는 서버에서 개인 키를 저장하는 데 사용되며 Truststore는 타사 클라이언트가 액세스하기 위해 서버에서 제공 한 공개 키를 저장하는 데 사용됩니다. 나는 프로덕션 응용 프로그램에서 그 작업을 수행했습니다. 다음은 SSL 통신을위한 Java 인증서 생성 단계입니다.
- Windows에서 keygen 명령을 사용하여 인증서를 생성하십시오.
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
- 인증서 자체 인증 :
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
- 폴더로 인증서 내보내기 :
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
- 클라이언트 신뢰 저장소로 인증서 가져 오기 :
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
가장 간단한 용어로 :
Keystore 는 자격 증명 (서버 또는 클라이언트)을 저장 하는 데 사용되는 반면 truststore 는 다른 자격 증명 (CA의 인증서 )을 저장 하는 데 사용됩니다.
키 저장소는 SSL에서 서버 측을 설정할 때 필요하며 서버의 ID 인증서를 저장하는 데 사용되며 연결시 클라이언트의 신뢰 저장소 설정에 포함되어야하는 서버의 연결에서 클라이언트에 제공 할 서버입니다. SSL을 통해 웹 사이트에 연결하기 위해 브라우저를 사용하면 서버가 신뢰 저장소에 대해 제시 한 인증서를 확인합니다.
keystore는 단순히 개인 키를 저장하지만 truststore는 공개 키를 저장합니다. SSL 통신을위한 Java 인증서를 생성하려고합니다. Windows에서 keygen 명령을 사용할 수 있습니다. 아마도 가장 쉬운 해결책 일 것입니다.
참고 URL : https://stackoverflow.com/questions/6340918/trust-store-vs-key-store-creating-with-keytool
'Programing' 카테고리의 다른 글
재귀없이 찾기 (0) | 2020.04.14 |
---|---|
C #에서 Excel 파일 읽기 (0) | 2020.04.14 |
C #의 트리 데이터 구조 (0) | 2020.04.14 |
AngularJS의 지시문에 서비스를 삽입 할 수 있습니까? (0) | 2020.04.14 |
PyCharm에서 최대 줄 길이를 어떻게 설정합니까? (0) | 2020.04.14 |