자바 SSL 및 인증서 키 저장소


165

Java 프로그램은 인증서를 포함하는 키 저장소가 어디에 있는지 어떻게 알 수 있습니까? 또는 Java 프로그램에 키 저장소를 찾을 위치를 알려주는 방법은 무엇입니까?

어떤 방법으로 키 저장소를 지정한 후 서버를 클라이언트로 인증하는 데 사용할 인증서를 지정하는 방법은 무엇입니까?


System.setProperty 설정을 사용하지 않는 것이 좋습니다 (아래의 접근 방식). docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , SSLContext를위한 KeyManagerFactory 구성 방법
Marek- A-

답변:


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

4
누구든지 Windows 상자에서 이것을 참조하는 방법을 알고 있습니까? System.setProperty ( "javax.net.ssl.trustStore", "C : \\ Program Files (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); 나를 위해 작동하지 않습니다 :(
simgineer

4
Windows에서 지정된 경로 이름은 백 슬래시 (\) 대신 슬래시 (/)를 사용해야합니다.
Droidman

이 작동 했습니까? 내 'jks'파일에 CA 인증서가있는 동일한 코드를 사용했습니다. 그러나 여전히 javax.xml.ws.WebServiceException : org.apache.axis2.AxisFault : Transport error : 403 Error : SOAP 생성 스텁을 통해 클라이언트 코드를 호출 할 때 금지 된 오류가 발생합니다. 어떤 아이디어?
james2611nov

1
비밀번호 시스템 특성 (javax.net.ssl.trustStorePassword)도 있습니다. JVM 인수로 전달 될 수도 있습니다. -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov : HTTPS 엔드 포인트를 호출하는 HTTP 403 오류 (또는 다른 HTTP 응답)가 표시되면 TLS 설정을 성공적으로 마친 것입니다 .TLS 채널이 설정되면 HTTP 상호 작용이 발생합니다 ( 그렇지 않으면 보호 할 수 없었습니다). 예,이 답변은 분명히 당신에게 도움이되었습니다. :-)
ruakh

295

SSL 특성은 시스템 특성을 통해 JVM 레벨에서 설정됩니다. 프로그램을 실행할 때 설정 (java -D ....)하거나 System.setProperty를 수행하여 코드에서 설정할 수 있음을 의미합니다.

설정해야 할 특정 키는 다음과 같습니다.

javax.net.ssl.keyStore- 애플리케이션 프로세스의 자체 인증서 및 개인 키를 포함하는 Java 키 저장소 파일의 위치 Windows에서 지정된 경로 이름은 백 슬래시 대신 슬래시 (/)를 사용해야합니다.

javax.net.ssl.keyStorePassword - javax.net.ssl.keyStore에 의해 지정된 키 저장소 파일에서 개인 키에 액세스하기위한 비밀번호입니다. 이 비밀번호는 두 번 사용됩니다. 키 저장소 파일의 잠금을 해제하고 (저장소 암호) 키 저장소에 저장된 개인 키를 해독하려면 (키 암호).

javax.net.ssl.trustStore- 이 응용 프로그램 프로세스 (신뢰 저장소)가 신뢰하는 CA 인증서 콜렉션을 포함하는 Java 키 저장소 파일의 위치. Windows에서 지정된 경로 이름 /은 백 슬래시 대신 슬래시 ()를 사용해야합니다 \.

이 등록 정보를 사용하여 신뢰 저장소 위치를 지정하지 않으면 SunJSSE 구현은 다음 위치에서 키 저장소 파일을 순서대로 검색하고 사용합니다.

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword-로 지정된 키 저장소 파일 (저장소 비밀번호)을 잠금 해제하는 비밀번호 javax.net.ssl.trustStore입니다.

javax.net.ssl.trustStoreType- (선택 사항) Java 키 저장소 파일 형식의 경우이 특성 값은 jks (또는 JKS)입니다. 기본값은 이미 jks이므로 일반적으로이 특성을 지정하지 마십시오.

javax.net.debug -SSL / TLS 계층에 대한 로깅을 켜려면이 특성을 ssl로 설정하십시오.


17
인용 된 문서에 링크하는 것이 더 적절합니다. 나는 이것이 같아요 : fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno

4
공식 문서는 JSSE 참조 안내서 여야합니다. docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung


11
시스템 신뢰 저장소를 편집하려는 사용자의 경우 기본 비밀번호는 "changeit"입니다. community.oracle.com/thread/1540678?start=0&tstart=0
cwc

javax.net.ssl.trustStorePassword prop의 경우 +1 나는 잠시 동안 둘러 보았고 이것이 처음 언급 한 것입니다.
jgreen

22

한마디 만주의하십시오. Java 9 이상에서 기존 JKS 키 저장소를 열려고하는 경우 값이 "JKS"인 다음 특성도 언급해야합니다.

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

java.security 파일에 규정 된 기본 키 저장소 유형이 Java 9부터 jks에서 pkcs12로 변경 되었기 때문입니다.


11

우선, 두 종류의 키 저장소가 있습니다.

개인일반

응용 프로그램은 시작 또는 시스템 기본값에 표시된 것을 사용합니다.

JRE 또는 JDK가 실행 중이거나 개인 또는 "전역"폴더를 확인하는 경우 다른 폴더가됩니다.

그들은 너무 암호화

간단히 말해 경로는 다음과 같습니다.

$JAVA_HOME/lib/security/cacerts 당국에 대한 모든 CA를 가지고 있고 매우 중요한 "일반적인 것"을 위해.


유형은 'keystore'및 'truststore'입니다. 중복 용어를 발명하지 마십시오.
Lorne의 후작

9

-D아래와 같이 속성을 사용하여 런타임에 경로를 언급 할 수도 있습니다

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

아파치 스파크 응용 프로그램에서 --conf옵션과 키를 사용하여 인증서 및 키 저장소의 경로를 제공하고 다음 과 extraJavaoptions같이 스파크 제출

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.