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>
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. –
@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? –
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. –