2017-02-14 9 views
1

내가 HTTPS 웹 사이트에 연결하려고 할 때 : 내가 대신 http://company.com를 사용하는 경우

StringBuilder sb = new StringBuilder(); 
     URL oracle = new URL("https://company.com"); 
     URLConnection yc = oracle.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      sb.append(inputLine); 
     in.close(); 
     return sb.toString(); 

내가

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 

를 얻을 수 그것은 작동하지만 https 하나를 사용하기를 원합니다. 왜냐하면 그것이 사용하는 말이고 비보안 제품이 제거 될 수 있다고 생각하기 때문입니다.

그러나 이것에 대한 비슷한 대답을 보았을 때 브라우저 ectera에서 인증서를 복사하는 방법에 대해 이야기합니다. 특별한 작업을 수행하지 않고도 모든 컴퓨터에서 코드를 실행하는 모든 사용자에게 적합한 솔루션이 필요합니다.

이 프로젝트의 SSL 보안 이점에 관심이 없습니다. 단지 wenbsite에 연결할 수 있기를 원합니다.

+3

"SSL에 대해 걱정하지 않음으로써"문제의 사이트가 분명히 man-in-the-middle 공격에 속아서도 man-in-the-middle 공격에 속아 있다는 것을 신경 쓰지 않는다고 말합니다. in-the-middle 공격 (https 버전 사용을 말하고 http 버전이 언젠가 제거 될 수 있음). –

+0

먼저, 사이트가 HTTP를 제공하지 않으면 어쨌든 실패 할 것입니다. 둘째, 런타임은 기본 [트러스트 스토어] (http://stackoverflow.com/questions/1398556/connect-to-https-siteserver)와 함께 제공되므로 요청이 작동해야합니다. 어쩌면 해당 웹 사이트의 인증서에 문제가있어 유효성을 확인할 수 없습니다. – Alfabravo

+0

@ T.J.Crowder 그들이 https 버전을 제공하지 않았다면 사이트를 사용하지 말라고 말하지 않을 것입니다. 데이터에 대해 중요한/민감한 정보는 없습니다. 그래서 제 생각에 SSL에 대해 걱정하지 않는 것에 대해 비난하는 대신 어떻게 문제를 해결할 수 있습니까? –

답변

1

이미 접근법에 대해 경고 한 것 같아서 귀하의 질문에 답변 해 드리겠습니다. 이유를 말할 수는 없지만 내 컴퓨터에서 문제를 재현 할 수있었습니다. 브라우저가 사이트의 인증서를 허용하지만 문제가 발생하지는 않습니다.

나는 코드를 확장하여 작동 시키려고했지만, 곧 SSLContext, 다양한 crypto-providers 및 서비스 공급자 인터페이스로 엉망이되었습니다. 필자는이 접근 방식을 완료하지 못했고 실제로 JVM의 글로벌 보안 설정을 변경하고 그 밖의 작업에 따라 예측할 수없는 결과를 초래할 수 있으므로 실제로 그런 식으로 진행하지 않을 것입니다.

대신에 연결의 보안 설정을보다 세부적으로 제어 할 수있는 Apache HttpComponents library을 살펴 보시기 바랍니다. 문제를 재 - 소개 SSLContextSSLContexts.createSystemDefault();에 변경

TrustStrategy veryNaive = new TrustStrategy() { 
    @Override 
    public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
     return true; 
    } 
}; 

SSLContext sslcontext = SSLContexts.custom() 
    .loadTrustMaterial(veryNaive) 
    .build(); 

CloseableHttpClient httpclient = HttpClients.custom() 
    .setSSLSocketFactory(new SSLConnectionSocketFactory(sslcontext)) 
    .build(); 

try { 
    HttpGet httpget = new HttpGet("https://company.com"); 

    try (CloseableHttpResponse response = httpclient.execute(httpget);) { 
     HttpEntity entity = response.getEntity(); 
     System.out.println(EntityUtils.toString(entity)); 
     EntityUtils.consume(entity); 
    } 
} finally { 
    httpclient.close(); 
} 

그냥 또한 아파치 라이브러리에 대한 현재의 것을 입증 :

다음은 생성 된 HttpClient 예를 들어 모든 인증서 유효성 검사를 비활성화합니다.

+0

솔루션에 비해 너무 많은, 내가 HttpComponents 4.5.3 및 SSLContexts.custom() 사용하고 있지만 하나의 문제가 있습니다. loadTrustMaterial() truststore보다는 truststoregy 필요 것으로 보인다? –

+0

@PaulTaylor : 올바른 것을 사용하고 있는지 확인하십시오. 라이브러리는 두 개의'SSLContexts' 클래스를 포함하고있는 것으로 보이며, 그 중 하나는 더 이상 사용되지 않습니다. 올바른 것은'org.apache.http.ssl.SSLContexts' (http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/ssl/SSLContexts.html)입니다. – Henrik

+0

감사합니다. 내 유일한 문제는 지금 내가 때로는 조회 URL이 존재하지 않는다는 것입니다. 그리고 코드를 처리하지 못하면 아무것도 반환하지 않고 찾을 수없는 일부 JSON을 리턴합니다. 내 http (안전하지 않은) 경우와 다른 오류 코드를 제공합니다. . –