2012-04-02 2 views
1

인증을 통해 https를 통한 서비스에 연결하는 모듈을 작성했습니다. 키 저장소로의 적절한 경로를 설정 한 후 올바르게 작동합니다. Tomcat 응용 프로그램에서 jar로 모듈을 사용하고 싶을 때 문제가 있습니다. 나는 적절한 경로 (절대 경로)과 키 저장소 설정하지만 연결하려고 할 때 나는 내가 잘못된 키 스토어를했을 때 전에이 메시지를 받았습니다 기억으로 나는 악수를 예외SSLHandshakeException - 복수 SSL 연결시

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

를 얻을. Tomcat에서 제대로 작동하려면 더 많은 작업을 수행해야합니까? 내가 놓친 다른 문제? 인증없이 https를 통해 다른 서비스에 연결하면 Tomcat 앱에서 정상적으로 작동합니다.

편집 : 문제는 ssl (Tomcat뿐만 아니라)을 통해 다른 서비스에 연결하는 프로젝트를 실행하는 것이 었습니다. 하나는 인증이 있고 다른 하나는없는 것입니다. 그래서 나는 제목을 편집했다.

+0

클라이언트 측 또는 tomcat 로그에서이 오류가 발생합니까? 이 오류는 일반적으로 클라이언트 트러스트 스토어에 서버 인증서 (또는 그 부모 인증서 중 하나)가 없을 때 클라이언트 쪽입니다. –

+0

트러스트 스토어를 구성한 방법 및 위치는 어디입니까? – Bruno

+0

당신의 대답은 맞는 것처럼 보입니다, 당신은 그것을 받아 들여야합니다. (그래서이 문제는 해결 된 것으로 표시됩니다) –

답변

1

다시 한 번 나 자신에게 답을하고 있습니다. How to control SSLContext scope을 읽은 후 동일한 작업을하기로 결정 했으므로 정상적으로 작동합니다. 기본적으로 나는 어떤 신뢰를 (그래서 기본 인 cacerts를 사용)를 설정하지 않고 내가 인증을 필요로 할 때 내가 사용

httpsUrlConnection.setSSLSocketFactory(getSSLContext().getSocketFactory()); 

getSSLContext는() 나는

(을 setDefault없이) 내가 것보다 쓴 반환 할 때 Tomcat 응용 프로그램에서 기본 SSLContext를 변경하는 방법을 알고 싶습니다. 누군가 도움이 될 수 있다면 감사하겠습니다.

+0

이것은 포럼이 아니지만 Q & A 사이트입니다. 한 가지 질문에 대한 답변을 하나만 사용하십시오. 새로운 것을 시도한 경우 자신의 질문에 대한 답변에 세부 정보를 추가하는 대신 질문을 편집하십시오. – Bruno

+0

죄송합니다. 기억할 것입니다. – jasiustasiu

1

Setting multiple truststore on the same JVM 나에게 답을 주었다. 나는 오직 핵심 공장뿐만 아니라 신뢰 공장을 설정하는 데 필요한 :

System.setProperty는 이미 설정된 ssl 속성을 설정하지 않습니다.

// load your key store as a stream and initialize a KeyStore 
    InputStream trustStream = new FileInputStream("Resources/keystore.ImportKey"); 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 

    // if your store is password protected then declare it (it can be null however) 
    String trustPassword = "changeit"; 

    // load the stream to your store 
    trustStore.load(trustStream, trustPassword.toCharArray()); 

    // initialize a trust manager factory with the trusted store 
    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustFactory.init(trustStore); 

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    keyFactory.init(trustStore, trustPassword.toCharArray()); 

    // get the trust managers from the factory 
    TrustManager[] trustManagers = trustFactory.getTrustManagers(); 
    KeyManager[] keyManagers = keyFactory.getKeyManagers(); 

    // initialize an ssl context to use these managers and set as default 
    SSLContext sslContext = SSLContext.getInstance("SSL"); 
    sslContext.init(keyManagers, trustManagers, null); 
    SSLContext.setDefault(sslContext); 

잘 작동합니다.

관련 문제