2016-07-03 12 views
1

HttpsURLConnection에 대해 HostnameVerifier 및 SSLSocketFactory를 재정의하지 않는 코드를 이해하려고합니다. 현재 코드는 SSL 요청을 잘 만들 수 있습니다. 다소 혼란 스럽습니다. HostnameVerifier 및 SSLSocketFactory 클래스의 기본 구현은 어떻게 작동합니까? 인증서 CA와 호스트 이름을 확인합니까 아니면이 모든 검사를 모두 무시합니까?HostnameVerifier 및 SSLSocketFactory의 기본 구현을 사용하는 HttpsURLConnectioin의 동작

또한 요청에 로컬 호스트가있는 경우 특별한 동작이 있습니까? URL은 다음과 같습니다.
https://localhost :/

감사합니다.

답변

2

JDK jre/lib/security/cacerts의 신뢰할 수있는 저장소 또는 구성한 CA의 신뢰할 수있는 CA 인증서와 비교하여 CA 인증서를 검사합니다.

체인의 모든 인증서가 즉각적인 서명자뿐만 아니라 신뢰할 수 있는지 확인합니다. 기본적으로 해지 된 인증서를 온라인으로 확인하지는 않지만 java.security 정책 파일에서 해당 인증서를 사용하도록 설정할 수 있습니다.

인증서에 대한 호스트 이름도 확인합니다. 추가 CN 및 와일드 카드 CN을 지원합니다. 로컬 호스트에 대한

확장 질문 :

localhost는 다른 같은 단지 호스트 이름입니다. 인증서에 나열되어야합니다. 하지만 공식 인증서를 제공하는 CA를 찾을 수는 없을 것입니다. :-)

실제 인증서를 로컬 호스트에서 사용하려면 다른 호스트 이름으로 지정해야합니다. 라인 :

127.0.0.1 foo.bar.com 

지금 브라우저를 해고하고 https://foo.bar.com에 연결 : 당신은 foo.bar.com에 대한 인증서를 통해 실행하려는 경우, hosts 파일 (%WINDOWS%\system32\drivers\etc\hosts, 유닉스 /etc/hosts 승)에 추가 할 수 있습니다. 로컬 서버에 연결하여 SSL 암호화 HTTP 요청을 게시합니다. 이 요청에는 실제 호스트 이름이 아닌 URL의 호스트 이름이 포함됩니다.

브라우저가 서버에서 SSL 인증서를 받고 방금 호출 한 호스트 이름과 CN을 비교합니다. 일치하면 인증서를 신뢰할 수 있는지 확인합니다 (주문에 대한 답을 얻지 못함, 그렇지 않으면 trustlevel을 먼저 확인합니다).

여기서 실패합니다. 서버에서 제공 한 인증서에 CN 로컬 호스트가 없으므로 클라이언트가 연결을 중단합니다. 귀하의 경우 클라이언트는 HttpSSL 요청입니다.

클라이언트가 모두 정상이라고 믿게하려면 다음 두 가지 작업을 수행 할 수 있습니다. - 호스트 이름을 가짜로 만들고 cacerts 트러스트 스토어에 서명 CA를 추가합니다. - 호스트 이름과 인증서 유효성 검사기를 구현하면 문제를 해결할 수 있습니다.

자습서와 관련하여 자체 서명 된 인증서가 사용되면 먼저 액세스 할 때 경고를 무시하여 브라우저에서이를 수락해야합니다.

+0

내가 찾고 있어야하는 구성은 무엇입니까? JDK에 대한 기본 트러스트 스토어가 설정되어 있는지 확실하지 않습니다. – user1549994

+0

"추가 CN 및 와일드 카드 CN을 지원합니다.".와일드 카드 CN이 의미하는 바는 무엇입니까? localhost는 와일드 카드 CN으로 간주됩니까? 보내지는 요청은 localhost를 사용하지만 서버가 다시 보내는 인증서에는 "localhost"가 없습니다. – user1549994

+0

와일드 카드 인증서에 별표가 포함되어 있으며이 도메인의 모든 하위 도메인에서 작동합니다.'* .foo.com'은'bar.foo.com','baz.foo.com' 등에서 작동합니다. localhost로 게임을하고 싶다면, 인증서에 추가하십시오. 내 대답을 보라. – thst