2012-04-21 30 views
6

में सर्टिफिकेट प्राप्त करें मैंने एसएसएल पर पारस्परिक (क्लाइंट/सर्वर) प्रमाणीकरण के साथ एक टोमकैट 7.0 एप्लिकेशन सर्वर स्थापित किया है। इस कॉन्फ़िगरेशन को सेट करने के लिए मुझे अपने वेब ब्राउज़र में सर्वर और .pks प्रमाणपत्र के लिए .jks फ़ाइल बनाने की आवश्यकता है। Tomcat में server.xml फ़ाइल को कॉन्फ़िगर करने के बाद मेरे पास पारस्परिक प्रमाणीकरण और 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 फेंकता है क्योंकि प्रमाण पत्र जब यूआरएल मार नहीं पाया जाता है: 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 मानचित्रण

<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/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); 
} 

मेरे फ़िल्टर मानचित्रण

<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

हमें वेब.एक्सएमएल से सुरक्षा बाधाओं को भी देखना होगा। कनेक्टर पर SSLVerify * सेटिंग्स कुछ भी नहीं करेंगे - वे httpd कॉन्फ़िगरेशन सेटिंग्स के नाम हैं। –

+0

@ मार्क थॉमस मुझे वर्तमान में मेरी web.xml फ़ाइल तक पहुंच नहीं है, लेकिन मुझे पता है कि मेरे पास उस फ़ाइल में कोई सुरक्षा पैरामीटर सेट नहीं है। क्या मुझे यह करना ज़रूरी है? –

+0

यदि कोई सुरक्षा बाधा परिभाषित नहीं है और कनेक्टर को क्लाइंट SSL प्रमाणपत्र की आवश्यकता के लिए कॉन्फ़िगर नहीं किया गया है, तो टोमकैट एक के लिए नहीं पूछने वाला है और क्लाइंट इसे प्रदान नहीं करेगा। –

उत्तर

6

यह काम कर रहा है। हालांकि, सर्वलेट को हमेशा रनटाइम अपवाद को फेंकने के लिए कोड किया जाता है, ऐसा लगता है कि यह काम नहीं कर रहा है।

+2

इसे पकड़ने के लिए धन्यवाद, लड़का मेरा चेहरा लाल है। –

+0

आसानी से किया - मैंने अपने समय में बहुत बुरा किया है। और टॉमकैट प्रतिबद्धता इतिहास सभी को देखने के लिए है :) –

संबंधित मुद्दे