2012-04-21 4 views
6

Ho installato un server applicazioni Tomcat 7.0 con autenticazione reciproca (client/server) su SSL. Per configurare questa configurazione avevo bisogno di creare un file .jks per il server e il certificato .pks nel mio browser web. Dopo aver configurato il file server.xml in Tomcat, utilizzo l'autenticazione reciproca e SSL. Ora sto cercando di prendere il certificato in un servlet, tuttavia non riesco a prendere il certificato dalla richiesta nel servlet. Posso installare un filtro che estrae il certificato dalla richiesta. Qualcuno può fornirmi una configurazione/codice che mi permetta di prendere il certificato dal servlet? Accetterei anche un motivo per cui non riesco a ottenere il certificato nel servlet.Autenticazione reciproca client Ottieni certificato in 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 - Questo getta una RuntimeException perché certificato non viene trovato nel colpire 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"); 
    } 

MyServlet Mapping

<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 - Restituisce "cert found" quando si preme 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); 
} 

mio filtro Mappatura

<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

Abbiamo anche bisogno di vedere i vincoli di sicurezza dal web.xml per favore. Anche le impostazioni SSLVerify * sul connettore non faranno nulla: questi sono i nomi delle impostazioni di configurazione di httpd. –

+0

@ Mark Thomas Non ho attualmente accesso al mio file web.xml, ma so che non ho alcun parametro di sicurezza impostato in quel file. Ho bisogno di? –

+0

Se non sono definiti vincoli di sicurezza e il connettore non è configurato per richiedere un certificato SSL client, Tomcat non ne richiederà uno e il client non lo fornirà. –

risposta

6

Si sta lavorando. Tuttavia, il servlet è codificato per generare sempre il RuntimeException in modo che non funzioni.

+2

grazie per la cattura di questo, ragazzo è la mia faccia rossa. –

+0

Facilmente fatto - ho fatto molto peggio nel mio tempo. E la storia del commit di tomcat è lì per tutti da vedere :) –