2013-01-01 6 views
14

का उपयोग कर एक HTTPS कनेक्शन बनाना मैं server पर एक HTTPS कनेक्शन बनाने की कोशिश कर रहा हूं जिसमें एक प्रमाणपत्र सेट अप्रैल 2013 में समाप्त हो गया है और रूट प्रमाणपत्र के रूप में ग्लोबलसाइन का उपयोग करता है।URL.openConnection()

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
// urlConnection.setSSLSocketFactory(sslSocketFactory); 
urlConnection.setDoOutput(true); 
urlConnection.setChunkedStreamingMode(0); 

// Send the POST data 
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); 
out.write(postParamString.toString().getBytes("UTF8")); 

// Read the reply 
InputStream in = urlConnection.getInputStream(); 

यह खड़ा के रूप में, इस फेंकता javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature. जब getOutputStream() कहा जाता है।

यह एक ही साइट और प्रमाण पत्र शेयर एचटीसी वेब ब्राउज़र और डेस्कटॉप ब्राउज़र में मान्य हैं। जब मैं Google तक पहुंचने के लिए एक ही कोड का उपयोग करता हूं तो यह काम करता है (लेकिन फिर 404 त्रुटि के बारे में शिकायत करता है)। StackOverflow पर विभिन्न पोस्टों का अर्थ है कि इसे "बस काम करना चाहिए" और अन्य लोग अपना स्वयं का मुख्य स्टोर सेट अप करना चाहते हैं (या सभी HTTPS सत्यापन अक्षम करें!) मुझे लगता है कि व्यवहार में अंतर विभिन्न रूट कुंजी स्टोरों के उपयोग में है (क्या कोई इसे स्पष्ट कर सकता है ?)।

अब मैं एक कुंजी संग्रह उछाल वाले महल का उपयोग कर बनाने की कोशिश की है, लेकिन मैं यह अपने डिवाइस पर लोड करने के लिए नहीं मिल सकता है।

keytool.exe -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -keystore res\raw\keystore 

यह तो भरी हुई है और आवेदन में प्रयोग किया जाता है का उपयोग कर:

InputStream stream = context.getResources().openRawResource(R.raw.keystore); 
// BKS seems to be the default but we want to be explicit 
KeyStore ks = KeyStore.getInstance("BKS"); 
ks.load(stream, "www.onlinescoutmanager.co.uk".toCharArray()); 
stream.close(); 

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(ks); 
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0]; 
SSLContext context2 = SSLContext.getInstance("TLS"); 
context2.init(null, new TrustManager[] { defaultTrustManager }, null); 
sslSocketFactory = context2.getSocketFactory(); 

यह java.io.IOException: Wrong version of key store. जब keystore.Load() साथ विफल हो रहा है

फ़ायरफ़ॉक्स से प्रमाण पत्र के निर्यात के बाद, मैं एक कुंजी संग्रह का उपयोग कर बनाने के कहा जाता है।

मैं ensured I'm passing -storetype BKS, used a <=7 character keystore password कुंजीसंग्रह को CA प्रमाणपत्रों को जोड़ लिया है, और दोनों Bouncy कैसल संस्करण 1.45 और 1.47 का उपयोग कर सूचना दी त्रुटि संदेश में कोई परिवर्तन नहीं होता कुंजी संग्रह बनाने के लिए।

मेरे पर्यावरण JRE 1.7u9b5 Windows 8 पर चलने वाले डिवाइस मैं पर परीक्षण कर रहा हूँ एक एचटीसी शेयर Android 2.3 चल रहा अनुभूति होती है साथ ग्रहण जूनो 4.2.1 है। एप्लिकेशन का न्यूनतम एसडीके संस्करण 7 है और 15 का लक्ष्य है।

अगर कोई विंडोज 8 पर वैध बीकेएस कुंजी स्टोर कैसे बना सकता है या ब्राउज़र के समान कुंजी स्टोर का उपयोग करने के लिए जावा कैसे प्राप्त कर सकता हूं, या सिस्टम?) की सराहना की जाएगी।

आप लिखने के समय entire project डाउनलोड कर सकते हैं, और generated keystore आवश्यक होने पर।

+2

यह निश्चित रूप से सबसे अच्छा तैयार प्रश्न है जिसे मैंने कभी देखा है, किसी भी साइट पर –

+0

@AndreaLigios मुझे बहुत कुछ जवाब देना पड़ा है, मुझे नियमों और "सभ्य प्रश्न पूछने" के बारे में पता होना चाहिए: p – Deanna

+0

@ जब आप कीस्टोर बनाते हैं तो दीना, क्या आपके पास विकल्पों में ट्रस्टेड कैसर्ट होना चाहिए ताकि वह भरोसेमंद कॉर्ट का उपयोग कर प्रमाण को मान्य कर सके? (नेवी जावा समानता के आधार पर बीकेएस अनुमान लगाने के साथ काम किया) –

