2012-04-21 4 views
6

SSL을 통해 상호 (클라이언트/서버) 인증을 사용하는 Tomcat 7.0 애플리케이션 서버를 설치했습니다. 이 구성을 설정하려면 서버용 .jks 파일과 웹 브라우저 용 .pks 인증서를 만들어야했습니다. Tomcat에서 server.xml 파일을 구성한 후에 상호 인증 및 SSL이 작동합니다. 이제 서블릿에서 인증서를 가져 오려고하지만 서블릿의 요청에서 인증서를 가져올 수 없습니다. 요청에서 인증서를 성공적으로 가져 오는 필터를 설정할 수 있습니다. 누구든지 나에게 서블릿에서 인증서를 가져올 수있는 구성/코드를 제공 할 수 있습니까? 또한 왜 서블릿에서 인증서를 가져올 수 없는지에 대한 이유를 받아 들일 것입니다.상호 클라이언트 인증 서블릿에서 인증서 받기

server.xml에

<Connector 
clientAuth="true" port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
scheme="https" secure="true" 
keystoreFile="C:/Users/Kevin Bowersox/Desktop/Development/My Certs/server.jks" 
keystoreType="JKS" keystorePass="notmypassword" 
truststoreFile="C:/Users/Kevin Bowersox/Desktop/Development/My Certs/server.jks" 
truststoreType="JKS" truststorePass="notmypassword" 
SSLVerifyClient="require" SSLVerifyDepth="2" sslProtocol="TLS" 
/> 

MyServlet.java은 - URL을 타격 할 때 인증서가 발견되지 않기 때문에 이것은 RuntimeException을 던졌습니다 : https://localhost:8443/Sample_Application/MyServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
      X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); 
      if (null != certs && certs.length > 0) { 
       System.out.println("cert found"); 
      } 
      throw new RuntimeException("No X.509 client certificate found in request"); 
    } 

에게 MyServlet 매핑

<servlet> 
    <description> 
    </description> 
    <display-name>MyServlet</display-name> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>MyServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/MyServlet</url-pattern> 
</servlet-mapping> 

MyFilter. java - url을 치면 "cert found"를 반환합니다.,210

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); 
     if (null != certs && certs.length > 0) { 
      System.out.println("cert found"); 
     } 
     //throw new RuntimeException("No X.509 client certificate found in request"); 
    chain.doFilter(request, response); 
} 

그것은이 작동

<filter> 
    <description> 
    </description> 
    <display-name>MyFilter</display-name> 
    <filter-name>MyFilter</filter-name> 
    <filter-class>MyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>MyFilter</filter-name> 
    <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 
+0

web.xml에서 보안 제한 사항을 확인해야합니다. 또한 커넥터의 SSLVerify * 설정은 아무 것도하지 않습니다. 이는 httpd 구성 설정의 이름입니다. –

+0

@ Mark Thomas 현재 web.xml 파일에 액세스 할 수 없지만 해당 파일에 보안 매개 변수가 설정되어 있지 않습니다. 해야합니까? –

+0

보안 제한 조건이 정의되지 않았고 커넥터가 클라이언트 SSL 인증서를 요구하도록 구성되지 않은 경우 Tomcat은 인증서를 요구하지 않고 클라이언트가 인증서를 제공하지 않습니다. –

답변

6

내 필터 매핑. 그러나 서블릿은 작동하지 않는 것처럼 보이도록 항상 RuntimeException을 throw하도록 코딩됩니다.

+2

이것을 잡아 주셔서 고마워요, 소년은 내 얼굴이 붉습니다. –

+0

쉽게 완료 - 내 시간이 훨씬 더 악화되었습니다. 그리고 바람둥이 커밋 역사가 모두 볼 수 있습니다 :) –

관련 문제