자바 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.