2012-04-21 3 views
6

У меня установлен сервер приложений Tomcat 7.0 с взаимной аутентификацией (клиент/сервер) через SSL. Чтобы настроить эту конфигурацию, мне нужно было создать файл .jks для сертификата сервера и .pks в моем веб-браузере. После настройки файла server.xml в Tomcat у меня есть взаимная аутентификация и работа 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 - Это бросает RuntimeException, потому что сертификат не найден при ударе 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 - возвращает «cert found» при попадании 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); 
} 

Мой фильтр 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

Нам также необходимо увидеть ограничения безопасности из web.xml. Кроме того, настройки SSLVerify * на соединителе ничего не сделают - это имена параметров конфигурации httpd. –

+0

@Mark Thomas У меня нет доступа к моему файлу web.xml, но я знаю, что у меня нет никаких параметров безопасности, установленных в этом файле. Нужно ли мне? –

+0

Если нет ограничений безопасности, и соединитель не настроен на требование SSL-сертификата клиента, Tomcat не будет запрашивать его, и клиент не собирается его предоставлять. –

ответ

6

Он работает. Тем не менее, сервлет кодируется, чтобы всегда вызывать исключение RuntimeException, поэтому похоже, что он не работает.

+2

спасибо, что поймали это, мальчик - мое лицо красное. –

+0

Легко сделано - я сделал намного хуже в свое время. И рассказ о том, что происходит в tomcat, есть для всех, чтобы увидеть :) –

Смежные вопросы