2011-10-07 1 views
7

Apache Commons HttpClient 라이브러리 (버전 3.1)를 사용하여 서버 인증서를 신뢰할 수있는 것으로 설정할 수 없다는 사실을 무시하려고합니다 (throw 된 예외 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에 의해 입증 됨).Apache Commons HttpClient 3.1을 만드는 방법 HTTPS 인증서 무효를 무시 하시겠습니까?

나는 Make a connection to a HTTPS server from Java and ignore the validity of the security certificate뿐만 아니라 Disable Certificate Validation in Java SSL Connections를 발견했지만 처음에 허용 대답은 사람이 같은 서로 다른 두 가지 버전을 사용하는 방법의 방향으로 날 지점 수 하지 않는 한, HttpClient를 4.0 (불행하게도 내가 업그레이드 할 수 없습니다입니다 동일한 프로젝트 내의 라이브러리), another answer with little more than a dead link that supposedly went to a 3.x solution이 있지만 두 번째 페이지의 코드는 약간 조정 된 버전을 사용할 때 전혀 영향을 미치지 않는 것으로 보입니다. 기본적으로 익명의 클래스를 인라인으로 사용하는 대신 클래스를 선언하고 SSL 이외에 TLS에 적용하면, 예제 코드에서와 같이 기본 HTTPS 소켓 팩토리에 SSL을 사용합니다. (그리고/또는 클래스 관련) 어떤 HttpClient 해당 인스턴스가 다른 서블릿이 실행 (하지 내 서블릿 코드 내에서 을 작성중인 있도록

바람직하게는, 나는, 스레드 -/인스턴스 넓은 것을 사용하고 싶습니다 같은 컨테이너)는 느슨한 인증서 유효성 검사 논리를 사용하지만,이 시점에서 유효한 것으로 자체 서명 된 인증서를 수락하는 한 아무 것도 할 것 같지 않습니다.

예, 보안상의 영향이 있음을 알고 있습니다.하지만이 기능이 필요한 이유는 테스트 용입니다. 일반적으로 신뢰할 수없는 인증서를 신뢰할 수 있는지 여부를 제어하는 ​​구성 옵션을 구현하여 "신뢰할 수없는 서버 인증서를 신뢰하지 않습니다"라는 것을 기본값으로 유지합니다. 그렇게하면 개발 중에 쉽게 켜거나 끌 수 있지만, 프로덕션 환경에서 수행하는 것은 방해가 될 것입니다.

답변

11

자체 서명 된 인증서를 수락하기 위해 우리는 commons http 클라이언트의 특정 HttpConnection에 대해 다음 코드를 사용합니다.

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

EasySSLProtocolSocketFactory

가있는 contrib의 SSL 패키지에서 찾을 수 있습니다. 그리고 이것은 감소 된 보안 설정으로 단 하나의 연결을 만드는 데 사용될 수 있습니다.

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

을하지만 그 또한 다른 서블릿의 연결에 영향을 미칠 것이라고 생각 : 이것은 또한 모든 클라이언트에 대한 프로토콜을 설정하는 데 사용할 수 있습니다처럼 다음과 같이 보인다.

[편집] 죄송합니다, 이것이 당신에게 도움이 될지 모르겠군요. 단지 우리가 3.0.1이 아니라 3.0.1을 사용하고 있음을 인식했습니다.

+0

예, 3.1에서는 사용자가 예시 한 Protocol 생성자를 사용하지 않으며 HttpConnection # setProtocol 메서드가 전혀 없습니다. 동정, 그것은 유망 해 보였습니다. : –

+0

생성자는 3.0.1에서 더 이상 사용되지 않습니다.) 아파치 소스 저장소에 따르면'HttpConnection'은 여전히 ​​3.1에서'setProtocol' 메소드를 가지고 있습니다 : http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

팩토리는 '프로토콜 소켓 팩토리 (ProtocolSocketFactory)'로 캐스트 될 수 있습니다. 이는 업 캐스트 (upcast) 일 뿐이 므로 사용되지 않는 생성자를 제거하면 필요하지 않습니다 , 그것은 비 - 비난받는 생성자를 이미 사용하고 있으며, 나는 내 게시물을 업데이트 할 것이다. – Gandalf