
إضافة "plugin" لتطبيقات Android بلغة Java تتيح سؤال المستخدم حول شهادات SSL
MemorizingTrustManager (MTM) هو مشروع يهدف إلى تمكين استخدام أكثر ذكاءً وأمانًا لـ SSL على أندرويد. إذا واجه شهادة SSL غير معروفة، فإنه يسأل المستخدم عما إذا كان يرغب في قبول الشهادة مرة واحدة، أو بشكل دائم، أو إحباط الاتصال. هذه خطوة نحو منع هجمات الوسيط (man-in-the-middle) عبر القبول الأعمى لأي شهادات غير صالحة، أو ذاتية التوقيع، و/أو منتهية الصلاحية.
MTM يهدف إلى توفير تكامل سلس داخل تطبيق أندرويد الخاص بك، وكود المصدر متاح تحت رخصة MIT.

MemorizingTrustManager قيد الاستخدام الإنتاجي في عميل XMPP yaxim. إنه قابل للاستخدام وسهل التكامل، على الرغم من أنه لا يدعم بعد التحقق من اسم المضيف (واجهة برمجة تطبيقات جافا تجعل تكامله صعبًا).
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>
ربط MemorizingTrustmanager في اتصالات HTTPS:
// تسجيل MemorizingTrustManager لـ HTTPS
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 يجب عليك القيام بما يلي:
// تسجيل MemorizingTrustManager لجميع اتصالات SSLSocket
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);
إذا كنت ترغب في استخدام TrustManager أساسي مختلف، مثل
AndroidPinning، فقط قم بتمريره إلى
منشئ MTM:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
يستخدم MTM java.util.logging (JUL) لأغراض التسجيل. إذا لم تكن قد قمت بتكوين Handler لـ JUL، فإن أندرويد سيسجل افتراضيًا جميع الرسائل بمستوى Level.INFO أو أعلى. من أجل الحصول أيضًا على رسائل تسجيل التصحيح (تلك بمستوى Level.FINE أو أقل) تحتاج إلى تكوين Handler وفقًا لذلك. مشروع MTM التجريبي يحتوي على de.duenndns.mtmexample.JULHandler، والذي يتيح تمكين وتعطيل تسجيل التصحيح في وقت التشغيل.
MemorizingTrustManager ليس الوحيد في هذا المجال.
NetCipher هي مكتبة أندرويد صُنعت بواسطة مشروع Guardian لتحسين أمان الشبكات لتطبيقات الجوال. تأتي مع StrongTrustManager لإجراء فحوصات شهادات أكثر شمولًا، ومخزن جذور شهادات CA مستقل، وكود لتوجيه حركة المرور الخاصة بك بسهولة عبر شبكة Tor باستخدام Orbot.
AndroidPinning هي مكتبة أندرويد أخرى، كتبها Moxie Marlinspike للسماح بتثبيت شهادات الخادم، مما يحسن الأمان ضد هجمات الوسيط على نطاق حكومي. استخدم هذا إذا كان تطبيقك مصممًا للتواصل مع خادم محدد!