उत्तर

2

Bouncy कैसल 1.47 अलग संस्करण हैडर का उपयोग कर रहा है। क्या आप 1.46 version आज़मा सकते हैं, इसे काम करना चाहिए।

keytool -import -alias onlinescoutmanager -file www.onlinescoutmanager.co.uk.crt -storetype BKS -storepass osmosm -keystore C:/keystore -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-1.46.jar 
+0

मैं पहले से ही 1.45 का उपयोग कर रहा हूं (मैंने शुरुआत में 1.47 का उपयोग किया था, सवाल देखें) 1.46 एक अंतर करेगा? ध्यान रखें कि मैं वर्तमान में एंड्रॉइड 2.3 को लक्षित कर रहा हूं जो कि 1.45 का उपयोग करता है। – Deanna

+0

हम्म, मैंने 1.45 संस्करण के साथ प्रयास नहीं किया लेकिन मैं कह सकता हूं कि आपकी परियोजना 1.46 संस्करण द्वारा बनाई गई कीस्टोर को सफलतापूर्वक लोड करती है। – Akdeniz

+0

यहां यह है: http://dl.dropbox.com/u/26734922/keystore – Akdeniz

3

इस पर उनके संकेतों के लिए विभिन्न लोगों के लिए धन्यवाद, कई चीजें हैं जिनके लिए काम करने के लिए सभी को सही होना आवश्यक है। HTTPS साइट का प्रमाणपत्र किसी विश्वसनीय रूट प्रमाणपत्र द्वारा हस्ताक्षरित

  1. तो यह एक कस्टम SSLSocketFactory बिना बॉक्स से बाहर काम करेंगे। विश्वसनीय रूट प्रमाणपत्र ब्राउज़र द्वारा उपयोग किए जाने वाले भिन्न हो सकते हैं, इसलिए यह न मानें कि यदि यह एंड्रॉइड वेब ब्राउज़र में काम करता है तो यह आपके ऐप में काम करेगा।
    यदि यह एक विश्वसनीय रूट प्रमाणपत्र नहीं है और आप javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature. तरह अपवाद मिलता है, तो आप नीचे के रूप में बना सकते हैं और एक कुंजी संग्रह लोड करने के लिए की जरूरत है।

  2. keytool कमांड लाइन पर -storetype bks निर्दिष्ट करके बाउंसी कैसल प्रदाता (1) का उपयोग करके मुख्य स्टोर को उत्पन्न करने की आवश्यकता है।
    यदि बाउंसी कैसल सही ढंग से स्थापित नहीं है तो यह java.security.KeyStoreException: BKS not found सहित विभिन्न अपवादों के साथ विफल हो जाएगा। यदि कुंजी स्टोर बाउंसी कैसल प्रदाता के साथ नहीं बनाया गया है तो आपको java.io.IOException: Wrong version of key store. अपवाद मिल सकता है, जिससे अगले मामले में भ्रम पैदा हो सकता है।

  3. आपको बाउंसी कैसल प्रदाता के उपयुक्त संस्करण (1, 2, 3) का उपयोग करने की आवश्यकता है। ज्यादातर मामलों में, यह version 1.46 लगता है।
    इसे आपके जेआरई lib/ext/ फ़ोल्डर में रखा जा सकता है और कक्षा का नाम lib/security/java.security पर जोड़ा गया है, या सीधे keytool पर कमांड लाइन पर निर्दिष्ट किया गया है। यदि यह एक असंगत संस्करण (या स्टोर प्रकार) है तो आपको java.io.IOException: Wrong version of key store. की लाइनों के साथ अपवाद प्राप्त होंगे।

  4. आपको सभी मध्यस्थ और रूट प्रमाणपत्र शामिल करना होगा। यदि कोई गुम है, तो आपको javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. अपवाद मिलेगा।

  5. प्रमाण पत्र श्रृंखला को सही तरीके से सत्यापित करने के लिए होना चाहिए। यदि वे नहीं हैं तो आपको या तो javax.net.ssl.SSLHandshakeException: org.bouncycastle.jce.exception.ExtCertPathValidatorException: IssuerName(CN=XYZ) does not match SubjectName(CN=ABC) of signing certificate. या फिर, एक सामान्य javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. मुझे मुख्य स्टोर में ऑर्डर करने का कोई तरीका नहीं मिला है, इसलिए doing it in code at runtime का उपयोग किया गया।

कुछ लोगों को सुझाव दिया है कि using a keystore password longer than 7 characters भी यह विफल हो जाएगा, लेकिन यह है कि मैं क्या पाया है नहीं है।

मुझे लगता है कि इसमें पाया गया हर गड़बड़ शामिल है, लेकिन विस्तार से मुक्त होने और संबंधित प्रश्नों के लिए लिंक्स जोड़ने के लिए स्वतंत्र महसूस करें।

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