2012-04-21 29 views
6

Tôi đã thiết lập máy chủ ứng dụng Tomcat 7.0 với xác thực lẫn nhau (máy khách/máy chủ) qua SSL. Để thiết lập cấu hình này, tôi cần tạo tệp .jks cho máy chủ và chứng chỉ .pks trong trình duyệt web của tôi. Sau khi cấu hình tệp server.xml trong Tomcat, tôi đã xác thực lẫn nhau và làm việc SSL. Bây giờ tôi đang cố gắng lấy chứng chỉ trong một servlet, tuy nhiên tôi dường như không thể lấy chứng chỉ từ yêu cầu trong servlet. Tôi có thể thiết lập bộ lọc để kéo chứng chỉ thành công từ yêu cầu. Bất cứ ai có thể cung cấp cho tôi một cấu hình/mã mà sẽ cho phép tôi lấy giấy chứng nhận từ servlet? Tôi cũng sẽ chấp nhận một lý do tại sao tôi không thể nhận được chứng chỉ trong servlet.Xác thực khách hàng lẫn nhau Nhận chứng chỉ trong 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 - Đây ném một RuntimeException vì chứng chỉ không được tìm thấy khi đánh 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 - Trả về "cert found" khi nhấn 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); 
} 

My Lọc 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

Chúng tôi cũng cần xem các ràng buộc bảo mật từ web.xml. Ngoài ra, cài đặt SSLVerify * trên trình kết nối sẽ không làm gì cả - đó là tên của các cài đặt cấu hình httpd. –

+0

@Mark Thomas Tôi hiện không có quyền truy cập vào tệp web.xml của mình, nhưng tôi biết rằng tôi không có bất kỳ thông số bảo mật nào được đặt trong tệp đó. Tôi có cần phải? –

+0

Nếu không có ràng buộc bảo mật được xác định và kết nối không được cấu hình để yêu cầu chứng chỉ SSL của khách hàng, Tomcat sẽ không yêu cầu một và khách hàng sẽ không cung cấp nó. –

Trả lời

6

Nó đang làm việc. Tuy nhiên, Servlet được mã hóa để luôn ném RuntimeException để có vẻ như nó không hoạt động.

+2

cảm ơn vì đã bắt được nó, cậu bé đỏ mặt. –

+0

Dễ dàng thực hiện - Tôi đã làm tồi tệ hơn nhiều trong thời gian của tôi. Và lịch sử cam kết tomcat là có cho tất cả để xem :) –

Các vấn đề liên quan