2012-08-14 15 views
9

में आने वाले प्रमाणपत्र को पढ़ें, मैं क्लाइंट-प्रमाणीकरण के साथ एक टोमकैट http कनेक्टर का उपयोग करता हूं। यदि कोई ग्राहक मेरे सर्वर से नया कनेक्शन शुरू करता है और अपना प्रमाणपत्र भेजता है, तो क्या मैं प्रमाणपत्र प्राप्त कर सकता हूं और आने वाले प्रमाणपत्र से सामान्य नाम को अपने जावा कोड में पढ़ सकता हूं। यदि हां, तो कैसे?टॉमकैट

धन्यवाद आदि mazaneicha को

+0

http://www.coderanch.com/t/438788/Security/Read-client-certificate-Servlet पोस्ट के अंत की ओर देखो। सौभाग्य! – mazaneicha

उत्तर

16

आप अपने HttpServletRequest पर javax.servlet.request.X509Certificate विशेषता हो रही द्वारा ग्राहक प्रमाणपत्र श्रृंखला मिल सकती है। यह X509Certificates की एक सरणी है जहां पहला (स्थिति 0) वास्तविक क्लाइंट प्रमाणपत्र है (शेष श्रृंखला मौजूद हो सकती है यदि इंटरमीडिएट सीए प्रमाणपत्र आवश्यक हैं)।

X509Certificate certs[] = 
    (X509Certificate[])req.getAttribute("javax.servlet.request.X509Certificate"); 
// ... Test if non-null, non-empty. 

X509Certificate clientCert = certs[0]; 

// Get the Subject DN's X500Principal 
X500Principal subjectDN = clientCert.getSubjectX500Principal(); 

फिर आप इस प्रिंसिपल (सीएन जैसे) this answer में वर्णित के रूप में विभिन्न RDNs (सापेक्ष विशिष्ट नाम) प्राप्त कर सकते हैं:

import javax.naming.ldap.LdapName; 
import javax.naming.ldap.Rdn; 

String dn = subjectDN.getName(); 
LdapName ldapDN = new LdapName(dn); 
for(Rdn rdn: ldapDN.getRdns()) { 
    System.out.println(rdn.getType() + " -> " + rdn.getValue()); 
} 

(तुम भी BouncyCastle के X509Name प्रत्येक RDN प्राप्त करने के लिए इस्तेमाल कर सकते हैं।)

एक्स.50 9 प्रमाण पत्र में, विषय डीएन आरडीएन का क्रमबद्ध अनुक्रम है, जिनमें से प्रत्येक एवीए (विशेषता मूल्य अनुमान) का एक सेट है, उदाहरण के लिए CN=... या O=...। सिद्धांत रूप में, आरडीएन प्रति कई एवीए हो सकते हैं, जो यहां समस्याएं पैदा करेंगे, लेकिन यह बहुत दुर्लभ है। आप लगभग अनुमान लगा सकते हैं कि आरडीएन प्रति केवल एक एवीए है। (शायद this answer ब्याज की हो सकती है।)

+0

धन्यवाद, सब कुछ पहले से बहुत अच्छी तरह से काम किया है की कोशिश :-) हर कोई Axis2 उपयोग करता है और HttpServletRequest पर प्राप्त करने के लिए कैसे पता नहीं है कि के लिए: \t MessageContext संदर्भ = MessageContext.getCurrentMessageContext(); \t HttpServletRequest अनुरोधप्रॉपर्टी = (HttpServletRequest) context.getProperty (HTTPConstants.MC_HTTP_SERVLETREQUEST); – adihubba

+0

मुझे req.getAttribute ("javax.servlet.request.X509 प्रमाण पत्र") के लिए शून्य मिल रहा है। क्या इसे एक ही मिलान डोमेन से अनुरोध भेजने की आवश्यकता है? मैंने स्थानीय (स्थानीयहोस्ट का उपयोग करके) मशीन और विकास सर्वर दोनों से भी कोशिश की। – TechnoCrat

+0

@TechnoCrat शायद इसका अर्थ है (ए) कि आपका सर्वर किसी क्लाइंट प्रमाणपत्र के अनुरोध/आवश्यकता के लिए कॉन्फ़िगर नहीं किया गया है या (बी) क्लाइंट प्रमाण पत्र का अनुरोध करते समय प्रमाणीकरण प्राधिकरण सूची भेजता है जो आपके पास किसी भी क्लाइंट प्रमाणपत्र से मेल नहीं खाता है आपकी मशीन पर यह वास्तव में "डोमेन" मिलान के बारे में नहीं है लेकिन सीए मिलान के बारे में है। – Bruno

0

क्रेडिट:

 String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite"); 

     if (cipherSuite != null) { 
      X509Certificate certChain[] = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate"); 
      if (certChain != null) { 
       for (int i = 0; i < certChaNin.length; i++) { 
        System.out.println ("Client Certificate [" + i + "] = " 
          + certChain[i].toString()); 
       } 
      } 
     } 
+0

आपको पहले सिफर सुइट प्राप्त करने और परीक्षण करने की आवश्यकता नहीं है। – Bruno