2015-02-06 5 views
-1

서버 측 :아파치 HTTP 클라이언트 서버 TLS 구현 : 점점 키 스토어 예외

  1. 나는 HTTPS 프로토콜이 사용하는 톰캣에 배포 보안 RESTful 서비스가 있습니다.
  2. 나는 keytool.

  3. 이 serverkeystore에서 servercertificate.cer을 수출하여 키 스토어 serverkeystore 파일을 만들었습니다.

클라이언트 측 :

  1. 클라이언트 키 저장소 clientkeystore.jsk

  2. 가 clientcertificate.cer 수출 clientkeystore.jsk

  3. 에 servercertificate.cer을 수입 만든 clientkeystore.jsk에서.

  4. JAVA_HOME/lib 디렉토리/보안 아래 clientcertificate.cer이

클라이언트 측 코드에서 예외 수입 :

Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) 
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) 
... 30 more 

코드 :

private SSLConnectionSocketFactory buildSSLSocketFactory() throws Exception, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException { 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    FileInputStream instream = new FileInputStream(new File("path to clientkeystore.jks")); 
    try { 
     trustStore.load(instream, "phhclient".toCharArray()); 
    } finally { 
     instream.close(); 
    } 
    // Trust own CA and all self-signed certs 
    SSLContext sslcontext = SSLContexts.custom() 
      .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()) 
      .build(); 
    // Allow TLSv1 protocol only 
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
      sslcontext, 
      new String[] { "TLSv1" }, 
      null, 
      SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 


    return sslsf; 
} 

수없는 찾을 수 요구 된 인증서에 대한 유효한 인증 경로 t 제가 예외를

감사와 안부를 얻고 왜 알려 주시기 바랍니다 ,이 예외에 대한

라훌자인

답변

0

이유는 코드가 클라이언트의 신뢰 저장소에 서버 인증서를 찾을 수 없습니다입니다. 서버 인증서가 클라이언트 트러스트 스토어에 추가되었는지 여부를 확인하십시오. 또한 TrustManagerFactory는 함수에서 인스턴스화되지 않습니다.

다음 코드는 SSL 소켓 팩토리를 구축하는 데 사용할 수 있습니다. 필요한 수입 명세서를 포함 시키십시오 :

SSLSocketFactory buildSSLSocketFactory() throws Exception { 
    SSLContext sslcontext = null; 

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
    KeyStore trustks = KeyStore.getInstance("JKS"); 
    File trustcert = new File("path to truststore"); 
    InputStream truststream = new FileInputStream(trustcert); 
    trustks.load(truststream, "password".toCharArray()); 
    truststream.close(); 
    tmf.init(trustks); 

    try { 
     sslcontext = SSLContext.getInstance("TLS"); 

     sslcontext.init(new KeyManager[0], 
       tmf.getTrustManagers() , 
       new SecureRandom()); 
    } catch (NoSuchAlgorithmException e) { 
     System.out.println("Exception :"+e);  
    } catch (KeyManagementException e) { 
     System.out.println("Exception :"+e); 
    } 

    SSLSocketFactory factory = sslcontext.getSocketFactory(); 

    return factory; 
}