
Android Java के लिए एक "प्लगइन" जो उपयोगकर्ता से SSL प्रमाणपत्रों के बारे में पूछने की अनुमति देता है
MemorizingTrustManager (MTM) एक प्रोजेक्ट है जो Android पर SSL के अधिक स्मार्ट और सुरक्षित उपयोग को सक्षम बनाता है। यदि इसे कोई अज्ञात SSL प्रमाणपत्र मिलता है, तो यह उपयोगकर्ता से पूछता है कि प्रमाणपत्र को एक बार स्वीकार करना है, स्थायी रूप से, या कनेक्शन को समाप्त करना है। यह किसी भी अमान्य, स्व-हस्ताक्षरित और/या समाप्त प्रमाणपत्रों को आँख बंद करके स्वीकार करके मैन-इन-द-मिडिल हमलों को रोकने की दिशा में एक कदम है।
MTM का उद्देश्य आपके Android एप्लिकेशन में सहज एकीकरण प्रदान करना है, और स्रोत कोड MIT लाइसेंस के अंतर्गत उपलब्ध है।

MemorizingTrustManager yaxim XMPP क्लाइंट में उत्पादन उपयोग में है। यह उपयोग योग्य और एकीकृत करने में आसान है, हालाँकि यह अभी तक होस्टनाम सत्यापन का समर्थन नहीं करता है (Java API इसे एकीकृत करना कठिन बनाता है)।
MTM को आपके अपने एप्लिकेशन में एकीकृत करना आसान है। इन चरणों का पालन करें या example निर्देशिका में डेमो एप्लिकेशन पर एक नज़र डालें।
MTM स्रोत को GitHub से डाउनलोड करें, या इसे git सबमॉड्यूल के रूप में जोड़ें:
# सादा डाउनलोड:
git clone https://github.com/ge0rg/MemorizingTrustManager
# सबमॉड्यूल:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
फिर default.properties में एक लाइब्रेरी प्रोजेक्ट निर्भरता जोड़ें:
android.library.reference.1=MemorizingTrustManager
अपनी AndroidManifest.xml संपादित करें और MTM गतिविधि तत्व को अपने समापन </application> टैग के अंत से ठीक पहले जोड़ें।
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
HTTPS कनेक्शन में MemorizingTrustmanager को जोड़ना:
// HTTPS के लिए MemorizingTrustManager पंजीकृत करें
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(
mtm.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier()));
SSLSocket के लिए आपको निम्न कार्य करना चाहिए:
// सभी SSLSocket के लिए MemorizingTrustManager पंजीकृत करें
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
HostnameVerifier hv = mtm.wrapHostnameVerifier(new org.apache.http.conn.ssl.StrictHostnameVerifier());
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
SSLContext.setDefault(sc);
// एक सॉकेट कनेक्ट करें
SSLSocket s = ...;
s.startHandshake();
if (!hv.verify(your_domain_name, sslSocket.getSession())) {
throw new CertificateException("Server failed to authenticate as " + your_domain_name);
}
या, Smack के लिए आप setCustomSSLContext() का उपयोग कर सकते हैं:
org.jivesoftware.smack.ConnectionConfiguration connectionConfiguration = …
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
connectionConfiguration.setCustomSSLContext(sc);
connectionConfiguration.setHostnameVerifier(
mtm.wrapHostnameVerifier(new org.apache.http.conn.ssl.StrictHostnameVerifier()));
डिफ़ॉल्ट रूप से, MTM उपयोगकर्ता से पूछने से पहले सिस्टम TrustManager पर वापस आ जाता है। यदि आप स्थापना पर भरोसा नहीं करते हैं, तो आप कंस्ट्रक्टर को defaultTrustManager = null पैरामीटर प्रदान करके हर नए कनेक्शन पर एक डायलॉग लागू कर सकते हैं:
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
यदि आप AndroidPinning जैसे किसी भिन्न अंतर्निहित TrustManager का उपयोग करना चाहते हैं, तो उसे MTM के कंस्ट्रक्टर को प्रदान करें:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
MTM लॉगिंग उद्देश्यों के लिए java.util.logging (JUL) का उपयोग करता है। यदि आपने JUL के लिए एक Handler कॉन्फ़िगर नहीं किया है, तो Android डिफ़ॉल्ट रूप से Level.INFO या उच्चतर के सभी संदेशों को लॉग करेगा। डीबग लॉग संदेशों (Level.FINE या निम्न वाले) को भी प्राप्त करने के लिए आपको तदनुसार एक Handler कॉन्फ़िगर करने की आवश्यकता है। MTM उदाहरण प्रोजेक्ट में de.duenndns.mtmexample.JULHandler है, जो रनटाइम पर डीबग लॉगिंग को सक्षम और अक्षम करने की अनुमति देता है।
MemorizingTrustManager अकेला नहीं है।
NetCipher Guardian Project द्वारा बनाई गई एक Android लाइब्रेरी है जो मोबाइल ऐप्स के लिए नेटवर्क सुरक्षा में सुधार करती है। इसके साथ अधिक गहन प्रमाणपत्र जाँच के लिए एक StrongTrustManager, एक स्वतंत्र रूट CA स्टोर, और Orbot का उपयोग करके Tor नेटवर्क के माध्यम से अपने ट्रैफ़िक को आसानी से रूट करने के लिए कोड शामिल है।
AndroidPinning Moxie Marlinspike द्वारा लिखी गई एक और Android लाइब्रेरी है, जो सर्वर प्रमाणपत्रों की पिनिंग की अनुमति देती है, जिससे सरकारी स्तर के MitM हमलों के खिलाफ सुरक्षा में सुधार होता है। यदि आपका ऐप किसी विशिष्ट सर्वर के साथ संवाद करने के लिए बनाया गया है तो इसका उपयोग करें!