प्रमाणन प्लेटफ़ॉर्म से सुरक्षित कनेक्शन प्राप्त करने के लिए निम्नलिखित मुख्य चरणों की आवश्यकता होती है, जिन्हें एंड्रॉइड प्लेटफॉर्म द्वारा विश्वसनीय नहीं माना जाता है।
जैसा कि कई उपयोगकर्ताओं द्वारा अनुरोध किया गया है, मैंने अपने ब्लॉग लेख के सबसे महत्वपूर्ण हिस्सों को यहाँ दिखाया है:
- सभी आवश्यक प्रमाणपत्र (मूल और किसी भी मध्यवर्ती सीए के) को पकड़ो
- Keytool और BouncyCastle प्रदाता के साथ एक कीस्टोर बनाएँ और सीट्स आयात करें
- अपने एंड्रॉइड ऐप में कीस्टोर को लोड करें और इसे सुरक्षित कनेक्शन के लिए उपयोग करें (मैं मानक के बजाय Apache HttpClient का उपयोग करने की सलाह देता हूं
java.net.ssl.HttpsURLConnection
(समझने में आसान, अधिक प्रदर्शन करने वाला)
अनाज पकड़ो
आपको उन सभी प्रमाणपत्रों को प्राप्त करना होगा जो एक समापन बिंदु प्रमाण पत्र से एक श्रृंखला बनाते हैं रूट सीए तक। इसका मतलब है, कोई भी (यदि मौजूद है) इंटरमीडिएट सीए सेर्ट करता है और रूट सीए सर्टिफिकेट भी। आपको समापन बिंदु प्रमाणपत्र प्राप्त करने की आवश्यकता नहीं है।
कीस्टोर बनाएँ
BouncyCastle प्रदाता डाउनलोड करें और इसे किसी ज्ञात स्थान पर संग्रहीत करें। यह भी सुनिश्चित करें कि आप keytool कमांड (आमतौर पर आपके JRE इंस्टॉलेशन के बिन फ़ोल्डर के नीचे स्थित) को लागू कर सकते हैं।
अब BouncyCastle स्वरूपित कीस्टोर में प्राप्त किए गए सीट्स (समापन बिंदु प्रमाणपत्र को आयात न करें) आयात करें।
मैंने इसका परीक्षण नहीं किया, लेकिन मुझे लगता है कि प्रमाणपत्र आयात करने का क्रम महत्वपूर्ण है। इसका मतलब है, सबसे पहले इंटरमीडिएट सीए प्रमाण पत्र को आयात करें और फिर रूट सीए प्रमाणपत्र तक सभी तरह से।
निम्नलिखित कमांड के साथ पासवर्ड के साथ एक नया कीस्टोर (यदि पहले से मौजूद नहीं है) mysecret बनाया जाएगा और इंटरमीडिएट CA प्रमाणपत्र आयात किया जाएगा। मैंने BouncyCastle प्रदाता को भी परिभाषित किया है, जहां यह मेरी फाइल सिस्टम और कीस्टोर प्रारूप पर पाया जा सकता है। चेन में प्रत्येक प्रमाण पत्र के लिए इस कमांड को निष्पादित करें।
keytool -importcert -v -trustcacerts -file "path_to_cert/interm_ca.cer" -alias IntermediateCA -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret
सत्यापित करें कि प्रमाणपत्र किस्टोर में सही तरीके से आयात किए गए थे:
keytool -list -keystore "res/raw/mykeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret
पूरी श्रृंखला का उत्पादन करना चाहिए:
RootCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
IntermediateCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 98:0F:C3:F8:39:F7:D8:05:07:02:0D:E3:14:5B:29:43
अब आप अपने Android ऐप में कच्चे संसाधन के रूप में कीस्टोर को कॉपी कर सकते हैं res/raw/
अपने ऐप में कीस्टोर का इस्तेमाल करें
सबसे पहले हमें एक कस्टम Apache HttpClient बनाना होगा जो HTTPS कनेक्शन के लिए हमारे कीस्टोर का उपयोग करता है:
import org.apache.http.*
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.mykeystore);
try {
// Initialize the keystore with the provided trusted certificates
// Also provide the password of the keystore
trusted.load(in, "mysecret".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);
}
}
}
हमने अपना कस्टम HttpClient बनाया है, अब हम इसे सुरक्षित कनेक्शन के लिए उपयोग कर सकते हैं। उदाहरण के लिए जब हम REST संसाधन के लिए GET कॉल करते हैं:
// Instantiate the custom HttpClient
DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpGet get = new HttpGet("https://www.mydomain.ch/rest/contacts/23");
// Execute the GET call and obtain the response
HttpResponse getResponse = client.execute(get);
HttpEntity responseEntity = getResponse.getEntity();
बस ;)