एंड्रॉइड नेटवर्क सुरक्षा कॉन्फ़िगरेशन (Network Security Configuration)
एंड्रॉइड 7.0 (API 24+) से, ऐप्स एक XML फ़ाइल के माध्यम से अपने नेटवर्क सुरक्षा सेटिंग्स को घोषित रूप से कॉन्फ़िगर कर सकते हैं, बिना कोड बदले। यह res/xml/network_security_config.xml में परिभाषित होता है और AndroidManifest.xml में संदर्भित होता है।
मुख्य क्षमताएं
- कस्टम CA (सर्टिफिकेट अथॉरिटी) पर भरोसा - उद्यम/परीक्षण वातावरण के लिए
- सेल्फ-साइन सर्टिफिकेट पर भरोसा - विकास/स्टेजिंग सर्वर के लिए
- क्लियरटेक्स्ट ट्रैफिक (HTTP) अनुमति/अस्वीकृति - डोमेन-वार नियंत्रण
- सर्टिफिकेट पिनिंग - विशिष्ट सर्टिफिकेट/पब्लिक कुंजी तक सीमित भरोसा
- डिबग-ओनली ओवरराइड - डिबग बिल्ड में ढील, रिलीज़ में सख्त
उदाहरण कॉन्फ़िगरेशन फ़ाइल
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.myapp.com</domain>
<trust-anchors>
<certificates src="system"/>
<certificates src="@raw/my_custom_ca"/>
</trust-anchors>
<pin-set expiration="2025-12-31">
<pin digest="SHA-256">base64_encoded_sha256_of_subject_public_key</pin>
<pin digest="SHA-256">backup_pin_here</pin>
</pin-set>
</domain-config>
<debug-overrides>
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/> <!-- उपयोगकर्ता-स्थापित CA के लिए -->
</trust-anchors>
</debug-overrides>
</network-security-config>
मैनिफेस्ट में पंजीकरण
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
Flutter में उपयोग
<!-- android/app/src/main/AndroidManifest.xml -->
<application ...>
<meta-data
android:name="io.flutter.network-policy"
android:resource="@xml/network_security_config" />
</application>
क्लियरटेक्स्ट ट्रैफिक (HTTP) समस्या ठीक करना
समस्या: एंड्रॉइड 9+ डिफ़ॉल्ट रूप से क्लियरटेक्स्ट HTTP ब्लॉक करता है।
समाधान 1 (अनुशंसित नहीं - असुरक्षित):
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</base-config>
समाधान 2 (बेहतर - विशिष्ट डोमेन के लिए):
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">legacy-api.example.com</domain>
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</domain-config>
समाधान 3 (Manifest में - त्वरित फिक्स):
<application
android:usesCleartextTraffic="true"
...>
एंड्रॉइड पर सर्टिफिकेट प्रबंधन
- सिस्टम CA: Google/डिवाइस निर्माता द्वारा प्री-इंस्टॉल विश्वसनीय CA (~150+)
- उपयोगकर्ता CA: उपयोगकर्ता द्वारा सेटिंग्स > सुरक्षा > एन्क्रिप्शन और क्रेडेंशियल्स > प्रमाणपत्र स्थापित करें के माध्यम से जोड़े गए
- ऐप-विशिष्ट CA:
src="@raw/my_ca"के माध्यम से ऐप के साथ बंडल
SSL/TLS सर्टिफिकेट पिनिंग
पिनिंग MITM हमलों को रोकता है भले ही हमलावर के पास विश्वसनीय CA से वैध सर्टिफिकेट हो।
<pin-set>में SHA-256 बेस64-एन्कोडेड सब्जेक्ट पब्लिक कुंजी जानकारी (SPKI) पिन जोड़ें- हमेशा बैकअप पिन शामिल करें (सर्टिफिकेट रोटेशन के लिए)
expirationसेट करें - पिन अनिश्चित काल तक मान्य नहीं होने चाहिए- टेस्टिंग के लिए:
debug-overridesमें पिनिंग अक्षम करें
नेटवर्क सुरक्षा कॉन्फ़िगरेशन डीबग करना
adb logcat | grep -i "network_security_config"adb shell dumpsys netpolicy- नेटवर्क नीति स्थिति- क्रोम में
chrome://net-internals/#events- TLS हैंडशेक विवरण
सामान्य गलतियों से बचें
- उत्पादन में
cleartextTrafficPermitted="true"वैश्विक रूप से सक्षम करना - बैकअप पिन के बिना पिनिंग - सर्टिफिकेट रोटेशन पर ऐप टूटेगा
- डिबग ओवरराइड को रिलीज़ बिल्ड में लीक होने देना
- समाप्त हो चुके पिन का उपयोग करना
- उपयोगकर्ता-स्थापित CA पर भरोसा करना उत्पादन
base-configमें (केवलdebug-overridesमें)