SSL Pinning هي تقنية أمان يتحقق فيها التطبيق من شهادة الخادم مقابل بصمة أو شهادة معروفة مسبقاً، بدلاً من الاعتماد على سلسلة الثقة الخاصة بالمرجع المصدق (CA). على عكس التحقق القياسي، يمنع التثبيت اعتراض حركة المرور عبر مراكز شهادات جذرية مزيفة. وفقاً لـ OWASP Mobile Security Testing Guide (2025)، تُصنف هذه التقنية ضمن أفضل 3 إجراءات موصى بها للحماية من هجمات MITM. بدون التثبيت، يمكن للمهاجم الذي لديه شهادة جذرية مزيفة فك تشفير كل حركة مرور HTTPS للتطبيق.
الخلاصة
SSL Pinning هي آلية أمان حيث يتذكر التطبيق المحمول أو الويب شهادة خادم موثوقة أو مفتاحاً عاماً ويرفض أي اتصالات لا تتطابق شهادتها مع المخزنة. في مخطط HTTPS القياسي، يتحقق العميل من الشهادة عبر سلسلة ثقة تصل إلى المرجع المصدق الجذري — يمكن لأي مرجع مصدق التوقيع على شهادة لأي نطاق. يزيل SSL Pinning هذه النقطة الضعيفة: بدلاً من الثقة في مئات المرجعيات المصدقة، يثق التطبيق في شهادة واحدة محددة فقط.
مشكلة التحقق القياسي هي أن أيًا من مئات المرجعيات المصدقة الجذرية يمكنه إصدار شهادة صالحة لنطاقك — عن طريق الصدفة أو تحت الإكراه. يمكن للمهاجم الذي يحصل على وصول إلى وكيل مؤسسي بشهادته الجذرية الخاصة تنفيذ هجوم MITM دون تحذير المتصفح. يسد SSL Pinning هذه الثغرة الأمنية: حتى إذا أصدر مرجع مصدق شهادة مزيفة، سيرفضها التطبيق لأن البصمة لا تتطابق مع المسجلة.
في التطبيقات المحمولة، يعتبر SSL Pinning مهماً بشكل خاص لأن الأجهزة تعمل غالباً على شبكات غير آمنة — Wi-Fi عام، وكلاء مؤسسي مع فحص حركة المرور، نقاط وصول مصابة. وفقاً لـ Verizon Mobile Security Index (2025)، أكثر من 60% من خروقات البيانات في التطبيقات المحمولة مرتبطة باعتراض حركة المرور في طبقة النقل.
تنقل التطبيقات المحمولة بيانات حساسة — رموز المصادقة، معلومات الدفع، بيانات المستخدم الشخصية. بدون حماية إضافية، يمكن اختراق HTTPS عبر استبدال الشهادة الجذرية على الجهاز — على سبيل المثال، بعد تثبيت ملف تعريف مؤسسي أو تطبيق ضار. SSL Pinning يضمن أنه حتى إذا تم تثبيت مرجع مصدق جذري مزيف على الجهاز، سيستمر التطبيق في التحقق من الشهادة مقابل قائمته البيضاء الخاصة.
تتكون عملية SSL Pinning من ثلاث مراحل: التقاط البصمة، التحقق عند الاتصال، ومعالجة الأخطاء. أثناء التطوير، يحصل المهندس على بصمة SHA-256 لشهادة الخادم (openssl x509 -fingerprint -sha256) ويدمجها في كود التطبيق أو ملف التكوين. مع كل طلب HTTPS، يحسب التطبيق بصمة الشهادة المستلمة ويقارنها مع المخزنة — إذا كانت القيم غير متطابقة، يتم قطع الاتصال.
المرحلة الأولى — التثبيت في وقت البناء: يعرف المطور شهادات الخادم مسبقاً ويدمج تجزئاتها. المرحلة الثانية — التثبيت عند أول اتصال (الثقة عند أول استخدام، TOFU): يتذكر التطبيق الشهادة عند الطلب الأول ويستخدمها للتحقق من جميع الطلبات اللاحقة. TOFU مناسب للبيئات الديناميكية لكنه ضعيف عند الهجوم الأول — إذا كان الاتصال الأول معترضاً بالفعل، سيتم قبول الشهادة المزيفة كموثوقة.
تفصيل حاسم هو دبابيس النسخ الاحتياطي (backup pins). الشهادات لها تاريخ انتهاء صلاحية، وعند استبدالها، سيفقد التطبيق دون تحديث الاتصال بالخادم. يضيف المهندسون 2–3 بصمات إضافية — على سبيل المثال، بصمة شهادة احتياطية وبصمة المرجع المصدق الجذري. إذا تغيرت الشهادة الرئيسية، يتحقق التطبيق من دبابيس النسخ الاحتياطي، ويستمر الاتصال في العمل.
# الحصول على بصمة SHA-256 للشهادة
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | \
openssl x509 -pubkey -noout | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 -binary | \
base64
هناك نهجان رئيسيان لتنفيذ التثبيت: التثبيت بالشهادة الكاملة (certificate pinning) والتثبيت بالمفتاح العام (public key pinning). لكل نهج نقاط قوته وقيوده التي تؤثر على الأمان وسهولة الصيانة.
| النوع | كائن التثبيت | المرونة | الأمان |
|---|---|---|---|
| Certificate Pinning | الشهادة X.509 بأكملها | منخفضة — يتطلب تحديثاً عند تغيير الشهادة | عالية — ربط دقيق |
| Public Key Pinning | المفتاح العام للشهادة | متوسطة — قد يكون المفتاح في شهادة جديدة | عالية — أقل حساسية لتفاصيل الشهادة |
| Hash Pinning | تجزئة SHA-256 للشهادة أو المفتاح | عالية — يمكن تغيير الشهادات دون تغيير المفتاح | متوسطة — تعتمد على قوة التجزئة |
تثبيت الشهادة هو الطريقة الأكثر صرامة. يخزن التطبيق نسخة من الشهادة الموثوقة أو بصمة SHA-256 الخاصة بها ويقارنها بشهادة الخادم عند كل اتصال HTTPS. توفر هذه الطريقة أقصى درجات الأمان ولكنها تخلق مشاكل أثناء التدوير — عادةً ما تدوم الشهادات 1–2 سنة، وبعدها يتطلب تحديثاً قسرياً للتطبيق. موصى به للأنظمة الحرجة ذات دورة تحديث خاضعة للتحكم.
تثبيت المفتاح العام هو نهج أكثر مرونة. بدلاً من الشهادة بأكملها، يتذكر التطبيق فقط المفتاح العام RSA أو ECDSA للخادم. يمكن أن يبقى المفتاح دون تغيير عند إعادة إصدار الشهادة، إذا كانت الشركة تستخدم نفس زوج المفاتيح. هذا يقلل من تكرار تحديثات التطبيق. ومع ذلك، إذا تم اختراق المفتاح، سيكون مطلوباً استبدالاً متسلسلاً على جميع العملاء.
على منصة Apple، يتم تنفيذ SSL Pinning من خلال مفوض URLSession. يقوم المطور بإنشاء فئة تنفذ بروتوكول URLSessionDelegate وتتجاوز طريقة didReceive challenge، حيث يتحقق يدوياً من شهادة الخادم مقابل البصمات المخزنة. نهج بديل هو استخدام Alamofire مع ServerTrustManager، الذي يبسط التكوين.
class SSLPinningDelegate: NSObject, URLSessionDelegate {
let pinnedHash = "sha256/Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg="
func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard let serverTrust = challenge.protectionSpace.serverTrust
else { return completionHandler(.cancelAuthenticationChallenge, nil) }
if validate(serverTrust, pinnedHash) {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
}
في المثال، يتلقى المفوض طلب مصادقة من URLSession، ويستخرج serverTrust من challenge، ويقارن بصمة SHA-256 للشهادة مع المخزنة. إذا تطابقت البصمة — يستمر الاتصال، وإلا يتم رفض challenge. للإنتاج، يجدر إضافة التحقق من عدة دبابيس احتياطية وتسجيل الأخطاء للمراقبة.
بدءاً من iOS 14، أضافت Apple دعماً مدمجاً لـ Certificate Pinning عبر Info.plist. يحدد المطور الشهادات الموثوقة في مفتاح NSAppTransportSecurity مع القاموس الفرعي NSPinnedDomains. هذا النهج لا يتطلب كتابة كود ولكنه أقل مرونة — من المستحيل تغيير الدبابيس ديناميكياً أو تسجيل أخطاء التحقق.
على Android، توجد ثلاث طرق رئيسية لتنفيذ SSL Pinning: عبر CertificatePinner من مكتبة OkHttp، عبر Network Security Config في XML، وعبر التحقق المخصص في HttpsURLConnection. OkHttp هو النهج الأكثر شيوعاً وموصى به، المستخدم في Retrofit وعملاء HTTP الآخرين.
val certificatePinner = CertificatePinner.Builder()
.add("api.example.com",
"sha256/Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg=")
.add("api.example.com",
"sha256/FiPq6ePEsVRqZ1yW0F6wLgWi24BE7j5qLk0iL=") // دبوس النسخ الاحتياطي
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
في تكوين OkHttp، يحدد المطور النطاق وبصمة أو أكثر SHA-256. عند البصمة الأولى، يقارن OkHttp شهادة الخادم مع الدبابيس المحددة. إذا لم يكن هناك تطابق، يطرح العميل SSLPeerUnverifiedException. دبوس النسخ الاحتياطي إلزامي — بدونه، عند تغيير الشهادة، ستبدأ طلبات API بالفشل فوراً.
يدعم Android Certificate Pinning التصريحي عبر تكوين XML بدءاً من API 24. ملف res/xml/network_security_config.xml يحتوي على قائمة النطاقات وبصماتها. هذه الطريقة مناسبة للتكوينات الثابتة لكنها لا تسمح بتنفيذ TOFU أو منطق تحقق مخصص مع تسجيل الحالات الشاذة.
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-12-31">
<pin digest="SHA-256">
Wi24BE7j5qLk0iLvPq6ePEsVRqZ1yW0F6wLg=</pin>
<pin digest="SHA-256">
FiPq6ePEsVRqZ1yW0F6wLgWi24BE7j5qLk0iL=</pin>
</pin-set>
</domain-config>
</network-security-config>
يزيد SSL Pinning بشكل كبير من أمان التطبيق المحمول ولكنه يقدم تعقيدات تشغيلية. الميزة الرئيسية هي الحماية من هجمات MITM حتى عند اختراق المرجعيات المصدقة الجذرية. يثق التطبيق فقط في تلك الشهادات المحددة صراحة من قبل المطور، وليس في البنية التحتية الكاملة لسلطات التصديق العامة. هذا مهم بشكل خاص لـ التطبيقات المالية وتطبيقات المراسلة والتطبيقات ذات البيانات الحساسة.
العيب الرئيسي هو تعقيد تدوير الشهادات. إذا انتهت صلاحية شهادة أو تم إبطالها، يفقد المستخدمون دون تحديث التطبيق الاتصال. يتم حل ذلك من خلال دبابيس النسخ الاحتياطي وآلية التحديث التدريجي: التطبيق الجديد يعرف كلاً من الشهادات القديمة والجديدة، وبعد تحديث كامل للمستخدمين، تتم إزالة الدبوس القديم من الكود. يوصى بتضمين على الأقل دبوسي نسخ احتياطي — واحد للشهادة الحالية، وآخر للمستقبل.
حل وسط آخر هو عدم القدرة على استخدام الوكلاء العموميين لتصحيح حركة المرور (Charles Proxy, Burp Suite) بدون تعطيل التثبيت. هذا يعقد تصحيح طلبات الشبكة أثناء التطوير. الحل هو التجميع الشرطي: التثبيت معطل في إصدارات التصحيح ومفعل في إصدارات الإصدار. توصي OWASP باستخدام علامة BuildConfig.DEBUG للتبديل.
| الجانب | الميزة | العيب |
|---|---|---|
| الأمان | الحماية من MITM عبر المرجعيات المصدقة المزيفة | التعقيد عند اختراق المفتاح |
| الصيانة | تحكم صريح في الثقة | التدوير يتطلب تحديث التطبيق |
| التصحيح | اتصال مضمون بالخادم الصحيح | يمنع وكلاء التصحيح |
الأسئلة الشائعة
التحقق القياسي من HTTPS يثق في أي شهادة موقعة من مرجع مصدق جذري معروف. SSL Pinning يثق فقط في شهادة محددة أو مفتاح — إذا أصدر مرجع مصدق شهادة مزيفة، سيرفضها التطبيق.
عادةً ما تدوم الشهادات 1–2 سنة. يوصى بتحديث الدبابيس 3–6 أشهر قبل انتهاء صلاحية الشهادة الحالية، مع إضافة البصمة الجديدة كدبوس نسخ احتياطي، وإزالة القديم بعد التدوير.
نعم، لكن يجب مراعاة أن CDN قد تغير الشهادات عند التبديل بين خوادم الحافة. يوصى بالتثبيت على المفتاح العام بدلاً من شهادة محددة، واستخدام عدة دبابيس احتياطية.
يتم قطع الاتصال مع خطأ — على Android هذا SSLPeerUnverifiedException، على iOS يتم رفض challenge بـ .cancelAuthenticationChallenge. يجب على التطبيق معالجة هذا الخطأ بشكل صحيح وإخطار المستخدم.
لا، لكن OWASP توصي به للتطبيقات التي تتعامل مع بيانات حساسة: الخدمات المصرفية، الرعاية الصحية، الأنظمة المؤسسية. للتطبيقات البسيطة للقراءة فقط، عادةً ما يكون التحقق القياسي من HTTPS مع شهادات EV كافياً.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.