2016-07-15 4 views
0

Tomcat이 SNI와 상호 인증을 모두 제공하지만 선택한 응용 프로그램/경로에 대해서만 MA를 사용 가능하게 할 수 있습니까? 나는. 의 내가 내 서버에 다음과 같은 응용 프로그램/엔드 포인트를 가정 해 봅시다 : /APP2/인간는 인간에 의해 사용 /APP2/로봇 로봇, 컴퓨터 및 기타 장치에 의해 사용되는 (그래서됩니다Tomcat + SNI + 상호 인증

/app1 
/app2/human 
/app2/robot 

예를 들어/app2/human은 HTML을,/app2/robot은 JSON을 제공함). 자, /app1/app2/human에 대한 연결을 수락하도록 Tomcat을 구성하고 클라이언트가 유효한 인증서를 제시 한 경우에만 /app2/robot으로 연결할 수 있습니까?

물론 각 응용 프로그램마다 별도의 포트/커넥터를 구성하지 않고이 작업을 수행하고 싶습니다.

미리 감사드립니다.

답변

1

Tomcat은 경로마다 선택적 상호 인증을 제공하지 않지만 웹 응용 프로그램 수준이 아닌 특정 웹 응용 프로그램에만 이러한 선택 상호 인증을 적용하면됩니다. 특별한 웹 애플리케이션을 위해 별도의 <Connector>을 가지고 도망 가야합니다. 별도의 <Service> 및 따라서 <Host>이 필요하며 물론 포트 번호를 유지하는 데 사용할 수있는 별도의 네트워크 인터페이스가없는 한 다른 포트 번호가 필요합니다.

나는 이론적으로 SNI + client-auth가 특정 호스트 이름이 다른 클라이언트 인증 요구 사항을 갖도록 구성 될 수 있지만 이론적으로는 Tomcat에 그러한 코드가 없다고 생각합니다. 현재 그것을 지원하십시오.

Tomcat이 다른 신뢰 저장소 및 호스트 이름에 따라 다른 certificateVerification 설정을 사용하도록 구성 할 수 있습니다,하지만 당신이 경로 당이 을 변경할 수 없습니다.

또 다른 옵션은 Tomcat이 클라이언트 인증서를 "필요"(또는 요구할 수도 있음)하도록 구성한 다음 Filter을 사용하여 직접 확인을 수행하는 것입니다. Filter을 경로별로 적용 할 수 있으며 응용 프로그램이 더 이동성이 높아지는 이유는 Tomcat과 관련된 일부 기능에 의존하지 않기 때문입니다.

이 스레드를 몇 년 전에 내가 어떻게했는지보십시오. (결국) 샘플 코드와 함께 모든 정보를 어떻게 조합했는지에 대한 많은 참고 자료가 있습니다. http://markmail.org/thread/vxwwli5nzt4itfr2

+0

두 번째 커넥터는 아주 간단한 일로 인해 끔찍한 오버 헤드라고 생각합니다. 마크 토마스가 Tomcat 9에서 TLS 가상 호스팅으로 추가 한 멋진 모든 것들이 필요로하는 사람들에게는 정말 실종 된 기능입니다. –

+1

커밋을하는 사람 만이 어떤 사랑을 얻는다고 생각합니다. ( –

1

this에 따르면 문서를 보면 경로별로 선택적 상호 인증을 사용할 수 없습니다. 클라이언트 인증이 커넥터 수준에서 구성되었으므로이 항목은 모두 또는 아무 것도 아닙니다. 아마도 SSL renegotation with client auth을 찾고있을 것입니다. 이는 아마도 Apache HTTPd에서 익숙해 진 것처럼 구현되지 않았을 것입니다.

+0

@MarkThomas 여기에 있습니다. –

+0

고마워, 그게 내가 SSLSocket, SSLSocketFactory 등과 같은 클래스를 생각해 보았다. 그것은 당신이 연결된 게시물에 쓰여졌 기 때문에 "needClientAuth"대신 "wantClientAuth (true)"를 설정하고 "수동"확인을 수행하는 것처럼 수동으로 수행 할 수있는 것 같습니다. 실제로 "((SSLSocket) 소켓) .getSession(). getPeerCertificates() "- 클라이언트가 인증되지 않은 경우 연결을 삭제하거나 의미있는 것을 반환하기에 충분한 예외 인 javax.net.ssl.SSLPeerUnverifiedException을 throw합니다. –