تكرار السؤال: …
الإجابة المختصرة
هو تقييد الاتصال بالخادم بشهادة أمان أو بصمة مفتاح عام (Public Key Hash) محددة مسبقًا داخل التطبيق بدلاً من الثقة في كل الشهادات الموثقة بالنظام.
الشرح
يحمي تثبيت الشهادات التطبيق من هجمات Man-in-the-Middle (MITM) حتى لو قام المهاجم بتثبيت شهادة جذرية خبيثة (Root CA) على جهاز المستخدم. يتم ضبطه في OkHttp باستخدام CertificatePinner أو في ملف Network Security Config. يجب دائمًا تضمين بصمة لمفتاح بديل (Backup Pin) لتفادي توقف التطبيق عند تجديد شهادات السيرفر.
مثال بالكود
val certificatePinner = CertificatePinner.Builder()
.add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=") // Backup pin
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()أخطاء شائعة
- تثبيت بصمة شهادة واحدة فقط بدون مفتاح احتياطي (Backup Pin)، مما يعطل التطبيق تمامًا فور انتهاء صلاحية شهادة الخادم.
- تثبيت الشهادة بالكامل بدلاً من تثبيت المفتاح العام (SPKI Pinning) الذي يبقى ثابتًا حتى عند تجديد الشهادة بنفس المفاتيح.