2011-03-05 10 views
10

क्या जावा का ट्रस्टमैनेजर कार्यान्वयन किसी प्रमाणपत्र की समयसीमा समाप्त होने पर अनदेखा करता है?
मैंने निम्नलिखित कोशिश की:
- keytool और पैरामीटर -startdate "1970/01/01 00:00:00" का उपयोग करके मैंने एक समाप्त प्रमाणपत्र के साथ एक पी 12 कीस्टोर बनाया।समाप्त हो चुके प्रमाणपत्रों पर जावा ट्रस्टमैनगर व्यवहार

Keystore type: PKCS12 
Keystore provider: SunJSSE 

Your keystore contains 1 entry 

Alias name: fake 
Creation date: 5 ╠ά± 2011 
Entry type: PrivateKeyEntry 
Certificate chain length: 1 
Certificate[1]: 
Owner: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
Serial number: -1c20 
Valid from: Thu Jan 01 00:00:00 EET 1970 until: Fri Jan 02 00:00:00 EET 1970 
Certificate fingerprints: 
     MD5: A9:BE:3A:3D:45:24:1B:4F:3C:9B:2E:02:E3:57:86:11 
     SHA1: 21:9D:E1:04:09:CF:10:58:73:C4:62:3C:46:4C:76:A3:81:56:88:4D 
     Signature algorithm name: SHA1withRSA 
     Version: 3 


******************************************* 

मैं बिलाव के लिए सर्वर प्रमाणपत्र के रूप में इस प्रमाण पत्र का इस्तेमाल किया: -
मैं प्रमाण पत्र का निर्यात किया।
फिर एक Apache httpclient मैं बिल्ला से जुड़ा का उपयोग कर, लेकिन पहले मैं ग्राहक के विश्वास-स्टोर करने के लिए समाप्ति प्रमाणपत्र जोड़ा (एक TrustManager

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

का उपयोग करने और समाप्ति प्रमाणपत्र लोड हो रहा है)।
मैं कनेक्शन विफल होने की उम्मीद कर रहा था।
इसके बजाय कनेक्शन सफल होता है।
System.setProperty("javax.net.debug", "ssl");
का उपयोग करना मैं देख रहा हूँ:

*** 
Found trusted certificate: 
[ 
[ 
    Version: V3 
    Subject: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
    Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5 

    Key: Sun RSA public key, 1024 bits 
    modulus: 10350555024148635338735220482157687267055139906998169922552357357346372886164908067983097037540922519808845662295379579697361784480052371935565129553860304254832565723373586277732296157572040989796830623403187557540749531267846797324326299709274902019299 
    public exponent: 65537 
    Validity: [From: Thu Jan 01 00:00:00 EET 1970, 
       To: Fri Jan 02 00:00:00 EET 1970] 
    Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR 
    SerialNumber: [ -1c20] 

] 

मैं देख रहा हूँ टीएलएस में हाथ मिलाना कि समाप्ति प्रमाणपत्र बिलाव कनेक्टर द्वारा भेज रहा है।
लेकिन ग्राहक (यानी ट्रस्टमैनेजर) कनेक्शन को अस्वीकार नहीं करता है।
क्या यह डिफ़ॉल्ट व्यवहार है?
क्या मुझे लगता है कि किसी भी तरह से ट्रस्टमैनर को समाप्ति की जांच करने के लिए कॉन्फ़िगर करना है?

अद्यतन:
मैंने पाया कि वास्तविक इस्तेमाल किया TrustManager X509TrustManagerImpl है। यहां X509TrustManagerImpl कहता है कि इस वर्ग में कम से कम तर्क है। क्या मैं गलत ट्रस्टमैनेजर का उपयोग कर रहा हूं?

UPDATE2: जावाडोक X509TrustManager से यह स्पष्ट नहीं है कि यह प्रमाण पत्र समाप्ति

void checkServerTrusted(X509Certificate[] chain,String authType) 
           throws CertificateException 

आंशिक या पूर्ण प्रमाण पत्र सहकर्मी द्वारा प्रदान की श्रृंखला को देखते हुए की जांच करता है, एक प्रमाण पत्र पथ का निर्माण पर विश्वसनीय रूट और वापसी करें यदि यह मान्य हो सकता है और के लिए विश्वसनीय है प्रामाणिक पर आधारित SSL प्रमाणीकरण एटियन प्रकार। प्रमाणीकरण प्रकार कुंजी एक्सचेंज एल्गोरिदम सिफर सूट का हिस्सा स्ट्रिंग के रूप में प्रतिनिधित्व किया गया है, जैसे "आरएसए", "DHE_DSS"। नोट: कुछ निर्यात करने योग्य सिफर सूट के लिए, कुंजी एक्सचेंज एल्गोरिदम हैंडशेक के दौरान रन टाइम पर निर्धारित किया जाता है। उदाहरण के लिए, TLS_RSA_EXPORT_WITH_RC4_40_MD5 के लिए, AuthType होना चाहिए RSA_EXPORT जब एक अल्पकालिक RSA कुंजी कुंजी आदान प्रदान के लिए प्रयोग किया जाता है, और आरएसए जब से कुंजी सर्वर प्रमाणपत्र प्रयोग किया जाता है। जांच केस-संवेदी है।

धन्यवाद

+0

क्या आपको कोई समाधान मिला है, टॉमैक्ट चेक सर्टिफिकेट की समाप्ति को कैसे बल दिया जाए? कोई मौजूदा अन्य 'X509TrstManager' कार्यान्वयन जो यह करता है? – Andremoniy

+1

@Andremoniy: आपको अपना खुद का कस्टम ट्रस्ट मैनेजर – Cratylus

उत्तर

1

मैं अपने उदाहरण की कोशिश नहीं की है, लेकिन मैं अब मैं नियमित रूप से (हमारे विकास सर्वर के लिए) अपने सर्वर प्रमाण पत्र को पुनर्जीवित करने के बाद से अपने प्रमाण पत्र काफी कम वैधता बार की है।

हमारे मामले में ग्राहक के पास ट्रस्टस्टोर में सर्वर प्रमाण पत्र नहीं हैं, लेकिन केवल हमारे सीए (लंबी वैधता के साथ) का प्रमाण पत्र, और जब ग्राहक सर्वर से कनेक्ट करने का प्रयास करता है, तो दोनों पक्षों को एक एसएसएलईक्सप्शन मिलता है (जो आपके मामले में एक और अपवाद में लपेटा जा सकता है)।

मुझे लगता है कि ट्रस्ट मैनेजर कुछ ऐसा मानता है जैसे "यदि आप मुझे विश्वास करने के लिए समय समाप्त होने वाले प्रमाण पत्र देते हैं, तो मैं करूँगा"। इसके बजाय हमारे दृष्टिकोण का प्रयास करें (यह सर्वर प्रमाण पत्र की समयसीमा समाप्त होने पर भी ग्राहक को अपडेट करने के लिए आपको बचाता है)।

+1

@Paulo लिखना है: 1) आप केवल सीए का प्रमाणपत्र जमा करते हैं। इसलिए यदि ग्राहक को एक समाप्त प्रमाणपत्र (आपके सीए द्वारा हस्ताक्षरित) प्राप्त होता है तो ट्रस्टमैनर इसे अस्वीकार कर देता है? 2) आप जो सुझाव देते हैं वह उचित है, लेकिन मेरे दृष्टिकोण से, यदि यह ट्रस्ट-मैनेजर का डिफ़ॉल्ट व्यवहार है तो यह कम से कम अजीब है। अगर 10 घंटे पहले सर्टिफिकेट समाप्त हो गया तो क्या होगा? ट्रस्टमैनगर इसे विश्वसनीय मानेंगे, क्योंकि यह पहले से ही ट्रस्टस्टोर में है? मुझे लगता है कि यह सही व्यवहार नहीं है – Cratylus

