2010-05-19 2 views
1

SSL 연결을 통해 개인 정보를 보내야하는 독립 실행 형 실행 파일 JAR 프로그램을 만들었습니다.
인증서를 사용하여 SSL 연결을 설정할 수 없습니다. 이 점점되었다 : Java 독립 실행 형 응용 프로그램을 사용하여 SSL 연결

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path `building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target` 

그래서 나는 인증서 체인의 유효성을 검사하지 않는 트러스트 매니저를 생성 어딘가에 몇 가지 코드를 발견 트릭을했고, 내가 어떤없이 SSL 연결을 설정할 수 있었다
// Create a trust manager that does not validate certificate chains 
TrustManager[] trustAllCerts = new TrustManager[]{ 
      new X509TrustManager() { 
       public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 
       public void checkClientTrusted(
        java.security.cert.X509Certificate[] certs, String authType) { 
       } 
       public void checkServerTrusted(
        java.security.cert.X509Certificate[] certs, String authType) { 
       } 
      } 
     }; 

인증서.

개인 정보를 교환 할 때 데이터가 여전히 암호화되는 경우 걱정됩니다. 이것은 클라이언트가 컴퓨터로 다운로드 할 실행 JAR 파일입니다.

이 경우 인증서가 정말 필요합니까?

답변

4

아직 암호화되어 있지만 신뢰할 수는 없습니다. 대신 인증서 유효성 검사 문제를 해결하는 것이 가장 좋습니다.

기본적으로 SSL은 암호화와 신뢰 메커니즘을 모두 제공합니다. 신뢰할 수있는 부분을 건너 뛰므로 메시지는 여전히 암호화되지만 가로 채기 또는 스누핑을하는 경향이 있습니다 (예 : 중간자 (man-in-the-middle) 공격). MITM은 요청을 가로 챌 수 있고 완전히 다른 인증서를 사용하여 SSL 핸드 셰이크를 완료 할 수 있습니다. 메시지를 의도 한 서버 &으로 선택적으로 전달할 수 있으므로 메시지가 도청 된 것을 결코 알 수 없습니다.

서버 인증서를 다운로드하여 런타임에로드 할 수있는 트러스트 스토어에 보관해야합니다.

keytool을 참조하십시오. keytool 실행 파일은 JDK와 함께 번들로 제공되며이 명령 줄 도구를 사용하여 '키 스토어'(이 경우 '트러스트 스토어'라고 함)를 만들고 인증서를 가져올 수 있습니다.

Java에 키 스토어를 사용하도록 지시하는 방법에는 여러 가지가 있으며, 선택은 SSL 연결에 사용하는 라이브러리 등에 따라 다릅니다. 한 가지 방법은 시작 옵션, 예를 사용하는 것입니다

-Djavax.net.ssl.trustStore = mySrvKeystore -Djavax.net.ssl.trustStorePassword = 123456

"키 스토어 자바 '와 함께 도서관에 대한 Google에 최저 이름 (당신이 하나를 사용하는 경우) 등의 트러스트 매니저, 연결이 여전히 암호화됩니다 (또는 익명 암호 스위트)와

HTH

+0

답변 해 주셔서 감사합니다. 매우 유용합니다. 따라서이 JAR 파일은 클라이언트 컴퓨터에 다운로드/설치되므로 인증서를 다운로드하여 키 저장소에 보관할 수있는 방법이 있다고 생각합니다. 인증서를 다운로드하여 클라이언트 컴퓨터에 저장해야합니까? 이렇게하려면 클라이언트 컴퓨터에서 keytool 명령을 실행하기 위해 원시 코드를 사용해야합니까? – Marquinio

+0

아니요, 자신의 컴퓨터에서 keytool을 한 번 실행 한 다음 응용 프로그램과 함께 키 스토어 (일반적으로 ..jks 파일)를 전달하면됩니다. 나는 당신이 당신의 jar 파일에 keystore를 래핑 할 수 있고 클래스 패스를 통해 참조 할 수 있다고 확신한다. ... Java ssl 클라이언트 구현은 이해하기 쉽지 않으며, 읽고 이해해야한다. 괜찮아요 ... – laher

+0

고마워요. 이제 나는해야 할 일에 대해 명확한 시각을 가지고 있습니다. – Marquinio

2

(당신은을 사용하는 암호 제품군을 활성화하지 않는 가정 null 암호. 기본적으로 활성화되지 않아야 함).

그러나 클라이언트는 비밀 정보를 교환하는 엔티티를 알지 못합니다. 중간자 공격자 일 수 있습니다.

암호화가 충분하지 않습니다. 대화 상대를 알아야합니다.

  • 이 인증서가 유효

    • 그것 (즉, 트러스트 매니저의 목적, 그러나 그것은 아무것도 거부하지 때문에이 특정 구현의) 정품으로 서버 인증서를 신뢰 : 클라이언트가 있는지 확인해야합니다 클라이언트가 접속하려고 한 호스트 명.
  • 관련 문제