2012-04-21 10 views
6

Ich habe einen Tomcat 7.0-Anwendungsserver mit gemeinsamer (Client/Server-) Authentifizierung über SSL eingerichtet. Um diese Konfiguration einzurichten, musste ich eine .jks-Datei für das Server- und .pks-Zertifikat für meinen Webbrowser erstellen. Nach der Konfiguration der Datei server.xml in Tomcat habe ich gegenseitige Authentifizierung und SSL funktioniert. Jetzt versuche ich, das Zertifikat in einem Servlet zu bekommen, aber ich kann nicht scheinen, das Zertifikat von der Anfrage im Servlet zu ergreifen. Ich kann einen Filter einrichten, der das Zertifikat erfolgreich aus der Anfrage zieht. Kann mir jemand eine Konfiguration/einen Code zur Verfügung stellen, mit dem ich das Zertifikat vom Servlet abholen kann? Ich würde auch einen Grund dafür akzeptieren, warum ich das Zertifikat im Servlet nicht bekommen kann. Gegenseitige Client-Authentifizierung Zertifikat in Servlet erhalten

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 https://localhost:8443/Sample_Application/MyServlet

: -

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 Dies wirft eine Runtime weil Zertifikat nicht gefunden wird, wenn url schlagen. Java - Gibt "cert found" zurück, wenn Sie die URL eingeben: 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); 
} 

My Filter Mapping

<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

Wir müssen die Sicherheitseinschränkungen auch von der web.xml bitte sehen. Auch die SSLVerify * -Einstellungen auf dem Connector machen nichts - das sind die Namen der httpd-Konfigurationseinstellungen. –

+0

@Mark Thomas Ich habe derzeit keinen Zugriff auf meine web.xml-Datei, aber ich weiß, dass in dieser Datei keine Sicherheitsparameter festgelegt sind. Muss ich? –

+0

Wenn keine Sicherheitsbeschränkungen definiert sind und der Connector nicht für die Verwendung eines Client-SSL-Zertifikats konfiguriert ist, wird Tomcat nicht nach einem anfordern und der Client wird es nicht bereitstellen. –

Antwort

6

Es funktioniert. Das Servlet ist jedoch so codiert, dass die RuntimeException immer so ausgegeben wird, dass es so aussieht, als würde es nicht funktionieren.

+2

danke für den Fang, Junge ist mein Gesicht rot. –

+0

Leicht gemacht - ich habe viel schlimmer in meiner Zeit gemacht. Und die Tomcat Commit Geschichte ist für alle da :) –

Verwandte Themen