2012-04-21 12 views
6

He configurado un servidor de aplicaciones Tomcat 7.0 con autenticación mutua (cliente/servidor) a través de SSL. Para configurar esta configuración, necesitaba crear un archivo .jks para el servidor y un certificado .pks en mi navegador web. Después de configurar el archivo server.xml en Tomcat, tengo la autenticación mutua y el funcionamiento de SSL. Ahora estoy tratando de tomar el certificado en un servlet, sin embargo, parece que no puedo obtener el certificado de la solicitud en el servlet. Puedo configurar un filtro que extraiga con éxito el certificado de la solicitud. ¿Alguien puede proporcionarme una configuración/código que me permita obtener el certificado del servlet? También aceptaría una razón por la cual no puedo obtener el certificado en el servlet.Mutual Client Authentication Obtenga el certificado en el servlet

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 - Esto arroja una RuntimeException porque el certificado no se encuentra al golpear url: 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"); 
    } 

Mapeo 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 - Devuelve "cert found" cuando tocas la url: https://localhost:8443/Sample_Application/test.jsp

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); 
} 

Mi asignación del filtro

<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

Necesitamos ver las restricciones de seguridad del web.xml también, por favor. Además, la configuración de SSLVerify * en el conector no hará nada; esos son los nombres de las configuraciones de httpd. –

+0

@ Mark Thomas Actualmente no tengo acceso a mi archivo web.xml, pero sé que no tengo ningún parámetro de seguridad establecido en ese archivo. ¿Realmente necesito? –

+0

Si no hay restricciones de seguridad definidas y el conector no está configurado para requerir un certificado SSL del cliente, Tomcat no lo solicitará y el cliente no lo proporcionará. –

Respuesta

6

Se está trabajando. Sin embargo, el Servlet está codificado para siempre arroja la RuntimeException para que parezca que no está funcionando.

+2

gracias por atrapar esto, chico es mi cara roja. –

+0

Fácil de hacer: lo he hecho mucho peor en mi tiempo. Y el historial de commit de tomcat está ahí para que todos lo vean :) –