+0

1) हाँ, यह मेरा अवलोकन है। 2 के लिए), मुझे यकीन नहीं है कि यह एक इच्छित व्यवहार या बग है, यह सिर्फ अनुमान है कि आपके और मेरे अवलोकन दोनों को कैसे समझाया जाए। –

+0

@ पाउलो: मैंने पाया कि वास्तविक ट्रस्टमैनेजर का इस्तेमाल 'X509TrustManagerImpl' है। यहां http://www.java2s.com/Open-Source/Java-Document/6.0-JDK- मॉड्यूल-sun/security/sun/security/ssl/X509TrustManagerImpl.java.java-doc.htm कहता है कि इस वर्ग में एक है न्यूनतम तर्क। क्या मैं गलत ट्रस्टमैनेजर का उपयोग कर रहा हूं? – Cratylus

2

मेरा मानना ​​है कि आईबीएम की जेएसएसई समाप्ति के लिए जांच करती है जबकि सूर्य नहीं करता है।

+0

क्या आपको लगता है कि यह एक बग है, या उन्होंने इसे सूर्य में इस तरह डिज़ाइन किया है? मेरे दृष्टिकोण से, व्यवहार कम से कम काउंटर-अंतर्ज्ञानी है। – Cratylus

+0

यह जानबूझकर प्रतीत होता है। मुझे लगता है कि इरादा यह था कि यदि आप सोचते हैं कि यह महत्वपूर्ण है तो आप एक हैंडशेक श्रोता में खुद को समाप्त करने की जांच करें। – EJP

5

checkServerTrusted ओवरराइड करते समय मुझे अभी भी एक ही समस्या आई है।

बाहर निकलता है कि अगर आपको समाप्ति की जांच करने की आवश्यकता है तो आप X509Certificate.checkValidity() पर कॉल कर सकते हैं और यह या तो प्रमाणपत्र एक्स्पेरएक्स एक्सेप्शन या सर्टिफिकेट नॉटवाईट वैलिडएक्सप्शन फेंक देगा। इनमें से दोनों प्रमाणपत्र एक्सेप्शन का विस्तार करते हैं ताकि उन्हें checkServerTrusted द्वारा खुशी से फेंक दिया जा सके।

अपनी समस्या को हल करने के लिए आप एक नया X509TrustManager जो अपने निर्माता में अपने मूल उदाहरण बनाता लागू कर सकता है, मूल उदाहरण के लिए कॉल के रूप में सभी तरीकों को लागू करता है, और checkServerTrusted अंदर certs[] में प्रत्येक प्रमाण पत्र के लिए checkValidity के लिए एक कॉल कहते हैं।

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