दिलचस्प पोस्ट
शून्य लंबाई का सरणी सीएसएस में वेरिएबल के रूप में मैं रंग कैसे परिभाषित करूं? किसी कोण-क्ली परियोजना में बूटस्ट्रैप को कैसे जोड़ें कैसे mod_rewrite और अपाचे का उपयोग कर विशेष अक्षर सांकेतिक शब्दों में बदलना है? घोषणाओं के बारे में सर्पिल नियम – यह त्रुटि में कब है? मैं पायथन लॉगिंग आउटपुट कैसे रंगू सकता हूं? क्या एक ^ ए या ए अपरिभाषित व्यवहार होता है यदि कोई प्रारंभ नहीं होता है? एकल या दोहरे उद्धरण से घिरा नहीं हुआ स्थान का उपयोग कर स्ट्रिंग को विभाजित करने के लिए रेगेक्स आप एक शर्त में एक असाइनमेंट का उपयोग क्यों करेंगे? डेटटाइम ऑब्जेक्ट को देखते हुए, मैं स्ट्रिंग फ़ॉर्मेट में आईएसओ 8601 डेट कैसे प्राप्त करूं? तालिका सेल में लिंक बनाओ पूरी पंक्ति ऊंचाई भरें Django Rest Framework serializer में कस्टम त्रुटि संदेश वेबसाइस के लिए jQuery कॉल रिटर्न "कोई ट्रांसपोर्ट" त्रुटि नहीं है पैटर्न के साथ एचटीएमएल 5 फोन नंबर मान्यता बूलियन, सशर्त ऑपरेटर्स और ऑटोबॉक्सिंग

एंड्रॉइड पर दो तरह प्रमाणन SSL सॉकेट के लिए क्लाइंट / सर्वर प्रमाणपत्र का उपयोग करना

मैं एक एंड्रॉइड ऐप पर काम कर रहा हूं जिसके लिए क्लाइंट और सर्वर प्रमाणपत्र प्रमाणीकरण दोनों की आवश्यकता होती है। मेरे पास एक SSL क्लाइंट क्लास है जो मैंने बनाया है जो कि नियमित डेस्कटॉप जावा एसई 6 पर खूबसूरती से काम करता है। मैंने इसे अपने एंड्रॉइड प्रोजेक्ट में स्थानांतरित कर दिया है और मुझे निम्न त्रुटि मिल रही है: "मुख्यस्टार जेकेएस कार्यान्वयन नहीं मिला"

मैंने थोड़ा सा ऑनलाइन देखा है और ऐसा लगता है कि जावा केस्टोर्स एंड्रॉइड (भयानक!) पर समर्थित नहीं हैं, लेकिन मुझे लगता है कि इसके लिए इसके बारे में अधिक जानकारी है क्योंकि मेरे पास नमूना कोड में से कोई भी जैसा दिखता नहीं है I सब पर करने की कोशिश कर रहा हूँ सब कुछ मैंने कच्चे एसएसएल सॉकेट्स के बजाय एक एचटीटीपी क्लाइंट के इस्तेमाल के बारे में बातचीत की। इस एप्लिकेशन के लिए मुझे SSL सॉकेट्स की आवश्यकता है I

