Certificate Pinning سرور کے سرٹیفکیٹ یا عوامی کلید کو فکس کرنے کا ایک طریقہ کار ہے، جس میں ایپلی کیشن HTTPS کنکشن کی تصدیق کے لیے پہلے سے معلوم فنگر پرنٹ استعمال کرتی ہے۔ CA کے ذریعے معیاری اعتماد کے سلسلے کے برعکس، pinning اس بات کی ضمانت دیتا ہے کہ ایک سمجھوتہ شدہ سرٹیفکیٹ اتھارٹی بھی آپ کے ڈومین کے لیے جعلی سرٹیفکیٹ جاری نہیں کر سکتی۔ OWASP MSTG (2025) کے مطابق، Certificate Pinning L2 تحفظ کی سطح کی ایپلی کیشنز کے لیے لازمی کنٹرولز کی فہرست میں شامل ہے۔ نفاذ میں کوڈ میں سرٹیفکیٹ ہیشز کو ذخیرہ کرنا اور ہر درخواست پر تصدیق کرنا شامل ہے۔
اہم نکات
Certificate Pinning ایک حفاظتی تکنیک ہے جس میں ایپلی کیشن ایک قابل بھروسہ سرٹیفکیٹ کا فنگر پرنٹ ذخیرہ کرتی ہے اور HTTPS کنکشن قائم کرنے کے لیے اسے واحد معیار کے طور پر استعمال کرتی ہے۔ معیاری TLS ماڈل میں، کلائنٹ تصدیق کرتا ہے کہ سرور کا سرٹیفکیٹ کسی قابل بھروسہ روٹ CA نے دستخط کیا ہے — سسٹم میں پہلے سے نصب سینکڑوں سرٹیفکیٹ اتھارٹیز میں سے کوئی بھی۔ Certificate Pinning اس زنجیر کو براہ راست جانچ سے بدل دیتا ہے: سرٹیفکیٹ کو ذخیرہ شدہ نمونے سے ملنا چاہیے یا متوقع عوامی کلید پر مشتمل ہونا چاہیے۔
معیاری ماڈل کا مسئلہ CA سمجھوتہ کے واقعات — DigiNotar (2011)، Comodo (2011)، TrustCor (2022) — کے بعد واضح ہوا۔ اگر کوئی CA آپ کے ڈومین کے لیے جعلی سرٹیفکیٹ جاری کرتا ہے، تو براؤزر یا ایپلی کیشن اسے درست مان کر قبول کر لیتا ہے۔ Certificate Pinning اس حملے کو روکتا ہے: یہاں تک کہ مکمل طور پر دستخط شدہ جعلی سرٹیفکیٹ بھی مسترد کر دیا جائے گا کیونکہ اس کا فنگر پرنٹ ایپلی کیشن میں فکس کردہ فنگر پرنٹ سے مطابقت نہیں رکھتا۔
pinning کی اصطلاح pin سے آئی ہے — «پن» یا «فکسیٹر»: ڈیولپر ایک قابل بھروسہ سرٹیفکیٹ کو فکس کرتا ہے، اور اس سے کوئی بھی انحراف کنکشن کو مسدود کر دیتا ہے۔ Mitre CWE-295 کی تحقیق کے مطابق، نامناسب سرٹیفکیٹ تصدیق موبائل ایپلی کیشنز میں سب سے خطرناک سیکیورٹی غلطیوں میں سے ایک ہے، اور Certificate Pinning اسے روکنے کا ایک براہ راست طریقہ ہے۔
اصل میں، Certificate Pinning براؤزرز میں HPKP (HTTP Public Key Pinning) میکانزم کے ذریعے استعمال ہوتا تھا، جو RFC 7469 میں معیاری بنایا گیا تھا۔ ڈیولپر متوقع کلیدوں کے ہیشز کے ساتھ ایک HTTP Public-Key-Pins ہیڈر بھیجتا تھا، اور براؤزر انہیں ایک مقررہ مدت کے لیے ذخیرہ کرتا تھا۔ تاہم، HPKP خطرناک ثابت ہوا: کنفیگریشن میں ایک غلطی کسی سائٹ کو مہینوں کے لیے مسدود کر سکتی تھی۔ 2018 میں، Chrome نے HPKP کی حمایت بند کر دی، اور موجودہ معیار کلائنٹ سائیڈ نفاذ — موبائل ایپلی کیشن یا براؤزر ایکسٹینشن کے اندر — بن گیا۔
Certificate Pinning کے عمل میں تین اہم مراحل شامل ہیں: فنگر پرنٹ کا حساب، کنکشن کی تصدیق اور غلطی کا انتظام۔ تیاری کے دوران، ڈیولپر پروڈکشن سرور کے سرٹیفکیٹ یا عوامی کلید کا SHA-256 ہیش حاصل کرتا ہے۔ GDPR اور PCI DSS کے مطابق ایپلی کیشنز کے لیے، زنجیر میں درمیانی CAs کے فنگر پرنٹس کو بھی فکس کرنا ضروری ہے۔
ہر HTTPS درخواست کے ساتھ، ایپلی کیشن TLS تصدیقی کال بیک کو روکتی ہے، سرور کا سرٹیفکیٹ نکالتی ہے اور اس کے SHA-256 ہیش کا حساب لگاتی ہے۔ اس ہیش کا موازنہ ذخیرہ شدہ قابل بھروسہ فنگر پرنٹس کی فہرست سے کیا جاتا ہے۔ اگر مماثلت مل جائے — کنکشن جاری رہتا ہے۔ اگر نہیں — ایپلی کیشن کو کنکشن ختم کرنا چاہیے اور حملہ آور کو نفاذ کی تفصیلات ظاہر کیے بغیر غلطی کی اطلاع دینی چاہیے۔
fun validateCertificate(certificate: X509Certificate,
expectedHash: String): Boolean {
val digest = MessageDigest.getInstance("SHA-256")
val hash = Base64.encodeToString(
digest.digest(certificate.publicKey.getEncoded()),
Base64.DEFAULT
).trim()
return hash == expectedHash
}
فنکشن سرور سے X509Certificate آبجیکٹ اور متوقع ہیش وصول کرتا ہے۔ یہ پہلے سرٹیفکیٹ کی عوامی کلید نکالتا ہے، SHA-256 ہیش کا حساب لگاتا ہے اور اسے Base64 میں انکوڈ کرتا ہے۔ نتیجہ کا موازنہ متوقع فنگر پرنٹ سے کیا جاتا ہے۔ پروڈکشن میں، گردش کو سپورٹ کرنے کے لیے 2–3 فنگر پرنٹس کی ایک صف کے خلاف تصدیق شامل کرنی چاہیے۔
pinning کو نافذ کرتے وقت، یہ انتخاب کرنا ہوتا ہے کہ کس کرپٹوگرافک آبجیکٹ کو فکس کرنا ہے۔ Certificate Pinning خود X.509 سرٹیفکیٹ سے منسلک ہوتا ہے — اس کے سیریل نمبر، میعاد کی مدت اور پوری زنجیر۔ Public Key Pinning سرٹیفکیٹ کے اندر صرف عوامی کلید کو فکس کرتا ہے، دیگر فیلڈز کو نظر انداز کرتے ہوئے۔ یہ انتخاب آپریشنل اخراجات کو نمایاں طور پر متاثر کرتا ہے۔
| معیار | Certificate Pinning | Public Key Pinning |
|---|---|---|
| فکسشن آبجیکٹ | مکمل X.509 سرٹیفکیٹ | RSA/ECDSA عوامی کلید |
| گردش | ہر دوبارہ جاری کرنے پر اپ ڈیٹ درکار | اسی کلید سے سرٹیفکیٹ تجدید پر تبدیل نہیں ہوتا |
| سیکیورٹی | زیادہ سے زیادہ درست بائنڈنگ | تفصیلات کے لیے کم حساس |
| لچک | کم — سرٹیفکیٹ ہر 1–2 سال میں بدلتے ہیں | اعلی — کلیدیں 5–10 سال چل سکتی ہیں |
| سفارش | کنٹرول شدہ اپ ڈیٹس والے اہم نظاموں کے لیے | زیادہ تر موبائل ایپلی کیشنز اور APIs کے لیے |
Public Key Pinning زیادہ تر منصوبوں کے لیے ترجیحی انتخاب ہے۔ سرٹیفکیٹ دوبارہ جاری کرتے وقت سرور کی عوامی کلیدیں عام طور پر تبدیل نہیں ہوتیں — کمپنی صرف پرانی کلید کو نئے سرٹیفکیٹ سے دستخط کرتی ہے۔ اس کا مطلب ہے کہ اگر کلید کا جوڑا تبدیل نہیں ہوا تو سرٹیفکیٹ تبدیل کرنے کے بعد ایپلی کیشن کو اپ ڈیٹ کی ضرورت نہیں ہے۔ دوسری طرف، Certificate Pinning ان منظرناموں کے لیے تجویز کیا جاتا ہے جہاں ڈیولپر سرور اور کلائنٹ کوڈ دونوں کو مکمل طور پر کنٹرول کرتا ہے، جیسے کہ سخت اپ ڈیٹ سائیکل والی انٹرپرائز ایپلی کیشنز میں۔
TOFU ایک حکمت عملی ہے جس میں Certificate Pinning پہلے سے ترتیب نہیں دیا جاتا، بلکہ سرور سے پہلے کنکشن پر سرٹیفکیٹ کو یاد رکھتا ہے۔ یہ طریقہ ان ایپلی کیشنز کے لیے آسان ہے جو پہلے سے نہیں جانتیں کہ وہ کس سرور سے منسلک ہوں گی۔ منفی پہلو ابتدائی حملے کا خطرہ ہے: اگر پہلا کنکشن روک لیا جائے، تو ایک جعلی سرٹیفکیٹ قابل بھروسہ مان کر قبول کر لیا جائے گا۔ TOFU SSH کنکشنز اور کچھ P2P پروٹوکولز میں استعمال ہوتا ہے۔
دونوں پلیٹ فارمز پر، Certificate Pinning نیٹ ورک اسٹیک کی سطح پر TLS کنکشن کو روک کر نافذ کیا جاتا ہے۔ iOS پر، URLSession ڈیلیگیٹ یا Alamofire ServerTrustManager استعمال ہوتا ہے۔ Android پر، ترجیحی طریقہ OkHttp CertificatePinner ہے، جو مشہور HTTP کلائنٹس میں شامل ہے اور ہر ڈومین کے لیے متعدد فنگر پرنٹس ترتیب دینے کی حمایت کرتا ہے۔
func validate(serverTrust: SecTrust,
pinnedHash: String) -> Bool {
guard let certificates = SecTrustCopyCertificateChain(serverTrust)
as? [SecCertificate] else { return false }
for certificate in certificates {
let data = SecCertificateCopyData(certificate)
var hash = Data(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
CC_SHA256($0.baseAddress,
CC_LONG(data.count), &hash)
}
if hash.base64EncodedString() == pinnedHash {
return true
}
}
return false
}
Swift فنکشن میں، serverTrust سے سرٹیفکیٹ چین نکالا جاتا ہے، ہر سرٹیفکیٹ کے لیے SHA-256 ہیش کا حساب لگایا جاتا ہے، اور نتیجہ متوقع سے موازنہ کیا جاتا ہے۔ چین میں تمام سرٹیفکیٹس کے ذریعے تکرار درمیانی CA سطح پر pinning کو نافذ کرنے کی اجازت دیتی ہے — اگر کوئی درمیانی سرٹیفکیٹ مماثل ہو تو کنکشن قبول کر لیا جاتا ہے۔ یہ لیف سرٹیفکیٹ گردش کے دوران لچک فراہم کرتا ہے۔
اگر ایپلی کیشن OkHttp استعمال نہیں کرتی، تو Certificate Pinning کو کسٹم X509TrustManager کے ذریعے نافذ کیا جا سکتا ہے۔ اس طریقہ میں زیادہ کوڈ درکار ہے لیکن تصدیقی عمل پر مکمل کنٹرول دیتا ہے۔ TrustManager checkServerTrusted طریقہ کو اوور رائڈ کرتا ہے، جہاں ڈیولپر دستی طور پر سرور کے سرٹیفکیٹس کی تصدیق کرتا ہے اور ان پر بھروسہ کرنے کا فیصلہ کرتا ہے۔ یہ صرف مخصوص منظرناموں کے لیے تجویز کیا جاتا ہے جہاں OkHttp لائبریری دستیاب نہ ہو۔
سب سے عام غلطی بیک اپ پنز کی عدم موجودگی ہے۔ ڈیولپر ایک ہی سرٹیفکیٹ فنگر پرنٹ شامل کرتا ہے، اور جب اس کی میعاد ختم ہوتی ہے تو صارفین اجتماعی طور پر کنکشن کھو دیتے ہیں۔ کم از کم قابل قبول ترتیب دو فنگر پرنٹس ہیں: موجودہ سرٹیفکیٹ اور ایک بیک اپ۔ مثالی طور پر تین: موجودہ، ایک بیک اپ، اور فال بیک کے طور پر روٹ CA فنگر پرنٹ۔
دوسری غلطی کوڈ میں پنوں کو سادہ متن میں ذخیرہ کرنا ہے۔ APK یا IPA تک رسائی رکھنے والا حملہ آور آسانی سے فنگر پرنٹس نکال سکتا ہے اور انہیں تبدیل کر سکتا ہے۔ ہیش مبہم کرنے کی سفارش کی جاتی ہے: سٹرنگ کو حصوں میں تقسیم کریں، انکرپٹڈ وسائل میں ذخیرہ کریں یا رن ٹائم پر حساب لگائیں۔ Android کے لیے، سٹرنگ کانسٹنٹ مبہم کرنے کے ساتھ ProGuard مؤثر ہے۔
تیسری غلطی ڈیولپمنٹ سرٹیفکیٹ کی سطح پر pinning کرنا ہے۔ ڈیولپمنٹ اور پروڈکشن سرٹیفکیٹ عام طور پر مختلف ہوتے ہیں، لیکن ڈیولپر اکثر ریلیز بناتے وقت پن تبدیل کرنا بھول جاتے ہیں۔ نتیجہ یہ ہوتا ہے کہ پروڈکشن ایپلی کیشن سرور سے کنیکٹ نہیں ہو سکتی۔ حل BuildConfig یا فلیور کے مخصوص وسائل کے ذریعے ڈیبگ اور ریلیز کے لیے علیحدہ پن کنفیگریشنز ہیں۔
اکثر پوچھے گئے سوالات
SSL Pinning SSL/TLS سرٹیفکیٹ سے منسلک ہونے کی ایک عام اصطلاح ہے۔ Certificate Pinning ایک مخصوص نفاذ ہے جو صرف عوامی کلید ہی نہیں، بلکہ خود X.509 سرٹیفکیٹ کو فکس کرتا ہے۔ فرق منسلک ہونے والی شے میں ہے: سرٹیفکیٹ بمقابلہ کلید۔
ProGuard (Android) کے ذریعے مبہم کردہ وسائل میں یا Keychain (iOS) کے ذریعے انکرپٹ کر کے ہیشز ذخیرہ کرنے کی سفارش کی جاتی ہے۔ انکرپشن کے بغیر strings.xml یا Info.plist میں پنوں کو سادہ متن میں ذخیرہ کرنے سے گریز کریں۔
سرور پر ہر سرٹیفکیٹ تبدیلی کے ساتھ۔ موجودہ سرٹیفکیٹ کی میعاد ختم ہونے سے 3–6 ماہ پہلے ایک نیا فنگر پرنٹ بیک اپ پن کے طور پر شامل کرنے اور گردش کے بعد پرانے کو ہٹانے کی سفارش کی جاتی ہے۔ کم از کم ایک بیک اپ پن لازمی ہے۔
ہاں، مشروط کمپائلیشن کے ذریعے: ڈیبگ بلڈ میں pinning غیر فعال ہے، ریلیز بلڈ میں فعال ہے۔ سوئچ کرنے کے لیے Android پر BuildConfig.DEBUG یا iOS پر #if DEBUG استعمال کریں۔ اسے کبھی بھی صارف کے لیے قابل رسائی رن ٹائم فلیگ کے ذریعے نہ کریں۔
فوری طور پر نئے فنگر پرنٹس کے ساتھ ایپلی کیشن اپ ڈیٹ جاری کریں اور اسے اسٹورز میں شائع کریں۔ جبری اپ ڈیٹ میکانزم استعمال کریں۔ اگر بیک اپ پنوں میں بیک اپ CA کا فنگر پرنٹ شامل تھا، تو آپ عارضی طور پر مختلف سرٹیفکیٹ والے دوسرے ڈومین پر سوئچ کر سکتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں