2016-11-12 2 views
-1

이것은 https 서버를 호출하는 코드에서 발생하는 예외에 관한 질문입니다.javax.net.ssl.SSLPeerUnverifiedException : 피어 인증되지 않은 오류

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

내부적으로 CloseableHttpClient의 인스턴스를 사용하여 PUT 호출을 실행합니다.

또한이 코드는 원격 컴퓨터에서 CI 작업으로 실행되는 기능 테스트입니다. 나는 우리가 자바에서 SSL 인증서 유효성 검사를 비활성화하거나 로컬 JVM에 인증서를 추가하는 방법을 언급 SSL 인증서 오류 몇 가지 솔루션을 보았다, 그 중 하나가 여기에있는 -

불행하게도 'peer not authenticated' SSL certificate error usng DefaultHttpClient

, 그것은 아무튼 이 컴퓨터가 원격 컴퓨터이므로 인증서가 해당 컴퓨터로 가져올 수 없습니다.

String endPoint = "https://" + hostName + ":" + port + "/v1/service/data/put"; 

endPoint는 jar에서 호출되는 코드에 설정됩니다. 따라서 우리가 변경할 수있는 범위가 없습니다.

(main 메서드를 통해) 독립 실행 형 클래스에서 endPoint에 대한 PUT 호출을하는 코드를 실행하는 경우 200/OK를 반환하는 것처럼 보입니다. 현재 .xml 파일에서 TestNG 클래스로 실행되는 경우 예외가 발생합니다.

Github 요지로 추가 된 코드는 here입니다.

자세한 내용이 필요하면 알려주세요.

+0

전화를 설정하는 방법의 요지를 볼 수 있도록 코드를 추가 할 수 있습니까? –

+0

Apache 구성 요소를 의미하는 경우 (실제로 그렇게 말하지는 않습니다)'CloseableHttpClient'는 비 구조적입니다. 일반적으로'HttpClientBuilder'의 결과를 사용합니다.이 결과는 트러스트 스토어 또는'TrustManager'를 포함한'SSLContext'를 커스터마이즈 할 수 있습니다. 코드에서이 작업을 수행하는 경우 최소한 "테스트 대상"테스트의 원칙을 어느 정도 위반하고 있으며 특히 안전성이 낮거나 완전히 안전하지 않은 릴리스를 만들 위험이 있습니다. –

+0

@melgart 위의 게시물에 링크로 코드를 추가했습니다. Github 요지로 [여기] (https://gist.github.com/sarankumarv/b05cba4d86080e84eed693bd6789f25e)입니다. – Saran

답변

-1

을 코드를 통해, 잘 작동 주요 방법.

내 코드를 static 블록에 배치하여 문제를 해결할 수있었습니다. 클래스로드 중에 사용할 수없는 인증서와 관련되어있을 수 있으므로 현재 잘 작동합니다.

+0

'클래스로드 중에 사용할 수없는 인증서'와는 아무런 관련이 없습니다. – EJP

0

거기에는 많은 것이 있지만 그 대부분은 문제와 관련이 없습니다 (캐싱, 예를 들어 통화를 설정하는 다른 상용구 코드).

이 종류의 상황에서 일반적으로하는 일은 문제를 여전히 재현 할 수있는 더 작고 작은 코드 조각으로 줄이는 것입니다. 예를 들어, 이러한 HttpClient 구성 요소를 사용하여 SSL 호출로 만들 수 있습니까? HttpClient를 4.4이 필요하며 유효한 인증서하지 않아도 사이트에서 작동이 코드를 시도 : 그것은 독립 클래스에서 실행중인 경우이 질문에서 언급 한 바와 같이

CloseableHttpClient client = HttpClients.custom() 
     .setSSLContext(sslContext) 
     .setSSLHostnameVerifier(new NoopHostnameVerifier()) 
     .build(); 
    HttpGet httpGet = new HttpGet(<your https URL here>); 
    httpGet.setHeader("Accept", <whatever appropriate for URL above>); 

    HttpResponse response = client.execute(httpGet); 
    System.out.println(response.getStatusLine().getStatusCode()); 
+0

이것은 내부적으로 코드에도 있지만 POST와 같습니다. 인증서는 구현시에도 비활성화되어 있습니다. – Saran

관련 문제