दिलचस्प पोस्ट
स्थिर वर्ग के सदस्य के लिए अनिर्धारित संदर्भ गतिशील रूप से मॉटप्ललिब में भूखंड को अद्यतन करना कैसे लाइनों की UILabel की संख्या को खोजने के लिए एक नया इरादा बनाने के बजाय अधिसूचना जारी करने के लिए कैसे करें? MSSQL त्रुटि 'अंतर्निहित प्रदाता ओपन पर असफल' जब एक HTML5 वीडियो समाप्त हो जाए, तब पता लगाएं ListView में फोकसबल संपादन टेक्स्ट सीतनिद्रा में होना, iBatis, जावा ईई या अन्य जावा ओआरएम उपकरण कैसे सी # में बहुआयामी (2 डी) सरणी का आकार बदलना है? विजुअल स्टूडियो 2015 अतिरिक्त डीबग विकल्प को अक्षम करें PHP में बहु-आयामी सरणी से डुप्लिकेट मान कैसे निकालें जावास्क्रिप्ट से .exe चल रहा है क्या यह कभी एक भाषा में 'गोटो' का उपयोग करने के लिए लाभप्रद है जो छोरों और कार्यों का समर्थन करता है? यदि हां, तो क्यों? क्यों कंपाइलरों स्ट्रिंग literals const करने के लिए अनुमति नहीं है const? Laravel के ब्लेड: मैं एक टेम्पलेट में कैसे चर सेट कर सकते हैं?

एक BKS (BouncyCastle) प्रारूप जावा कुंजीस्टोर बनाने के लिए जिसमें क्लाइंट प्रमाणपत्र श्रृंखला शामिल है

मैं एक एंड्रॉइड ऐप लिख रहा हूं जिसके लिए SSL क्लाइंट प्रमाणीकरण की आवश्यकता है मुझे पता है कि डेस्कटॉप जावा अनुप्रयोग के लिए एक जेकेएस कीस्टोर बनाने के लिए, लेकिन एंड्रॉइड केवल बीकेएस प्रारूप का समर्थन करता है हर तरह से मैं निम्नलिखित त्रुटि में कीस्टोर परिणाम बनाने की कोशिश की है:
handling exception: javax.net.ssl.SSLHandshakeException: null cert chain

इसलिए ऐसा लगता है कि ग्राहक कभी भी एक उचित प्रमाण पत्र श्रृंखला नहीं भेज रहा है, शायद इसलिए कि मैं मुख्य रूप से सही ढंग से नहीं बना रहा हूं मैं SSL डिबगिंग को सक्षम करने में असमर्थ हूं जैसे कि मैं डेकस्टॉप पर कर सकता हूं, जिससे कि इससे अधिक कठिन होना चाहिए।

संदर्भ के लिए निम्नलिखित आदेश है कि एक बीकेएस ट्रस्टस्टोर बनाने के लिए काम कर रहा है:
keytool -importcert -v -trustcacerts -file "cacert.pem" -alias ca -keystore "mySrvTruststore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest


यहाँ एक कमांड मैंने कोशिश की है जो कि एक बीकेएस क्लाइंट कीस्टस्टोर बनाने के लिए काम नहीं कर रहा है:

 cat clientkey.pem clientcert.pem cacert.pem > client.pem keytool -import -v -file <(openssl x509 -in client.pem) -alias client -keystore "clientkeystore" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-145.jar" -storetype BKS -storepass testtest 

वेब के समाधान से एकत्रित समाधान "एक BKS (BouncyCastle) प्रारूप जावा कुंजीस्टोर बनाने के लिए जिसमें क्लाइंट प्रमाणपत्र श्रृंखला शामिल है"

इस लक्ष्य को हासिल करने के लिए मैंने कदम निर्देशों के अनुसार विस्तृत कदम उठाया है I

  • http://repo2.maven.org/maven2/org/bouncycastle/bcprov-ext-jdk15on/1.46/bcprov-ext-jdk15on-1.46.jar से bouncycastle jar डाउनलोड करें या इसे "डॉक्टर" फ़ोल्डर से लें।
  • निम्न विधियों में से एक का उपयोग करके पीसी के लिए बाउन्सी कैस्टल कॉन्फ़िगर करें
    • बीसी प्रदाता को जोड़ना Statically (अनुशंसित)
      • प्रत्येक को bcprov-ext-jdk15on-1.46.jar कॉपी करें
        • D: \ tools \ jdk1.5.0_09 \ jre \ lib \ ext (जेडीके (बंडल जेआरई)
        • डी: \ औज़ार \ जेआर 1 1.5.0_09 \ बीबीएपी (जेआरई)
        • सी: \ (स्थान env चर में इस्तेमाल किया जा सकता है)
      • नीचे java.security फ़ाइल को संशोधित करें
        • डी: \ उपकरण \ jdk1.5.0_09 \ JRE \ lib \ सुरक्षा
        • डी: \ उपकरण \ jre1.5.0_09 \ lib \ सुरक्षा
        • और निम्नलिखित प्रविष्टि जोड़ें
          • security.provider.7 = org.bouncycastle.jce.provider.BouncyCastleProvider
      • "उपयोगकर्ता चर" अनुभाग में निम्न वातावरण चर जोड़ें
        • CLASSPATH =% CLASSPATH%; c: \ bcprov-ext-jdk15on-1.46.jar
    • Bcprov-ext-jdk15on-1.46.jar को अपने प्रोजेक्ट के CLASSPATH में जोड़ें और अपने कोड में निम्न पंक्ति जोड़ें
      • Security.addProvider (नया BouncyCastleProvider ());
  • उछालभरी कैसल का उपयोग करके कीस्टोर उत्पन्न करें
    • निम्न आदेश चलाएं
      • keytool -genkey -alias myproject -keystore C: /myproject.keystore -storepass myproject -storetype बीकेएस -प्रोवीर org.bouncycastle.jce.provider.BouncyCastleProvider
    • यह फ़ाइल C: \ myproject.keystore बनाता है
    • यह ठीक से जनरेट किया गया है या नहीं, यह देखने के लिए निम्न आदेश चलाएं
      • keytool -list -keystore सी: \ myproject.keystore -storetype BKS
  • TOMCAT के लिए BouncyCastle कॉन्फ़िगर करें

    • ओपन डी: \ टूल्स \ अपाचे-टॉमकैट-6.0.35 \ कॉन्फ \ सर्वर.एक्सएमएल और निम्न एंट्री जोड़ें

      • <Connector port = "8443" keystorePass = "myproject" उपनाम = "myproject" keystore = "c: /myproject.keystore" keystoreType = "BKS" SSLEnabled = "true" clientAuth = "false" प्रोटोकॉल = "HTTP / 1.1" स्कीम = "https" सुरक्षित = "सच" sslProtocol = "TLS" sslImplementationName = "org.bouncycastle.jce.provider.BouncyCastleProvider" />
    • इन परिवर्तनों के बाद सर्वर को पुनरारंभ करें

  • एंड्रॉइड क्लाइंट के लिए बाउंसी कैस्टल कॉन्फ़िगर करें
    • एंड्रॉइड। एंड्रॉइड में "एंड्रॉइड। जेनर" में आंतरिक रूप से एंड्रॉइड उछाल वाले कैसल संस्करण 1.46 का समर्थन करने के बाद कोई भी कॉन्फ़िगर करने की आवश्यकता नहीं है।
    • बस HTTP क्लाइंट के अपने संस्करण को लागू करें (MyHttpClient.java नीचे पाया जा सकता है) और कोड में निम्नलिखित सेट करें
      • SSLSocketFactory.setHostnameVerifier (SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    • यदि आप ऐसा नहीं करते हैं, तो यह नीचे एक अपवाद देता है
      • javax.net.ssl.SSLException: प्रमाणपत्र में होस्टनाम से मिलान नहीं हुआ: <192.168.104.66>! =
    • उत्पादन मोड में, उपरोक्त कोड को परिवर्तित करें
      • SSLSocketFactory.setHostnameVerifier (SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

MyHttpClient.java

 package com.arisglobal.aglite.network; import java.io.InputStream; import java.security.KeyStore; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.SingleClientConnManager; import com.arisglobal.aglite.activity.R; import android.content.Context; public class MyHttpClient extends DefaultHttpClient { final Context context; public MyHttpClient(Context context) { this.context = context; } @Override protected ClientConnectionManager createClientConnectionManager() { SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); // Register for port 443 our SSLSocketFactory with our keystore to the ConnectionManager registry.register(new Scheme("https", newSslSocketFactory(), 443)); return new SingleClientConnManager(getParams(), registry); } private SSLSocketFactory newSslSocketFactory() { try { // Get an instance of the Bouncy Castle KeyStore format KeyStore trusted = KeyStore.getInstance("BKS"); // Get the raw resource, which contains the keystore with your trusted certificates (root and any intermediate certs) InputStream in = context.getResources().openRawResource(R.raw.aglite); try { // Initialize the keystore with the provided trusted certificates. // Also provide the password of the keystore trusted.load(in, "aglite".toCharArray()); } finally { in.close(); } // Pass the keystore to the SSLSocketFactory. The factory is responsible for the verification of the server certificate. SSLSocketFactory sf = new SSLSocketFactory(trusted); // Hostname verification from certificate // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); return sf; } catch (Exception e) { throw new AssertionError(e); } } } 

अपनी गतिविधि कक्षा में उपरोक्त कोड को कैसे खोलें:

 DefaultHttpClient client = new MyHttpClient(getApplicationContext()); HttpResponse response = client.execute(...); 

मैं पोर्टीकल का उपयोग करता हूं , और यह एक जादू की तरह काम करता है

मुझे नहीं लगता कि आपकी समस्या BouncyCastle keystore के साथ है; मुझे लगता है कि समस्या Android के एक टूटी हुई javax.net.ssl ​​पैकेज के साथ है BouncyCastle keystore एक सर्वोच्च झुंझलाहट है क्योंकि एंड्रॉइड ने इसे कहीं भी दस्तावेज किए बिना एक डिफ़ॉल्ट जावा व्यवहार बदल दिया – और डिफ़ॉल्ट प्रदाता को हटा दिया – लेकिन यह काम करता है

ध्यान दें कि SSL प्रमाणीकरण के लिए आपको 2 मुख्य स्टोर्स की आवश्यकता हो सकती है। "ट्रस्टमैनेजर" कीस्टोर, जिसमें सीए कैटरस और "की-मैनेजर" कीस्टस्टोर शामिल है, जिसमें आपकी क्लाइंट-साइट सार्वजनिक / निजी कुंजी शामिल है (दस्तावेज़ीकरण कुंजी प्रबंधक कुंजीस्टोर में क्या होना चाहिए पर कुछ अस्पष्ट है।) सिद्धांत रूप में, यदि आपके सभी प्रमाण पत्र "प्रसिद्ध" प्रमाण पत्र प्राधिकारी द्वारा हस्ताक्षर किए गए हैं, तो आपको ट्रस्टमैनेजर कीस्टस्टोर की आवश्यकता नहीं होनी चाहिए, उदाहरण के लिए, वेरिसिन, थॉवे, और इसी तरह। मुझे बताएं कि यह आपके लिए कैसे काम करता है आपके क्लाइंट पर हस्ताक्षर करने के लिए उपयोग किए जाने वाले सभी के लिए आपके सर्वर को भी CA की आवश्यकता होगी।

मैं javax.net.ssl ​​का उपयोग करके एक SSL कनेक्शन नहीं बना सका। मैंने सर्वर साइड पर ग्राहक SSL प्रमाणीकरण अक्षम कर दिया है, और मैं अभी भी कनेक्शन नहीं बना सका। चूंकि मेरा अंत लक्ष्य एक HTTPS GET था, मैंने punted और एंड्रॉइड के साथ बंडल अपाचे HTTP क्लाइंट का उपयोग करने की कोशिश की। उस प्रकार का काम किया मैं HTTPS कनेक्शन बना सकता था, लेकिन मैं अभी भी एसएसएल auth का उपयोग नहीं कर सका अगर मैं अपने सर्वर पर क्लाइंट SSL प्रमाणीकरण सक्षम करता हूं, तो कनेक्शन विफल हो जाएगा। मैंने अपाचे एचटीटीपी क्लाइंट कोड की जाँच नहीं की है, लेकिन मुझे संदेह है कि वे अपने एसएसएल क्रियान्वयन का उपयोग कर रहे हैं, और javax.net.ssl ​​का उपयोग न करें।

सुनिश्चित नहीं हैं कि आपने इस समस्या का समाधान किया है या नहीं, लेकिन यह है कि मैं इसे कैसे करता हूं और यह एंड्रॉइड पर काम करता है:

  1. क्लाइंट के प्रमाणपत्र को मर्ज करने के लिए openssl का उपयोग करें (प्रमाणपत्र सर्वर द्वारा स्वीकृत एक सीए द्वारा हस्ताक्षरित होना चाहिए) और निजी कुंजी को एक PCKS12 प्रारूप कुंजी जोड़ी में खोलता है : openssl pkcs12 -export -in clientcert.pem -inkey clientkey.pem -out client.p12
  2. आपको अपने जेआर को umlimited ताकत एन्क्रिप्शन के पैच की आवश्यकता हो सकती है, आपकी कुंजी ताकत पर निर्भर करता है: JCE 5.0 असीमित ताकत अधिकार क्षेत्र की नीति से जार फाइलों की प्रतिलिपि बनाएँ और अपने जेआरई में (जैसे। सी: \ प्रोग्राम फ़ाइलें \ जावा \ जेआर 6 \ बीबी \ सुरक्षा )
  3. उपर्युक्त पोर्टीकल उपकरण का उपयोग करें और बीकेएस प्रारूप के साथ एक नई मुख्य स्टार्स बनाएं
  4. चरण 1 में उत्पन्न पीसीके 12 की जोड़ी आयात करें और इसे बीकेएस कीस्टोर के रूप में सहेजें। यह कुंजीस्टोर Android क्लाइंट प्रमाणीकरण के साथ काम करता है
  5. यदि आपको प्रमाणपत्र श्रृंखला करने की आवश्यकता है, तो आप इस आईबीएम उपकरण का उपयोग कर सकते हैं: CA cert के साथ क्लाइंट के पीसीके 12 कुंजी जोड़ी को मर्ज करने के लिए कीमेन। लेकिन यह केवल जेकेएस कीस्टस्टोर उत्पन्न करता है, इसलिए आपको फिर से प्रोसेक्लिक की जरूरत है ताकि इसे बीकेएस प्रारूप में बदल दिया जाए।

कमांड लाइन:

 keytool -genseckey -alias aliasName -keystore truststore.bks -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath /path/to/jar/bcprov-jdk16-1.46.jar -storetype BKS 

बीकेएस केस्टोर बनाने के लिए आपका आदेश सही दिखता है

आप कीस्टस्टोर को कैसे शुरु करते हैं

आपको अपने स्वयं के SSLSocketFactory पागल करना और पास करना होगा। यहां एक उदाहरण है जो अपाचे के org.apache.http.conn.ssl.SSLSocketFactory का उपयोग करता है

लेकिन मुझे लगता है कि आप javax.net.ssl.SSLSocketFactory पर एक ही कर सकते हैं

  private SSLSocketFactory newSslSocketFactory() { try { // Get an instance of the Bouncy Castle KeyStore format KeyStore trusted = KeyStore.getInstance("BKS"); // Get the raw resource, which contains the keystore with // your trusted certificates (root and any intermediate certs) InputStream in = context.getResources().openRawResource(R.raw.mykeystore); try { // Initialize the keystore with the provided trusted certificates // Also provide the password of the keystore trusted.load(in, "testtest".toCharArray()); } finally { in.close(); } // Pass the keystore to the SSLSocketFactory. The factory is responsible // for the verification of the server certificate. SSLSocketFactory sf = new SSLSocketFactory(trusted); // Hostname verification from certificate // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); return sf; } catch (Exception e) { throw new AssertionError(e); } } 

कृपया मुझे बताएं कि क्या यह काम किया है।

इस मैनुअल http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/ का प्रयोग करें इस मार्गदर्शिका ने मुझे मदद की है स्टोर में प्रमाण पत्रों के अनुक्रम का पालन करना महत्वपूर्ण है। उदाहरण के लिए: निम्न सबसे कम इंटरमीडिएट सीए प्रमाणपत्र पहले और फिर रूट सीए प्रमाण पत्र के लिए सभी तरह से आयात करें