नीचे मेरे SSLClient.java फ़ाइल में कोड है। यह कुंजीस्टोर और ट्रस्टस्टोर को पढ़ता है, सर्वर से SSL सॉकेट कनेक्शन बनाता है, फिर सर्वर से इनपुट लाइनों का इंतजार करते समय एक पाश चलाता है, तो उन्हें एक अलग कक्षा में विधि बुलाकर आने पर उन्हें संभालती है। एंड्रॉइड प्लेटफॉर्म पर एसएसएल सॉकेट करने वाले किसी भी अनुभव के साथ मुझे किसी से सुनना बहुत दिलचस्पी है।

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.security.AccessControlException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory; import otherpackege.OtherClass; import android.content.Context; import android.util.Log; public class SSLClient { static SSLContext ssl_ctx; public SSLClient(Context context) { try { // Setup truststore KeyStore trustStore = KeyStore.getInstance("BKS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); InputStream trustStoreStream = context.getResources().openRawResource(R.raw.mysrvtruststore); trustStore.load(trustStoreStream, "testtest".toCharArray()); trustManagerFactory.init(trustStore); // Setup keystore KeyStore keyStore = KeyStore.getInstance("BKS"); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); InputStream keyStoreStream = context.getResources().openRawResource(R.raw.clientkeystore); keyStore.load(keyStoreStream, "testtest".toCharArray()); keyManagerFactory.init(keyStore, "testtest".toCharArray()); Log.d("SSL", "Key " + keyStore.size()); Log.d("SSL", "Trust " + trustStore.size()); // Setup the SSL context to use the truststore and keystore ssl_ctx = SSLContext.getInstance("TLS"); ssl_ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); Log.d("SSL", "keyManagerFactory " + keyManagerFactory.getKeyManagers().length); Log.d("SSL", "trustManagerFactory " + trustManagerFactory.getTrustManagers().length); } catch (NoSuchAlgorithmException nsae) { Log.d("SSL", nsae.getMessage()); } catch (KeyStoreException kse) { Log.d("SSL", kse.getMessage()); } catch (IOException ioe) { Log.d("SSL", ioe.getMessage()); } catch (CertificateException ce) { Log.d("SSL", ce.getMessage()); } catch (KeyManagementException kme) { Log.d("SSL", kme.getMessage()); } catch(AccessControlException ace) { Log.d("SSL", ace.getMessage()); } catch(UnrecoverableKeyException uke) { Log.d("SSL", uke.getMessage()); } try { Handler handler = new Handler(); handler.start(); } catch (IOException ioException) { ioException.printStackTrace(); } } } //class Handler implements Runnable class Handler extends Thread { private SSLSocket socket; private BufferedReader input; static public PrintWriter output; private String serverUrl = "174.61.103.206"; private String serverPort = "6000"; Handler(SSLSocket socket) throws IOException { } Handler() throws IOException { } public void sendMessagameInfoge(String message) { Handler.output.println(message); } @Override public void run() { String line; try { SSLSocketFactory socketFactory = (SSLSocketFactory) SSLClient.ssl_ctx.getSocketFactory(); socket = (SSLSocket) socketFactory.createSocket(serverUrl, Integer.parseInt(serverPort)); this.input = new BufferedReader(new InputStreamReader(socket.getInputStream())); Handler.output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); Log.d("SSL", "Created the socket, input, and output!!"); do { line = input.readLine(); while (line == null) { line = input.readLine(); } // Parse the message and do something with it // Done in a different class OtherClass.parseMessageString(line); } while ( !line.equals("exit|") ); } catch (IOException ioe) { System.out.println(ioe); } finally { try { input.close(); output.close(); socket.close(); } catch(IOException ioe) { } finally { } } } } 

अद्यतन करें:
इस समस्या पर कुछ अच्छी प्रगति कर रहे हैं पता चला कि जेकेएस वास्तव में समर्थित नहीं है, न ही सीधे SunX509 प्रकार का चयन कर रहा है मैंने इन परिवर्तनों को प्रदर्शित करने के लिए ऊपर अपना कोड अपडेट किया है मैं अभी भी इसके साथ एक मुद्दा रहा हूं, जाहिरा तौर पर कीस्टोर और ट्रस्टस्टोर को लोड नहीं किया जा रहा है मैं अपडेट करूँगा जैसा मैं और अधिक समझता हूं।


Update2:
मैं सही एंड्रॉइड के बजाए एक डेस्कटॉप जावा में मेरा मुख्य स्टोर और ट्रस्टस्टोर फ़ाइल लोडिंग कर रहा था। फ़ाइलों को रास / कच्चे फ़ोल्डर में रखा जाना चाहिए और getResources () का उपयोग कर लोड किया जाना चाहिए। अब मुझे कुंजीस्टोर और ट्रस्टस्टोर आकार के लिए 1 और 1 की गिनती मिल रही है जिसका मतलब है कि वे लोड हो रहे हैं। मैं अभी भी एक अपवाद पर दुर्घटनाग्रस्त रहा हूँ, लेकिन करीब हो रहा है! जब मुझे यह काम मिल जाएंगे तो मैं अपडेट करूँगा


Update3:
ऐसा लगता है कि अब सब कुछ मेरे मुख्य स्टोर के अपवाद के साथ गलत तरीके से सेट अप किए जा रहा है। अगर मैं सर्वर पर क्लाइंट साइड प्रमाणन को अक्षम करता हूं, तो बिना किसी समस्या के जोड़ता है जब मैं इसे सक्षम करता हूं, मुझे एक handling exception: javax.net.ssl.SSLHandshakeException: null cert chain मिलता handling exception: javax.net.ssl.SSLHandshakeException: null cert chain त्रुटि इसलिए ऐसा लगता है कि मैं प्रमाण पत्र श्रृंखला को ठीक से सेट नहीं कर रहा हूं। मैंने एक और सवाल पूछा है कि कैसे उचित प्रमाण पत्र श्रृंखला के साथ BKS प्रारूप में एक क्लाइंट कीस्टोरोर बनाने के लिए : एक BKS (BouncyCastle) प्रारूप जावा कुंजीस्टोर बनाने के लिए जो एक क्लाइंट प्रमाणपत्र श्रृंखला

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड पर दो तरह प्रमाणन SSL सॉकेट के लिए क्लाइंट / सर्वर प्रमाणपत्र का उपयोग करना"

एंड्रॉइड बीकेएस, पी 12 और अन्य प्रारूपों में प्रमाण पत्र का समर्थन करता है।

बीकेएस प्रारूप के लिए: अपने प्रमाणपत्रों (। P12 और .crt) को .bks में कनवर्ट करने के लिए पोर्टिले का उपयोग करें

आपको अपने /res/raw फ़ोल्डर में 2 फाइलों की आवश्यकता है: सर्वर के लिए truststore.bks ट्रस्ट प्रमाणपत्र (.cer फ़ाइल से परिवर्तित)

client.bks/client.p12 – क्लाइंट प्रमाण पत्र (क्लाइंट प्रमाणपत्र और क्लाइंट कुंजी जिसमें एक .p12 फ़ाइल से परिवर्तित)

 import java.io.*; import java.security.KeyStore; import javax.net.ssl.*; import org.apache.http.*; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.params.HttpClientParams; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.*; import org.apache.http.conn.scheme.*; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.*; import android.app.Activity; import android.os.Bundle; public class SslTestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { // setup truststore to provide trust for the server certificate // load truststore certificate InputStream clientTruststoreIs = getResources().openRawResource(R.raw.truststore); KeyStore trustStore = null; trustStore = KeyStore.getInstance("BKS"); trustStore.load(clientTruststoreIs, "MyPassword".toCharArray()); System.out.println("Loaded server certificates: " + trustStore.size()); // initialize trust manager factory with the read truststore TrustManagerFactory trustManagerFactory = null; trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); // setup client certificate // load client certificate InputStream keyStoreStream = getResources().openRawResource(R.raw.client); KeyStore keyStore = null; keyStore = KeyStore.getInstance("BKS"); keyStore.load(keyStoreStream, "MyPassword".toCharArray()); System.out.println("Loaded client certificates: " + keyStore.size()); // initialize key manager factory with the read client certificate KeyManagerFactory keyManagerFactory = null; keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(keyStore, "MyPassword".toCharArray()); // initialize SSLSocketFactory to use the certificates SSLSocketFactory socketFactory = null; socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS, keyStore, "MyTestPassword2010", trustStore, null, null); // Set basic data HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); HttpProtocolParams.setUseExpectContinue(params, true); HttpProtocolParams.setUserAgent(params, "Android app/1.0.0"); // Make pool ConnPerRoute connPerRoute = new ConnPerRouteBean(12); ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute); ConnManagerParams.setMaxTotalConnections(params, 20); // Set timeout HttpConnectionParams.setStaleCheckingEnabled(params, false); HttpConnectionParams.setConnectionTimeout(params, 20 * 1000); HttpConnectionParams.setSoTimeout(params, 20 * 1000); HttpConnectionParams.setSocketBufferSize(params, 8192); // Some client params HttpClientParams.setRedirecting(params, false); // Register http/s shemas! SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schReg.register(new Scheme("https", socketFactory, 443)); ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); DefaultHttpClient sClient = new DefaultHttpClient(conMgr, params); HttpGet httpGet = new HttpGet("https://server/path/service.wsdl"); HttpResponse response = sClient.execute(httpGet); HttpEntity httpEntity = response.getEntity(); InputStream is = httpEntity.getContent(); BufferedReader read = new BufferedReader(new InputStreamReader(is)); String query = null; while ((query = read.readLine()) != null) System.out.println(query); } catch (Exception e) { e.printStackTrace(); } } } 

अद्यतन करें:

आप ट्रस्ट की दुकान के लिए सीसीआरटी फ़ाइलों को सीधे बीकेएस में परिवर्तित किए बिना भी लोड कर सकते हैं:

  private static KeyStore loadTrustStore(String[] certificateFilenames) { AssetManager assetsManager = GirdersApp.getInstance().getAssets(); int length = certificateFilenames.length; List<Certificate> certificates = new ArrayList<Certificate>(length); for (String certificateFilename : certificateFilenames) { InputStream is; try { is = assetsManager.open(certificateFilename, AssetManager.ACCESS_BUFFER); Certificate certificate = KeyStoreManager.loadX509Certificate(is); certificates.add(certificate); } catch (Exception e) { throw new RuntimeException(e); } } Certificate[] certificatesArray = certificates.toArray(new Certificate[certificates.size()]); return new generateKeystore(certificatesArray); } /** * Generates keystore congaing the specified certificates. * * @param certificates certificates to add in keystore * @return keystore with the specified certificates * @throws KeyStoreException if keystore can not be generated. */ public KeyStore generateKeystore(Certificate[] certificates) throws RuntimeException { // construct empty keystore KeyStore keyStore = KeyStore.getInstance(keyStoreType); // initialize keystore keyStore.load(null, null); // load certificates into keystore int length = certificates.length; for (int i = 0; i < length; i++) { Certificate certificate = certificates[i]; keyStore.setEntry(String.valueOf(i), new KeyStore.TrustedCertificateEntry(certificate), null); } return keyStore; } 

उसी क्लाइंट प्रमाणपत्र के साथ कीस्टोर के लिए भी जाता है, तो आप इसे बीकेएस में परिवर्तित किए बिना सीधे .p12 फ़ाइल का उपयोग कर सकते हैं।