SSL Pinning एक सुरक्षा तकनीक है जिसमें ऐप्लिकेशन सर्वर प्रमाणपत्र को पहले से ज्ञात फ़िंगरप्रिंट या प्रमाणपत्र के आधार पर सत्यापित करता है, न कि CA श्रृंखला पर भरोसा करता है। मानक जाँच के विपरीत, पिनिंग नकली रूट प्रमाणपत्र प्राधिकरणों के माध्यम से ट्रैफ़िक अवरोधन को रोकता है। OWASP Mobile Security Testing Guide (2025) के अनुसार, यह तकनीक MITM हमलों से सुरक्षा के लिए शीर्ष-3 अनुशंसित नियंत्रणों में शामिल है। पिनिंग के बिना, नकली रूट प्रमाणपत्र वाला हमलावर ऐप्लिकेशन के सभी HTTPS ट्रैफ़िक को डिक्रिप्ट कर सकता है।
मुख्य बातें
SSL Pinning एक सुरक्षा तंत्र है जिसमें मोबाइल या वेब ऐप्लिकेशन एक विश्वसनीय सर्वर प्रमाणपत्र या सार्वजनिक कुंजी को याद रखता है और उन कनेक्शनों को अस्वीकार करता है जिनका प्रमाणपत्र संग्रहीत से मेल नहीं खाता। मानक HTTPS योजना में, क्लाइंट रूट CA तक विश्वास श्रृंखला के माध्यम से प्रमाणपत्र सत्यापित करता है — कोई भी CA किसी भी डोमेन के लिए प्रमाणपत्र पर हस्ताक्षर कर सकता है। SSL Pinning इस कमज़ोरी को समाप्त करता है: सैकड़ों CA पर भरोसा करने के बजाय, ऐप्लिकेशन केवल एक विशिष्ट प्रमाणपत्र पर भरोसा करता है।
मानक जाँच की समस्या यह है कि सैकड़ों रूट CA में से कोई भी आपके डोमेन के लिए एक वैध प्रमाणपत्र जारी कर सकता है — गलती से या दबाव में। एक हमलावर जो अपने स्वयं के रूट प्रमाणपत्र के साथ कॉर्पोरेट प्रॉक्सी तक पहुँच प्राप्त करता है, ब्राउज़र चेतावनी के बिना MITM हमला कर सकता है। SSL Pinning इस कमज़ोरी को बंद करता है: भले ही कोई CA नकली प्रमाणपत्र जारी करे, ऐप्लिकेशन इसे अस्वीकार कर देगा क्योंकि फ़िंगरप्रिंट रिकॉर्ड किए गए से मेल नहीं खाता।
मोबाइल ऐप्लिकेशन में SSL Pinning विशेष रूप से महत्वपूर्ण है क्योंकि डिवाइस अक्सर असुरक्षित नेटवर्क पर काम करते हैं — सार्वजनिक Wi-Fi, ट्रैफ़िक निरीक्षण वाले कॉर्पोरेट प्रॉक्सी, संक्रमित एक्सेस पॉइंट। Verizon Mobile Security Index (2025) के अनुसार, मोबाइल ऐप्लिकेशन में 60% से अधिक डेटा उल्लंघन परिवहन स्तर पर ट्रैफ़िक अवरोधन से संबंधित हैं।
मोबाइल ऐप्लिकेशन संवेदनशील डेटा संचारित करते हैं — प्रमाणीकरण टोकन, भुगतान जानकारी, उपयोगकर्ताओं का व्यक्तिगत डेटा। अतिरिक्त सुरक्षा के बिना, डिवाइस पर रूट प्रमाणपत्र प्रतिस्थापन के माध्यम से HTTPS से समझौता किया जा सकता है — उदाहरण के लिए, कॉर्पोरेट प्रोफ़ाइल या दुर्भावनापूर्ण ऐप्लिकेशन स्थापित करने के बाद। SSL Pinning सुनिश्चित करता है कि भले ही डिवाइस पर नकली रूट CA स्थापित हो, ऐप्लिकेशन अपनी स्वयं की श्वेतसूची के आधार पर प्रमाणपत्र सत्यापित करना जारी रखेगा।
SSL Pinning प्रक्रिया में तीन चरण होते हैं: फ़िंगरप्रिंट कैप्चर, कनेक्शन पर जाँच, और त्रुटि प्रबंधन। डेवलपमेंट के दौरान, इंजीनियर सर्वर प्रमाणपत्र का SHA-256 फ़िंगरप्रिंट प्राप्त करता है (openssl x509 -fingerprint -sha256) और इसे ऐप्लिकेशन कोड या कॉन्फ़िगरेशन फ़ाइल में एम्बेड करता है। प्रत्येक HTTPS अनुरोध पर, ऐप्लिकेशन प्राप्त प्रमाणपत्र के फ़िंगरप्रिंट की गणना करता है और संग्रहीत से तुलना करता है — यदि मान मेल नहीं खाते, तो कनेक्शन समाप्त कर दिया जाता है।
पहला चरण — बिल्ड समय पर पिनिंग: डेवलपर पहले से सर्वर प्रमाणपत्र जानता है और उनके हैश एम्बेड करता है। दूसरा चरण — पहले कनेक्शन पर पिनिंग (पहले उपयोग पर भरोसा, TOFU): ऐप्लिकेशन पहले अनुरोध पर प्रमाणपत्र याद रखता है और बाद के सभी अनुरोधों को सत्यापित करने के लिए इसका उपयोग करता है। TOFU गतिशील वातावरण के लिए सुविधाजनक है लेकिन पहले हमले पर कमज़ोर है — यदि पहला कनेक्शन पहले से ही अवरोधित है, तो नकली प्रमाणपत्र विश्वसनीय के रूप में स्वीकार कर लिया जाएगा।
एक महत्वपूर्ण विवरण है बैकअप पिन (backup pins)। प्रमाणपत्रों की समाप्ति तिथि होती है, और जब उन्हें बदला जाता है, तो अपडेट के बिना ऐप्लिकेशन सर्वर से कनेक्शन खो देगा। इंजीनियर 2–3 अतिरिक्त फ़िंगरप्रिंट शामिल करते हैं — उदाहरण के लिए, बैकअप प्रमाणपत्र का फ़िंगरप्रिंट और रूट CA का फ़िंगरप्रिंट। यदि मुख्य प्रमाणपत्र बदलता है, तो ऐप्लिकेशन बैकअप पिन के आधार पर जाँच करता है, और कनेक्शन काम करना जारी रखता है।
# 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 से एक प्रमाणीकरण अनुरोध प्राप्त करता है, challenge से serverTrust निकालता है, और प्रमाणपत्र के SHA-256 फ़िंगरप्रिंट की संग्रहीत से तुलना करता है। यदि फ़िंगरप्रिंट मेल खाता है — कनेक्शन जारी रहता है, अन्यथा challenge अस्वीकार कर दिया जाता है। उत्पादन के लिए, कई बैकअप पिनों की जाँच और निगरानी के लिए त्रुटि लॉगिंग जोड़ना उचित है।
iOS 14 से शुरू करके, Apple ने Info.plist के माध्यम से Certificate Pinning के लिए अंतर्निहित समर्थन जोड़ा। डेवलपर NSAppTransportSecurity कुंजी में NSPinnedDomains उप-शब्दकोश के साथ विश्वसनीय प्रमाणपत्र निर्दिष्ट करता है। इस दृष्टिकोण के लिए कोड लिखने की आवश्यकता नहीं है लेकिन यह कम लचीला है — पिन को गतिशील रूप से बदलना या सत्यापन त्रुटियों को लॉग करना असंभव है।
Android पर SSL Pinning लागू करने के तीन मुख्य तरीके हैं: OkHttp लाइब्रेरी के CertificatePinner के माध्यम से, XML में Network Security Config के माध्यम से, और 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 API 24 से शुरू करके XML कॉन्फ़िगरेशन के माध्यम से घोषणात्मक Certificate Pinning का समर्थन करता है। फ़ाइल 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 मोबाइल ऐप्लिकेशन की सुरक्षा में काफी वृद्धि करता है लेकिन परिचालन जटिलताएँ पैदा करता है। मुख्य लाभ रूट CA से समझौता होने पर भी MITM हमलों से सुरक्षा है। ऐप्लिकेशन केवल उन प्रमाणपत्रों पर भरोसा करता है जो डेवलपर द्वारा स्पष्ट रूप से निर्दिष्ट किए गए हैं, न कि सार्वजनिक प्रमाणपत्र प्राधिकरणों के पूरे बुनियादी ढाँचे पर। यह विशेष रूप से वित्तीय ऐप्लिकेशन, मैसेंजर और संवेदनशील डेटा वाले ऐप्लिकेशन के लिए महत्वपूर्ण है।
मुख्य कमी प्रमाणपत्र रोटेशन की जटिलता है। यदि कोई प्रमाणपत्र समाप्त हो जाता है या रद्द कर दिया जाता है, तो ऐप्लिकेशन अपडेट के बिना उपयोगकर्ता कनेक्शन खो देते हैं। यह बैकअप पिन और क्रमिक अपडेट तंत्र के माध्यम से हल किया जाता है: नया ऐप्लिकेशन पुराने और नए दोनों प्रमाणपत्रों को जानता है, और उपयोगकर्ताओं के पूर्ण अपडेट के बाद, पुराना पिन कोड से हटा दिया जाता है। कम से कम 2 बैकअप पिन शामिल करने की अनुशंसा की जाती है — एक वर्तमान प्रमाणपत्र के लिए, एक भविष्य के लिए।
एक और समझौता पिनिंग को अक्षम किए बिना ट्रैफ़िक डिबगिंग (Charles Proxy, Burp Suite) के लिए सार्वजनिक प्रॉक्सी का उपयोग करने में असमर्थता है। यह डेवलपमेंट के दौरान नेटवर्क अनुरोधों के डिबगिंग को जटिल बनाता है। समाधान सशर्त संकलन है: डीबग बिल्ड में पिनिंग अक्षम है, रिलीज़ में सक्षम है। OWASP स्विच करने के लिए BuildConfig.DEBUG फ़्लैग का उपयोग करने की अनुशंसा करता है।
| पहलू | लाभ | हानि |
|---|---|---|
| सुरक्षा | नकली CA के माध्यम से MITM से सुरक्षा | कुंजी से समझौता होने पर जटिलता |
| रखरखाव | स्पष्ट विश्वास नियंत्रण | रोटेशन के लिए ऐप्लिकेशन अपडेट आवश्यक |
| डिबगिंग | सही सर्वर से कनेक्शन की गारंटी | डिबगिंग प्रॉक्सी को अवरुद्ध करता है |
अक्सर पूछे जाने वाले प्रश्न
मानक HTTPS जाँच किसी ज्ञात रूट CA द्वारा हस्ताक्षरित किसी भी प्रमाणपत्र पर भरोसा करती है। SSL Pinning केवल एक विशिष्ट प्रमाणपत्र या कुंजी पर भरोसा करता है — यदि कोई CA नकली प्रमाणपत्र जारी करता है, तो ऐप्लिकेशन इसे अस्वीकार कर देगा।
प्रमाणपत्र आमतौर पर 1–2 साल तक चलते हैं। वर्तमान प्रमाणपत्र की समाप्ति से 3–6 महीने पहले पिन अपडेट करने, नए फ़िंगरप्रिंट को बैकअप पिन के रूप में जोड़ने और रोटेशन के बाद पुराने को हटाने की अनुशंसा की जाती है।
हाँ, लेकिन ध्यान रखें कि CDN एज सर्वर के बीच स्विच करते समय प्रमाणपत्र बदल सकता है। किसी विशिष्ट प्रमाणपत्र के बजाय सार्वजनिक कुंजी से बंधने और कई बैकअप पिन का उपयोग करने की अनुशंसा की जाती है।
कनेक्शन एक त्रुटि के साथ समाप्त हो जाता है — Android पर यह SSLPeerUnverifiedException है, iOS पर challenge को .cancelAuthenticationChallenge के साथ अस्वीकार कर दिया जाता है। ऐप्लिकेशन को इस त्रुटि को ठीक से संभालना चाहिए और उपयोगकर्ता को सूचित करना चाहिए।
नहीं, लेकिन OWASP इसे संवेदनशील डेटा से निपटने वाले ऐप्लिकेशन: बैंकिंग, स्वास्थ्य सेवा, कॉर्पोरेट सिस्टम के लिए अनुशंसित करता है। सरल केवल-पढ़ने वाले ऐप्लिकेशन के लिए, EV प्रमाणपत्र के साथ मानक HTTPS जाँच आमतौर पर पर्याप्त होती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें