پیکربندی امنیت شبکه

ویژگی Network Security Configuration به شما امکان می دهد تنظیمات امنیتی شبکه برنامه خود را در یک فایل پیکربندی ایمن و شفاف بدون تغییر کد برنامه سفارشی کنید. این تنظیمات را می توان برای دامنه های خاص و برای یک برنامه خاص پیکربندی کرد. قابلیت های کلیدی این ویژگی عبارتند از:

  • لنگرهای اعتماد سفارشی: سفارشی کنید که کدام مقامات گواهی (CA) برای اتصالات امن برنامه مورد اعتماد هستند. برای مثال، اعتماد به گواهی‌های خاص خودامضا یا محدود کردن مجموعه‌ای از CA عمومی که برنامه به آنها اعتماد دارد.
  • لغو فقط اشکال زدایی: اتصالات ایمن را در یک برنامه بدون خطر اضافی برای پایه نصب شده اشکال زدایی کنید.
  • انصراف از ترافیک Cleartext: از برنامه ها در برابر استفاده تصادفی از ترافیک متن شفاف (رمزگذاری نشده) محافظت کنید.
  • انتخاب شفافیت گواهی: اتصالات امن برنامه را برای استفاده از گواهی‌های ثبت‌شده قابل اثبات محدود کنید.
  • پین کردن گواهی: اتصال ایمن برنامه را به گواهی‌های خاصی محدود کنید.

یک فایل پیکربندی امنیت شبکه اضافه کنید

ویژگی پیکربندی امنیت شبکه از یک فایل XML استفاده می کند که در آن تنظیمات برنامه خود را مشخص می کنید. برای اشاره به این فایل باید یک ورودی در مانیفست برنامه خود وارد کنید. گزیده کد زیر از یک مانیفست نحوه ایجاد این ورودی را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

CA های مورد اعتماد را سفارشی کنید

ممکن است بخواهید برنامه شما به جای پیش‌فرض پلتفرم، به مجموعه‌ای از CA سفارشی اعتماد کند. شایع ترین دلایل این امر عبارتند از:

  • اتصال به یک میزبان با یک CA سفارشی، مانند یک CA که خودامضا شده یا در داخل یک شرکت صادر شده است.
  • محدود کردن مجموعه CA به جای هر CA از پیش نصب شده، فقط به CAهایی که به آنها اعتماد دارید.
  • اعتماد به CA های اضافی که در سیستم گنجانده نشده اند.

به طور پیش‌فرض، اتصالات امن (با استفاده از پروتکل‌هایی مانند TLS و HTTPS) از همه برنامه‌ها به CAهای از پیش نصب‌شده سیستم اعتماد دارند و برنامه‌هایی که Android 6.0 (سطح API 23) و پایین‌تر را هدف قرار می‌دهند نیز به‌طور پیش‌فرض به فروشگاه CA اضافه‌شده توسط کاربر اعتماد دارند. می توانید اتصالات برنامه خود را با استفاده از base-config (برای سفارشی سازی در سطح برنامه) یا domain-config (برای سفارشی سازی هر دامنه) سفارشی کنید.

یک CA سفارشی را پیکربندی کنید

ممکن است بخواهید به میزبانی متصل شوید که از گواهینامه SSL با امضای خود استفاده می کند یا به میزبانی که گواهی SSL آن توسط یک CA غیرعمومی مورد اعتماد شما صادر شده است، مانند CA داخلی شرکت شما. گزیده کد زیر نحوه پیکربندی برنامه خود را برای یک CA سفارشی در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

گواهی CA خودامضا یا غیرعمومی را در قالب PEM یا DER به res/raw/my_ca اضافه کنید.

مجموعه CA های مورد اعتماد را محدود کنید

اگر نمی‌خواهید برنامه شما به همه CAهای مورد اعتماد سیستم اعتماد کند، می‌توانید در عوض مجموعه‌ای از CAهای مورد اعتماد را مشخص کنید. این برنامه را در برابر گواهی های تقلبی صادر شده توسط هر یک از CA های دیگر محافظت می کند.

پیکربندی برای محدود کردن مجموعه CAهای قابل اعتماد شبیه به اعتماد به یک CA سفارشی برای یک دامنه خاص است با این تفاوت که چندین CA در منبع ارائه شده است. گزیده کد زیر نحوه محدود کردن مجموعه CA های قابل اعتماد برنامه خود را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

CAهای مورد اعتماد را در قالب PEM یا DER به res/raw/trusted_roots اضافه کنید. توجه داشته باشید که اگر از فرمت PEM استفاده می کنید، فایل باید فقط حاوی داده های PEM و بدون متن اضافی باشد. شما همچنین می توانید چندین عنصر <certificates> را به جای یک عنصر ارائه دهید.

به CA های اضافی اعتماد کنید

ممکن است بخواهید برنامه شما به CA های دیگری که مورد اعتماد سیستم نیستند اعتماد کند، مثلاً اگر سیستم هنوز شامل CA نیست یا CA شرایط لازم برای گنجاندن در سیستم Android را ندارد. می توانید چندین منبع گواهی را برای یک پیکربندی در res/xml/network_security_config.xml با استفاده از کدی مانند گزیده زیر مشخص کنید.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

CA ها را برای اشکال زدایی پیکربندی کنید

هنگام اشکال زدایی برنامه ای که از طریق HTTPS متصل می شود، ممکن است بخواهید به یک سرور توسعه محلی متصل شوید که گواهی SSL برای سرور تولید شما ندارد. برای پشتیبانی از این بدون هیچ تغییری در کد برنامه‌تان، می‌توانید CA‌های فقط اشکال‌زدایی را مشخص کنید، که فقط زمانی قابل اعتماد هستند که android:debuggable true است، با استفاده از debug-overrides . به طور معمول، IDE ها و ابزارهای ساخت، این پرچم را به طور خودکار برای ساخت های غیر انتشار تنظیم می کنند.

این از کد مشروط معمولی ایمن تر است زیرا به عنوان یک اقدام احتیاطی امنیتی، فروشگاه های برنامه برنامه هایی را که قابل اشکال زدایی علامت گذاری شده اند نمی پذیرند.

گزیده زیر نحوه تعیین CA های فقط اشکال زدایی را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

برای شفافیت گواهی شرکت کنید

توجه: پشتیبانی از شفافیت گواهی فقط از Android 16 (سطح API 36) در دسترس است.

شفافیت گواهی (CT, RFC 6962 ) یک استاندارد اینترنتی است که برای افزایش امنیت گواهی‌های دیجیتال طراحی شده است. این سازمان‌ها را ملزم می‌کند که تمام گواهی‌های صادر شده را به یک گزارش عمومی که آنها را ثبت می‌کند، ارسال کنند و شفافیت و پاسخگویی را در فرآیند صدور گواهی افزایش دهد.

با حفظ یک رکورد قابل تأیید از همه گواهی‌ها، CT جعل گواهی‌ها یا صدور اشتباه توسط CA را برای عوامل مخرب بسیار دشوارتر می‌کند. این به محافظت از کاربران در برابر حملات انسان در میان و سایر تهدیدات امنیتی کمک می کند. برای اطلاعات بیشتر، به توضیح در transparency.dev مراجعه کنید. برای اطلاعات بیشتر درباره انطباق با CT در Android، به خط‌مشی CT Android مراجعه کنید.

به‌طور پیش‌فرض، گواهی‌ها صرف‌نظر از اینکه در یک گزارش CT وارد شده باشند، پذیرفته می‌شوند. برای اطمینان از اینکه برنامه شما فقط به مقاصدی با گواهی‌های ثبت‌شده در گزارش CT متصل می‌شود، می‌توانید این ویژگی را به صورت سراسری یا بر اساس دامنه انتخاب کنید .

از ترافیک متن شفاف انصراف دهید

توجه: راهنمایی در این بخش فقط برای برنامه‌هایی اعمال می‌شود که Android 8.1 (سطح API 27) یا پایین‌تر را هدف قرار می‌دهند. با شروع اندروید 9 (سطح API 28)، پشتیبانی متن شفاف به طور پیش‌فرض غیرفعال است.

اگر قصد دارید برنامه شما فقط با استفاده از اتصالات امن به مقصدها متصل شود، می‌توانید از پشتیبانی از متن شفاف (با استفاده از پروتکل HTTP رمزگذاری نشده به جای HTTPS) برای آن مقصدها خودداری کنید. این گزینه به جلوگیری از رگرسیون تصادفی در برنامه ها به دلیل تغییر در URL های ارائه شده توسط منابع خارجی مانند سرورهای باطن کمک می کند. برای جزئیات بیشتر به NetworkSecurityPolicy.isCleartextTrafficPermitted() مراجعه کنید.

برای مثال، ممکن است بخواهید برنامه شما اطمینان حاصل کند که اتصالات به secure.example.com همیشه از طریق HTTPS انجام می شود تا از ترافیک حساس در برابر شبکه های متخاصم محافظت کند.

گزیده زیر نحوه انصراف از متن واضح در res/xml/network_security_config.xml را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

گواهینامه ها را پین کنید

به طور معمول، یک برنامه به همه CA های از پیش نصب شده اعتماد دارد. اگر هر یک از این CA ها گواهی تقلبی صادر کنند، برنامه در معرض خطر یک مهاجم در مسیر قرار می گیرد. برخی از برنامه‌ها انتخاب می‌کنند که مجموعه گواهی‌هایی را که می‌پذیرند با محدود کردن مجموعه‌ای از CA مورد اعتمادشان یا با پین کردن گواهی محدود کنند.

پین کردن گواهی با ارائه مجموعه ای از گواهی ها توسط هش کلید عمومی ( SubjectPublicKeyInfo از گواهی X.509) انجام می شود. یک زنجیره گواهی تنها در صورتی معتبر است که زنجیره گواهی حداقل یکی از کلیدهای عمومی پین شده را داشته باشد.

توجه داشته باشید که هنگام استفاده از پین کردن گواهی، همیشه باید یک کلید پشتیبان اضافه کنید تا اگر مجبور شدید به کلیدهای جدید بروید یا CA را تغییر دهید (هنگام پین کردن به گواهی CA یا واسطه آن CA)، اتصال برنامه شما تحت تأثیر قرار نگیرد. در غیر این صورت، برای بازیابی اتصال، باید یک به‌روزرسانی برای برنامه ارسال کنید.

علاوه بر این، امکان تعیین زمان انقضا برای پین ها وجود دارد که پس از آن پین کردن انجام نمی شود. این به جلوگیری از مشکلات اتصال در برنامه هایی که به روز نشده اند کمک می کند. با این حال، تنظیم زمان انقضا روی پین‌ها ممکن است مهاجمان را قادر به دور زدن گواهی‌های پین‌شده شما کند.

گزیده زیر نحوه پین ​​کردن گواهینامه ها را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

رفتار ارث بری پیکربندی

مقادیری که در یک پیکربندی خاص تنظیم نشده اند به ارث برده می شوند. این رفتار به پیکربندی های پیچیده تری اجازه می دهد و در عین حال فایل پیکربندی را قابل خواندن نگه می دارد.

به عنوان مثال، مقادیری که در یک domain-config تنظیم نشده‌اند، در صورت تودرتو، از والد domain-config ، یا از base-config ، اگر نه، گرفته می‌شوند. مقادیری که در base-config تنظیم نشده اند از مقادیر پیش فرض پلت فرم استفاده می کنند.

به عنوان مثال، موردی را در نظر بگیرید که در آن همه اتصالات به زیر دامنه های example.com باید از یک مجموعه سفارشی از CA استفاده کنند. علاوه بر این، ترافیک متن شفاف به این دامنه‌ها مجاز است ، مگر زمانی که به secure.example.com متصل می‌شوید. با قرار دادن پیکربندی secure.example.com در پیکربندی برای example.com ، نیازی به کپی کردن trust-anchors نیست.

گزیده زیر نشان می دهد که چگونه این تودرتو در res/xml/network_security_config.xml به نظر می رسد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

فرمت فایل پیکربندی

ویژگی پیکربندی امنیت شبکه از فرمت فایل XML استفاده می کند. ساختار کلی فایل در نمونه کد زیر نشان داده شده است:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>

بخش های زیر نحو و سایر جزئیات فرمت فایل را توضیح می دهند.

<network-security-config>

می تواند شامل:
0 یا 1 از <base-config>
هر تعداد <domain-config>
0 یا 1 از <debug-overrides>

<base-config>

نحو:
<base-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</base-config>
می تواند شامل:
<trust-anchors> <certificateTransparency>
توضیحات:
پیکربندی پیش‌فرض مورد استفاده همه اتصالاتی که مقصد آنها توسط یک domain-config پوشش داده نمی‌شود.

هر مقداری که تنظیم نشده باشد از مقادیر پیش فرض پلتفرم استفاده می کند.

پیکربندی پیش‌فرض برای برنامه‌هایی که اندروید 9 (سطح API 28) و بالاتر را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش‌فرض برای برنامه‌هایی که Android 7.0 (سطح API 24) تا Android 8.1 (سطح API 27) را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش‌فرض برای برنامه‌هایی که اندروید 6.0 (سطح API 23) و پایین‌تر را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<domain-config>

نحو:
<domain-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</domain-config>
می تواند شامل:
1 یا بیشتر <domain>
0 یا 1 <certificateTransparency>
0 یا 1 <trust-anchors>
0 یا 1 <pin-set>
هر تعداد <domain-config> تودرتو
توضیحات:
پیکربندی مورد استفاده برای اتصال به مقاصد خاص، همانطور که توسط عناصر domain تعریف شده است.

توجه داشته باشید که اگر چندین عنصر domain-config یک مقصد را پوشش دهند، از پیکربندی با خاص ترین (طولانی ترین) قانون دامنه منطبق استفاده می شود.

<دامنه>

نحو:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
صفات:
includeSubdomains
اگر "true" ، این قانون دامنه با دامنه و همه زیر دامنه ها، از جمله زیر دامنه های زیر دامنه ها مطابقت دارد. در غیر این صورت، این قانون فقط برای تطابق دقیق اعمال می شود.

<certificateTransparency>

نحو:
<certificateTransparency enabled=["true" | "false"]/>
توضیحات:
اگر true ، برنامه از گزارش‌های شفافیت گواهی برای تأیید اعتبار گواهی‌ها استفاده می‌کند. هنگامی که یک برنامه از گواهی خود (یا فروشگاه کاربر) استفاده می کند، احتمالاً گواهی عمومی نیست و بنابراین با استفاده از شفافیت گواهی قابل تأیید نیست. به طور پیش فرض، تأیید برای این موارد غیرفعال است. هنوز هم می‌توان با استفاده از <certificateTransparency enabled="true"/> در پیکربندی دامنه، تأیید را اجباری کرد. برای هر <domain-config> ، ارزیابی به ترتیب زیر است:
  1. اگر certificateTransparency فعال است، تأیید را فعال کنید.
  2. اگر هر یک از <trust-anchors> "user" یا درون خطی است (یعنی "@raw/cert.pem" )، تأیید را غیرفعال کنید.
  3. در غیر این صورت، به پیکربندی ارثی تکیه کنید.

<debug-overrides>

نحو:
<debug-overrides>
    ...
</debug-overrides>
می تواند شامل:
0 یا 1 <trust-anchors>
توضیحات:
لغو زمانی که android:debuggable "true" باشد اعمال می‌شود، که معمولاً برای ساخت‌های غیرانتشاری تولید شده توسط IDEها و ابزارهای ساخت، صادق است. لنگرهای اعتماد مشخص شده در debug-overrides به همه پیکربندی‌های دیگر اضافه می‌شوند و زمانی که زنجیره گواهی سرور از یکی از این لنگرهای اعتماد فقط اشکال‌زدایی استفاده می‌کند، پین کردن گواهی انجام نمی‌شود. اگر android:debuggable "false" باشد، این بخش کاملا نادیده گرفته می شود.

<trust-anchors>

نحو:
<trust-anchors>
...
</trust-anchors>
می تواند شامل:
هر تعداد <certificates> گواهی>
توضیحات:
مجموعه ای از لنگرهای اعتماد برای اتصالات ایمن.

<گواهی نامه ها>

نحو:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
توضیحات:
مجموعه ای از گواهینامه های X.509 برای عناصر trust-anchors .
صفات:
src
منبع گواهینامه های CA. هر گواهی می تواند یکی از موارد زیر باشد:
  • یک شناسه منبع خام که به فایلی حاوی گواهینامه های X.509 اشاره می کند. گواهینامه ها باید با فرمت DER یا PEM کدگذاری شوند. در مورد گواهی‌های PEM، فایل نباید حاوی داده‌های غیر PEM اضافی مانند نظرات باشد.
  • "system" برای گواهینامه های CA سیستم از پیش نصب شده
  • "user" برای گواهی های CA اضافه شده توسط کاربر
overridePins

مشخص می کند که CAهای این منبع از پین کردن گواهی عبور کنند. اگر "true" ، پین کردن در زنجیره های گواهی که توسط یکی از CA از این منبع امضا شده است انجام نمی شود. این می‌تواند برای اشکال‌زدایی CA یا برای آزمایش حملات انسان در وسط به ترافیک امن برنامه شما مفید باشد.

پیش‌فرض "false" است، مگر اینکه در عنصر debug-overrides مشخص شده باشد، در این صورت پیش‌فرض "true" است.

<pin-set>

نحو:
<pin-set expiration="date">
...
</pin-set>
می تواند شامل:
هر تعداد <pin>
توضیحات:
مجموعه ای از پین های کلید عمومی برای اینکه یک اتصال امن قابل اعتماد باشد، یکی از کلیدهای عمومی در زنجیره اعتماد باید در مجموعه پین ​​ها باشد. برای فرمت پین ها به <pin> مراجعه کنید.
صفات:
expiration
تاریخ، در قالب yyyy-MM-dd که در آن پین ها منقضی می شوند، بنابراین پین کردن غیرفعال می شود. اگر ویژگی تنظیم نشده باشد، پین ها منقضی نمی شوند.

انقضا به جلوگیری از مشکلات اتصال در برنامه‌هایی که به‌روزرسانی‌های مجموعه پین ​​خود را دریافت نمی‌کنند، مانند زمانی که کاربر به‌روزرسانی‌های برنامه را غیرفعال می‌کند، کمک می‌کند.

<پین>

نحو:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
صفات:
digest
الگوریتم هضم مورد استفاده برای تولید پین. در حال حاضر، فقط "SHA-256" پشتیبانی می شود.
،

ویژگی Network Security Configuration به شما امکان می دهد تنظیمات امنیتی شبکه برنامه خود را در یک فایل پیکربندی ایمن و شفاف بدون تغییر کد برنامه سفارشی کنید. این تنظیمات را می توان برای دامنه های خاص و برای یک برنامه خاص پیکربندی کرد. قابلیت های کلیدی این ویژگی عبارتند از:

  • لنگرهای اعتماد سفارشی: سفارشی کنید که کدام مقامات گواهی (CA) برای اتصالات امن برنامه مورد اعتماد هستند. برای مثال، اعتماد به گواهی‌های خاص خودامضا یا محدود کردن مجموعه‌ای از CA عمومی که برنامه به آنها اعتماد دارد.
  • لغو فقط اشکال زدایی: اتصالات ایمن را در یک برنامه بدون خطر اضافی برای پایه نصب شده اشکال زدایی کنید.
  • انصراف از ترافیک Cleartext: از برنامه ها در برابر استفاده تصادفی از ترافیک متن شفاف (رمزگذاری نشده) محافظت کنید.
  • انتخاب شفافیت گواهی: اتصالات امن برنامه را برای استفاده از گواهی‌های ثبت‌شده قابل اثبات محدود کنید.
  • پین کردن گواهی: اتصال ایمن برنامه را به گواهی‌های خاصی محدود کنید.

یک فایل پیکربندی امنیت شبکه اضافه کنید

ویژگی پیکربندی امنیت شبکه از یک فایل XML استفاده می کند که در آن تنظیمات برنامه خود را مشخص می کنید. برای اشاره به این فایل باید یک ورودی در مانیفست برنامه خود وارد کنید. گزیده کد زیر از یک مانیفست نحوه ایجاد این ورودی را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

CA های مورد اعتماد را سفارشی کنید

ممکن است بخواهید برنامه شما به جای پیش‌فرض پلتفرم، به مجموعه‌ای از CA سفارشی اعتماد کند. شایع ترین دلایل این امر عبارتند از:

  • اتصال به یک میزبان با یک CA سفارشی، مانند یک CA که خودامضا شده یا در داخل یک شرکت صادر شده است.
  • محدود کردن مجموعه CA به جای هر CA از پیش نصب شده، فقط به CAهایی که به آنها اعتماد دارید.
  • اعتماد به CA های اضافی که در سیستم گنجانده نشده اند.

به طور پیش‌فرض، اتصالات امن (با استفاده از پروتکل‌هایی مانند TLS و HTTPS) از همه برنامه‌ها به CAهای از پیش نصب‌شده سیستم اعتماد دارند و برنامه‌هایی که Android 6.0 (سطح API 23) و پایین‌تر را هدف قرار می‌دهند نیز به‌طور پیش‌فرض به فروشگاه CA اضافه‌شده توسط کاربر اعتماد دارند. می توانید اتصالات برنامه خود را با استفاده از base-config (برای سفارشی سازی در سطح برنامه) یا domain-config (برای سفارشی سازی هر دامنه) سفارشی کنید.

یک CA سفارشی را پیکربندی کنید

ممکن است بخواهید به میزبانی متصل شوید که از گواهینامه SSL با امضای خود استفاده می کند یا به میزبانی که گواهی SSL آن توسط یک CA غیرعمومی مورد اعتماد شما صادر شده است، مانند CA داخلی شرکت شما. گزیده کد زیر نحوه پیکربندی برنامه خود را برای یک CA سفارشی در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

گواهی CA خودامضا یا غیرعمومی را در قالب PEM یا DER به res/raw/my_ca اضافه کنید.

مجموعه CA های مورد اعتماد را محدود کنید

اگر نمی‌خواهید برنامه شما به همه CAهای مورد اعتماد سیستم اعتماد کند، می‌توانید در عوض مجموعه‌ای از CAهای مورد اعتماد را مشخص کنید. این برنامه را در برابر گواهی های تقلبی صادر شده توسط هر یک از CA های دیگر محافظت می کند.

پیکربندی برای محدود کردن مجموعه CAهای قابل اعتماد شبیه به اعتماد به یک CA سفارشی برای یک دامنه خاص است با این تفاوت که چندین CA در منبع ارائه شده است. گزیده کد زیر نحوه محدود کردن مجموعه CA های قابل اعتماد برنامه خود را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

CAهای مورد اعتماد را در قالب PEM یا DER به res/raw/trusted_roots اضافه کنید. توجه داشته باشید که اگر از فرمت PEM استفاده می کنید، فایل باید فقط حاوی داده های PEM و بدون متن اضافی باشد. شما همچنین می توانید چندین عنصر <certificates> را به جای یک عنصر ارائه دهید.

به CA های اضافی اعتماد کنید

ممکن است بخواهید برنامه شما به CA های دیگری که مورد اعتماد سیستم نیستند اعتماد کند، مثلاً اگر سیستم هنوز شامل CA نیست یا CA شرایط لازم برای گنجاندن در سیستم Android را ندارد. می توانید چندین منبع گواهی را برای یک پیکربندی در res/xml/network_security_config.xml با استفاده از کدی مانند گزیده زیر مشخص کنید.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

CA ها را برای اشکال زدایی پیکربندی کنید

هنگام اشکال زدایی برنامه ای که از طریق HTTPS متصل می شود، ممکن است بخواهید به یک سرور توسعه محلی متصل شوید که گواهی SSL برای سرور تولید شما ندارد. برای پشتیبانی از این بدون هیچ تغییری در کد برنامه‌تان، می‌توانید CA‌های فقط اشکال‌زدایی را مشخص کنید، که فقط زمانی قابل اعتماد هستند که android:debuggable true است، با استفاده از debug-overrides . به طور معمول، IDE ها و ابزارهای ساخت، این پرچم را به طور خودکار برای ساخت های غیر انتشار تنظیم می کنند.

این از کد مشروط معمولی ایمن تر است زیرا به عنوان یک اقدام احتیاطی امنیتی، فروشگاه های برنامه برنامه هایی را که قابل اشکال زدایی علامت گذاری شده اند نمی پذیرند.

گزیده زیر نحوه تعیین CA های فقط اشکال زدایی را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

برای شفافیت گواهی شرکت کنید

توجه: پشتیبانی از شفافیت گواهی فقط از Android 16 (سطح API 36) در دسترس است.

شفافیت گواهی (CT, RFC 6962 ) یک استاندارد اینترنتی است که برای افزایش امنیت گواهی‌های دیجیتال طراحی شده است. این سازمان‌ها را ملزم می‌کند که تمام گواهی‌های صادر شده را به یک گزارش عمومی که آنها را ثبت می‌کند، ارسال کنند و شفافیت و پاسخگویی را در فرآیند صدور گواهی افزایش دهد.

با حفظ یک رکورد قابل تأیید از همه گواهی‌ها، CT جعل گواهی‌ها یا صدور اشتباه توسط CA را برای عوامل مخرب بسیار دشوارتر می‌کند. این به محافظت از کاربران در برابر حملات انسان در میان و سایر تهدیدات امنیتی کمک می کند. برای اطلاعات بیشتر، به توضیح در transparency.dev مراجعه کنید. برای اطلاعات بیشتر درباره انطباق با CT در Android، به خط‌مشی CT Android مراجعه کنید.

به‌طور پیش‌فرض، گواهی‌ها صرف‌نظر از اینکه در یک گزارش CT وارد شده باشند، پذیرفته می‌شوند. برای اطمینان از اینکه برنامه شما فقط به مقاصدی با گواهی‌های ثبت‌شده در گزارش CT متصل می‌شود، می‌توانید این ویژگی را به صورت سراسری یا بر اساس دامنه انتخاب کنید .

از ترافیک متن شفاف انصراف دهید

توجه: راهنمایی در این بخش فقط برای برنامه‌هایی اعمال می‌شود که Android 8.1 (سطح API 27) یا پایین‌تر را هدف قرار می‌دهند. با شروع اندروید 9 (سطح API 28)، پشتیبانی متن شفاف به طور پیش‌فرض غیرفعال است.

اگر قصد دارید برنامه شما فقط با استفاده از اتصالات امن به مقصدها متصل شود، می‌توانید از پشتیبانی از متن شفاف (با استفاده از پروتکل HTTP رمزگذاری نشده به جای HTTPS) برای آن مقصدها خودداری کنید. این گزینه به جلوگیری از رگرسیون تصادفی در برنامه ها به دلیل تغییر در URL های ارائه شده توسط منابع خارجی مانند سرورهای باطن کمک می کند. برای جزئیات بیشتر به NetworkSecurityPolicy.isCleartextTrafficPermitted() مراجعه کنید.

برای مثال، ممکن است بخواهید برنامه شما اطمینان حاصل کند که اتصالات به secure.example.com همیشه از طریق HTTPS انجام می شود تا از ترافیک حساس در برابر شبکه های متخاصم محافظت کند.

گزیده زیر نحوه انصراف از متن واضح در res/xml/network_security_config.xml را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

گواهینامه ها را پین کنید

به طور معمول، یک برنامه به همه CA های از پیش نصب شده اعتماد دارد. اگر هر یک از این CA ها گواهی تقلبی صادر کنند، برنامه در معرض خطر یک مهاجم در مسیر قرار می گیرد. برخی از برنامه‌ها انتخاب می‌کنند که مجموعه گواهی‌هایی را که می‌پذیرند با محدود کردن مجموعه‌ای از CA مورد اعتمادشان یا با پین کردن گواهی محدود کنند.

پین کردن گواهی با ارائه مجموعه ای از گواهی ها توسط هش کلید عمومی ( SubjectPublicKeyInfo از گواهی X.509) انجام می شود. یک زنجیره گواهی تنها در صورتی معتبر است که زنجیره گواهی حداقل یکی از کلیدهای عمومی پین شده را داشته باشد.

توجه داشته باشید که هنگام استفاده از پین کردن گواهی، همیشه باید یک کلید پشتیبان اضافه کنید تا اگر مجبور شدید به کلیدهای جدید بروید یا CA را تغییر دهید (هنگام پین کردن به گواهی CA یا واسطه آن CA)، اتصال برنامه شما تحت تأثیر قرار نگیرد. در غیر این صورت، برای بازیابی اتصال، باید یک به‌روزرسانی برای برنامه ارسال کنید.

علاوه بر این، امکان تعیین زمان انقضا برای پین ها وجود دارد که پس از آن پین کردن انجام نمی شود. این به جلوگیری از مشکلات اتصال در برنامه هایی که به روز نشده اند کمک می کند. با این حال، تنظیم زمان انقضا روی پین‌ها ممکن است مهاجمان را قادر به دور زدن گواهی‌های پین‌شده شما کند.

گزیده زیر نحوه پین ​​کردن گواهینامه ها را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

رفتار ارث بری پیکربندی

مقادیری که در یک پیکربندی خاص تنظیم نشده اند به ارث برده می شوند. این رفتار به پیکربندی های پیچیده تری اجازه می دهد و در عین حال فایل پیکربندی را قابل خواندن نگه می دارد.

به عنوان مثال، مقادیری که در یک domain-config تنظیم نشده‌اند، در صورت تودرتو، از والد domain-config ، یا از base-config ، اگر نه، گرفته می‌شوند. مقادیری که در base-config تنظیم نشده اند از مقادیر پیش فرض پلت فرم استفاده می کنند.

به عنوان مثال، موردی را در نظر بگیرید که در آن همه اتصالات به زیر دامنه های example.com باید از یک مجموعه سفارشی از CA استفاده کنند. علاوه بر این، ترافیک متن شفاف به این دامنه‌ها مجاز است ، مگر زمانی که به secure.example.com متصل می‌شوید. با قرار دادن پیکربندی secure.example.com در پیکربندی برای example.com ، نیازی به کپی کردن trust-anchors نیست.

گزیده زیر نشان می دهد که چگونه این تودرتو در res/xml/network_security_config.xml به نظر می رسد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

فرمت فایل پیکربندی

ویژگی پیکربندی امنیت شبکه از فرمت فایل XML استفاده می کند. ساختار کلی فایل در نمونه کد زیر نشان داده شده است:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>

بخش های زیر نحو و سایر جزئیات فرمت فایل را توضیح می دهند.

<network-security-config>

می تواند شامل:
0 یا 1 از <base-config>
هر تعداد <domain-config>
0 یا 1 از <debug-overrides>

<base-config>

نحو:
<base-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</base-config>
می تواند شامل:
<trust-anchors> <certificateTransparency>
توضیحات:
پیکربندی پیش‌فرض مورد استفاده همه اتصالاتی که مقصد آنها توسط یک domain-config پوشش داده نمی‌شود.

هر مقداری که تنظیم نشده باشد از مقادیر پیش فرض پلتفرم استفاده می کند.

پیکربندی پیش‌فرض برای برنامه‌هایی که اندروید 9 (سطح API 28) و بالاتر را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش‌فرض برای برنامه‌هایی که Android 7.0 (سطح API 24) تا Android 8.1 (سطح API 27) را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش‌فرض برای برنامه‌هایی که اندروید 6.0 (سطح API 23) و پایین‌تر را هدف قرار می‌دهند به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<domain-config>

نحو:
<domain-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</domain-config>
می تواند شامل:
1 یا بیشتر <domain>
0 یا 1 <certificateTransparency>
0 یا 1 <trust-anchors>
0 یا 1 <pin-set>
هر تعداد <domain-config> تودرتو
توضیحات:
پیکربندی مورد استفاده برای اتصال به مقاصد خاص، همانطور که توسط عناصر domain تعریف شده است.

توجه داشته باشید که اگر چندین عنصر domain-config یک مقصد را پوشش دهند، از پیکربندی با خاص ترین (طولانی ترین) قانون دامنه منطبق استفاده می شود.

<دامنه>

نحو:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
صفات:
includeSubdomains
اگر "true" ، این قانون دامنه با دامنه و همه زیر دامنه ها، از جمله زیر دامنه های زیر دامنه ها مطابقت دارد. در غیر این صورت، این قانون فقط برای تطابق دقیق اعمال می شود.

<certificateTransparency>

نحو:
<certificateTransparency enabled=["true" | "false"]/>
توضیحات:
اگر true ، برنامه از گزارش‌های شفافیت گواهی برای تأیید اعتبار گواهی‌ها استفاده می‌کند. هنگامی که یک برنامه از گواهی خود (یا فروشگاه کاربر) استفاده می کند، احتمالاً گواهی عمومی نیست و بنابراین با استفاده از شفافیت گواهی قابل تأیید نیست. به طور پیش فرض، تأیید برای این موارد غیرفعال است. هنوز هم می‌توان با استفاده از <certificateTransparency enabled="true"/> در پیکربندی دامنه، تأیید را اجباری کرد. برای هر <domain-config> ، ارزیابی به ترتیب زیر است:
  1. اگر certificateTransparency فعال است، تأیید را فعال کنید.
  2. اگر هر یک از <trust-anchors> "user" یا درون خطی است (یعنی "@raw/cert.pem" )، تأیید را غیرفعال کنید.
  3. در غیر این صورت، به پیکربندی ارثی تکیه کنید.

<debug-overrides>

نحو:
<debug-overrides>
    ...
</debug-overrides>
می تواند شامل:
0 یا 1 <trust-anchors>
توضیحات:
لغو زمانی که android:debuggable "true" باشد اعمال می‌شود، که معمولاً برای ساخت‌های غیرانتشاری تولید شده توسط IDEها و ابزارهای ساخت، صادق است. لنگرهای اعتماد مشخص شده در debug-overrides به همه پیکربندی‌های دیگر اضافه می‌شوند و زمانی که زنجیره گواهی سرور از یکی از این لنگرهای اعتماد فقط اشکال‌زدایی استفاده می‌کند، پین کردن گواهی انجام نمی‌شود. اگر android:debuggable "false" باشد، این بخش کاملا نادیده گرفته می شود.

<trust-anchors>

نحو:
<trust-anchors>
...
</trust-anchors>
می تواند شامل:
هر تعداد <certificates> گواهی>
توضیحات:
مجموعه ای از لنگرهای اعتماد برای اتصالات ایمن.

<گواهی نامه ها>

نحو:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
توضیحات:
مجموعه ای از گواهینامه های X.509 برای عناصر trust-anchors .
صفات:
src
منبع گواهینامه های CA. هر گواهی می تواند یکی از موارد زیر باشد:
  • یک شناسه منبع خام که به فایلی حاوی گواهینامه های X.509 اشاره می کند. گواهینامه ها باید با فرمت DER یا PEM کدگذاری شوند. در مورد گواهی‌های PEM، فایل نباید حاوی داده‌های غیر PEM اضافی مانند نظرات باشد.
  • "system" برای گواهینامه های CA سیستم از پیش نصب شده
  • "user" برای گواهی های CA اضافه شده توسط کاربر
overridePins

مشخص می کند که CAهای این منبع از پین کردن گواهی عبور کنند. اگر "true" ، پین کردن در زنجیره های گواهی که توسط یکی از CA از این منبع امضا شده است انجام نمی شود. این می‌تواند برای اشکال‌زدایی CA یا برای آزمایش حملات انسان در وسط به ترافیک امن برنامه شما مفید باشد.

پیش‌فرض "false" است، مگر اینکه در عنصر debug-overrides مشخص شده باشد، در این صورت پیش‌فرض "true" است.

<pin-set>

نحو:
<pin-set expiration="date">
...
</pin-set>
می تواند شامل:
هر تعداد <pin>
توضیحات:
مجموعه ای از پین های کلید عمومی برای اینکه یک اتصال امن قابل اعتماد باشد، یکی از کلیدهای عمومی در زنجیره اعتماد باید در مجموعه پین ​​ها باشد. برای فرمت پین ها به <pin> مراجعه کنید.
صفات:
expiration
تاریخ، در قالب yyyy-MM-dd که در آن پین ها منقضی می شوند، بنابراین پین کردن غیرفعال می شود. اگر ویژگی تنظیم نشده باشد، پین ها منقضی نمی شوند.

انقضا به جلوگیری از مشکلات اتصال در برنامه‌هایی که به‌روزرسانی‌های مجموعه پین ​​خود را دریافت نمی‌کنند، مانند زمانی که کاربر به‌روزرسانی‌های برنامه را غیرفعال می‌کند، کمک می‌کند.

<پین>

نحو:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
صفات:
digest
الگوریتم هضم مورد استفاده برای تولید پین. در حال حاضر، فقط "SHA-256" پشتیبانی می شود.
،

ویژگی Network Security Configuration به شما امکان می دهد تنظیمات امنیتی شبکه برنامه خود را در یک فایل پیکربندی ایمن و شفاف بدون تغییر کد برنامه سفارشی کنید. این تنظیمات را می توان برای دامنه های خاص و برای یک برنامه خاص پیکربندی کرد. قابلیت های کلیدی این ویژگی عبارتند از:

  • لنگرهای اعتماد سفارشی: سفارشی کنید که کدام مقامات گواهی (CA) برای اتصالات امن برنامه مورد اعتماد هستند. برای مثال، اعتماد به گواهی‌های خاص خودامضا یا محدود کردن مجموعه‌ای از CA عمومی که برنامه به آنها اعتماد دارد.
  • لغو فقط اشکال زدایی: اتصالات ایمن را در یک برنامه بدون خطر اضافی برای پایه نصب شده اشکال زدایی کنید.
  • انصراف از ترافیک Cleartext: از برنامه ها در برابر استفاده تصادفی از ترافیک متن شفاف (رمزگذاری نشده) محافظت کنید.
  • انتخاب شفافیت گواهی: اتصالات امن برنامه را برای استفاده از گواهی‌های ثبت‌شده قابل اثبات محدود کنید.
  • پین کردن گواهی: اتصال ایمن برنامه را به گواهی‌های خاصی محدود کنید.

یک فایل پیکربندی امنیت شبکه اضافه کنید

ویژگی پیکربندی امنیت شبکه از یک فایل XML استفاده می کند که در آن تنظیمات برنامه خود را مشخص می کنید. برای اشاره به این فایل باید یک ورودی در مانیفست برنامه خود وارد کنید. گزیده کد زیر از یک مانیفست نحوه ایجاد این ورودی را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

CA های مورد اعتماد را سفارشی کنید

ممکن است بخواهید برنامه شما به جای پیش‌فرض پلتفرم، به مجموعه‌ای از CA سفارشی اعتماد کند. شایع ترین دلایل این امر عبارتند از:

  • اتصال به یک میزبان با یک CA سفارشی، مانند یک CA که خودامضا شده یا در داخل یک شرکت صادر شده است.
  • محدود کردن مجموعه CA به جای هر CA از پیش نصب شده، فقط به CAهایی که به آنها اعتماد دارید.
  • اعتماد به CA های اضافی که در سیستم گنجانده نشده اند.

به طور پیش‌فرض، اتصالات امن (با استفاده از پروتکل‌هایی مانند TLS و HTTPS) از همه برنامه‌ها به CAهای از پیش نصب‌شده سیستم اعتماد دارند و برنامه‌هایی که Android 6.0 (سطح API 23) و پایین‌تر را هدف قرار می‌دهند نیز به‌طور پیش‌فرض به فروشگاه CA اضافه‌شده توسط کاربر اعتماد دارند. می توانید اتصالات برنامه خود را با استفاده از base-config (برای سفارشی سازی در سطح برنامه) یا domain-config (برای سفارشی سازی هر دامنه) سفارشی کنید.

یک CA سفارشی را پیکربندی کنید

ممکن است بخواهید به میزبانی متصل شوید که از گواهینامه SSL با امضای خود استفاده می کند یا به میزبانی که گواهی SSL آن توسط یک CA غیرعمومی مورد اعتماد شما صادر شده است، مانند CA داخلی شرکت شما. گزیده کد زیر نحوه پیکربندی برنامه خود را برای یک CA سفارشی در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

گواهی CA خودامضا یا غیرعمومی را در قالب PEM یا DER به res/raw/my_ca اضافه کنید.

مجموعه CA های مورد اعتماد را محدود کنید

اگر نمی‌خواهید برنامه شما به همه CAهای مورد اعتماد سیستم اعتماد کند، می‌توانید در عوض مجموعه‌ای از CAهای مورد اعتماد را مشخص کنید. این برنامه را در برابر گواهی های تقلبی صادر شده توسط هر یک از CA های دیگر محافظت می کند.

پیکربندی برای محدود کردن مجموعه CAهای قابل اعتماد شبیه به اعتماد به یک CA سفارشی برای یک دامنه خاص است با این تفاوت که چندین CA در منبع ارائه شده است. گزیده کد زیر نحوه محدود کردن مجموعه CA های قابل اعتماد برنامه خود را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

CAهای مورد اعتماد را در قالب PEM یا DER به res/raw/trusted_roots اضافه کنید. توجه داشته باشید که اگر از فرمت PEM استفاده می کنید، فایل باید فقط حاوی داده های PEM و بدون متن اضافی باشد. شما همچنین می توانید چندین عنصر <certificates> را به جای یک عنصر ارائه دهید.

به CA های اضافی اعتماد کنید

ممکن است بخواهید برنامه شما به CA های دیگری که مورد اعتماد سیستم نیستند اعتماد کند، مثلاً اگر سیستم هنوز شامل CA نیست یا CA شرایط لازم برای گنجاندن در سیستم Android را ندارد. می توانید چندین منبع گواهی را برای یک پیکربندی در res/xml/network_security_config.xml با استفاده از کدی مانند گزیده زیر مشخص کنید.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

CA ها را برای اشکال زدایی پیکربندی کنید

هنگام اشکال زدایی برنامه ای که از طریق HTTPS متصل می شود، ممکن است بخواهید به یک سرور توسعه محلی متصل شوید که گواهی SSL برای سرور تولید شما ندارد. برای پشتیبانی از این بدون هیچ تغییری در کد برنامه‌تان، می‌توانید CA‌های فقط اشکال‌زدایی را مشخص کنید، که فقط زمانی قابل اعتماد هستند که android:debuggable true است، با استفاده از debug-overrides . به طور معمول، IDE ها و ابزارهای ساخت، این پرچم را به طور خودکار برای ساخت های غیر انتشار تنظیم می کنند.

این از کد مشروط معمولی ایمن تر است زیرا به عنوان یک اقدام احتیاطی امنیتی، فروشگاه های برنامه برنامه هایی را که قابل اشکال زدایی علامت گذاری شده اند نمی پذیرند.

گزیده زیر نحوه تعیین CA های فقط اشکال زدایی را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

برای شفافیت گواهی شرکت کنید

توجه: پشتیبانی از شفافیت گواهی فقط از Android 16 (سطح API 36) در دسترس است.

شفافیت گواهی (CT, RFC 6962 ) یک استاندارد اینترنتی است که برای افزایش امنیت گواهی‌های دیجیتال طراحی شده است. این سازمان‌ها را ملزم می‌کند که تمام گواهی‌های صادر شده را به یک گزارش عمومی که آنها را ثبت می‌کند، ارسال کنند و شفافیت و پاسخگویی را در فرآیند صدور گواهی افزایش دهد.

با حفظ یک رکورد قابل تأیید از همه گواهی‌ها، CT جعل گواهی‌ها یا صدور اشتباه توسط CA را برای عوامل مخرب بسیار دشوارتر می‌کند. این به محافظت از کاربران در برابر حملات انسان در میان و سایر تهدیدات امنیتی کمک می کند. برای اطلاعات بیشتر، به توضیح در transparency.dev مراجعه کنید. برای اطلاعات بیشتر درباره انطباق با CT در Android، به خط‌مشی CT Android مراجعه کنید.

به‌طور پیش‌فرض، گواهی‌ها صرف‌نظر از اینکه در یک گزارش CT وارد شده باشند، پذیرفته می‌شوند. برای اطمینان از اینکه برنامه شما فقط به مقاصدی با گواهی‌های ثبت‌شده در گزارش CT متصل می‌شود، می‌توانید این ویژگی را به صورت سراسری یا بر اساس دامنه انتخاب کنید .

انصراف از ترافیک متن شفاف

توجه: راهنمایی در این بخش فقط برای برنامه‌هایی اعمال می‌شود که Android 8.1 (سطح API 27) یا پایین‌تر را هدف قرار می‌دهند. با شروع اندروید 9 (سطح API 28)، پشتیبانی متن شفاف به طور پیش‌فرض غیرفعال است.

اگر قصد دارید برنامه شما فقط با استفاده از اتصالات امن به مقصدها متصل شود، می‌توانید از پشتیبانی از متن شفاف (با استفاده از پروتکل HTTP رمزگذاری نشده به جای HTTPS) برای آن مقصدها خودداری کنید. این گزینه به جلوگیری از رگرسیون تصادفی در برنامه ها به دلیل تغییر در URL های ارائه شده توسط منابع خارجی مانند سرورهای باطن کمک می کند. برای جزئیات بیشتر به NetworkSecurityPolicy.isCleartextTrafficPermitted() مراجعه کنید.

برای مثال، ممکن است بخواهید برنامه شما اطمینان حاصل کند که اتصالات به secure.example.com همیشه از طریق HTTPS انجام می شود تا از ترافیک حساس در برابر شبکه های متخاصم محافظت کند.

گزیده زیر نحوه انصراف از متن واضح در res/xml/network_security_config.xml را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

گواهینامه ها را پین کنید

به طور معمول ، یک برنامه به همه CAS از پیش نصب شده اعتماد دارد. اگر هر یک از این CA ها یک گواهی کلاهبرداری صادر می کردند ، این برنامه از یک مهاجم روی مسیر در معرض خطر قرار می گیرد. برخی از برنامه ها با محدود کردن مجموعه ای از CAS که به آنها اعتماد دارند یا با استفاده از گواهینامه ، می توانند مجموعه گواهینامه هایی را که می پذیرند محدود کنند.

Pinning Certificate با تهیه مجموعه ای از گواهینامه ها توسط هش از کلید عمومی ( SubjectPublicKeyInfo از گواهی X.509) انجام می شود. یک زنجیره گواهینامه فقط در صورتی معتبر است که زنجیره گواهینامه حداقل یکی از کلیدهای عمومی پین شده را داشته باشد.

توجه داشته باشید که ، هنگام استفاده از پیننگ گواهی ، همیشه باید یک کلید پشتیبان را درج کنید تا اگر مجبور شوید به کلیدهای جدید تغییر دهید یا CA را تغییر دهید (هنگام پین کردن به گواهی CA یا واسطه آن CA) ، اتصال برنامه شما بی تأثیر است. در غیر این صورت ، برای بازگرداندن اتصال باید به روزرسانی را به برنامه فشار دهید.

علاوه بر این ، می توان زمان انقضا را برای پین ها تعیین کرد که پس از آن پیننگ انجام نمی شود. این به جلوگیری از مشکلات اتصال در برنامه هایی که به روز نشده اند کمک می کند. با این حال ، تعیین زمان انقضا بر روی پین ها ممکن است مهاجمان را قادر سازد تا گواهینامه های پین شده شما را دور بزنند.

گزیده های زیر نحوه پین ​​گواهینامه ها را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

پیکربندی رفتار وراثت

مقادیر تنظیم نشده در یک پیکربندی خاص به ارث می رسند. این رفتار در حالی که پرونده پیکربندی را قابل خواندن نگه می دارد ، پیکربندی های پیچیده تری را امکان پذیر می کند.

به عنوان مثال ، مقادیر تنظیم نشده در یک domain-config از domain-config والدین ، ​​در صورت تو در تو ، یا از base-config ، در صورتی گرفته می شوند. مقادیر تنظیم نشده در base-config از مقادیر پیش فرض پلتفرم استفاده می کنند.

به عنوان مثال ، موردی را در نظر بگیرید که تمام اتصالات به زیر دامنه های example.com باید از مجموعه سفارشی CAS استفاده کنند. علاوه بر این ، ترافیک ClearText به این دامنه ها مجاز است به جز هنگام اتصال به secure.example.com . با لانه سازی پیکربندی برای secure.example.com در داخل trust-anchors به عنوان example.com .

گزیده های زیر نشان می دهد که چگونه این لانه سازی در res/xml/network_security_config.xml به نظر می رسد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

قالب پرونده پیکربندی

ویژگی پیکربندی امنیت شبکه از قالب پرونده XML استفاده می کند. ساختار کلی پرونده در نمونه کد زیر نشان داده شده است:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>

بخش های زیر نحو و سایر جزئیات قالب پرونده را شرح می دهد.

<network-security-config>

می تواند حاوی:
0 یا 1 از <base-config> >
هر تعداد <domain-config>
0 یا 1 از <debug-overrides>

<Sease-config>

نحو:
<base-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</base-config>
می تواند حاوی:
<trust-anchors> <certificateTransparency>
توضیحات:
پیکربندی پیش فرض استفاده شده توسط تمام اتصالات آنها که مقصد آن توسط یک domain-config پوشانده نشده است.

هر مقداری که تنظیم نشده است از مقادیر پیش فرض پلتفرم استفاده کنید.

پیکربندی پیش فرض برای برنامه های هدفمند Android 9 (API سطح 28) و بالاتر به شرح زیر است:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش فرض برای برنامه های هدفمند Android 7.0 (سطح API 24) به Android 8.1 (سطح API 27) به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش فرض برای برنامه های هدفمند Android 6.0 (API سطح 23) و پایین به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<Omain-Config>

نحو:
<domain-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</domain-config>
می تواند حاوی:
1 یا بیشتر <domain>
0 یا 1 <certificateTransparency>
0 یا 1 <trust-anchors>
0 یا 1 <pin-set>
هر تعداد از تو <domain-config> تو
توضیحات:
پیکربندی مورد استفاده برای اتصالات به مقصد خاص ، همانطور که توسط عناصر domain تعریف شده است.

توجه داشته باشید که اگر چندین عنصر domain-config یک مقصد را پوشش دهد ، از پیکربندی با خاص ترین (طولانی ترین) قانون دامنه تطبیق استفاده می شود.

<دامنه>

نحو:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
صفات:
includeSubdomains
اگر "true" ، این قانون دامنه با دامنه و کلیه زیر دامنه ها ، از جمله زیر دامنه های زیر دامنه ها مطابقت دارد. در غیر این صورت ، این قانون فقط در مورد مسابقات دقیق اعمال می شود.

<CertificateTransParency>

نحو:
<certificateTransparency enabled=["true" | "false"]/>
توضیحات:
در صورت true ، برنامه برای تأیید گواهینامه ها از گزارش های شفافیت گواهی استفاده می کند. هنگامی که یک برنامه از گواهینامه خود (یا فروشگاه کاربر) استفاده می کند ، به احتمال زیاد این گواهی عمومی نیست و بنابراین با استفاده از شفافیت گواهی قابل اثبات نیست. به طور پیش فرض ، تأیید برای این موارد غیرفعال است. هنوز هم می توان با استفاده از <certificateTransparency enabled="true"/> در پیکربندی دامنه ، تأیید را مجبور کرد. برای هر <domain-config> ، ارزیابی از این دستور پیروی می کند:
  1. در صورت فعال بودن certificateTransparency ، تأیید را فعال کنید.
  2. اگر هر <trust-anchors> "user" یا درون خطی است (یعنی "@raw/cert.pem" ) ، تأیید را غیرفعال کنید.
  3. در غیر این صورت ، به پیکربندی ارثی اعتماد کنید.

<اشکال زدایی بیش از حد>

نحو:
<debug-overrides>
    ...
</debug-overrides>
می تواند حاوی:
0 یا 1 <trust-anchors>
توضیحات:
هنگام استفاده از Android: اشکال زدایی "true" است ، که به طور معمول در مورد ساختهای غیر انتشار تولید شده توسط IDES و ابزارهای ساخت وجود دارد. مجریان اعتماد مشخص شده در debug-overrides به همه تنظیمات دیگر اضافه می شوند و هنگامی که زنجیره گواهی سرور از یکی از این لنگرهای اعتماد فقط اشکال زدایی استفاده می کند ، پیننگ گواهی انجام نمی شود. اگر Android: Debuggable "false" باشد ، این بخش کاملاً نادیده گرفته می شود.

<Trust-anchors>

نحو:
<trust-anchors>
...
</trust-anchors>
می تواند حاوی:
هر تعداد <certificates> گواهی>
توضیحات:
مجموعه ای از لنگرهای اعتماد برای اتصالات امن.

<گواهی ها>

نحو:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
توضیحات:
مجموعه ای از گواهینامه های X.509 برای عناصر trust-anchors .
صفات:
src
منبع گواهینامه های CA. هر گواهی می تواند یکی از موارد زیر باشد:
  • شناسه منبع خام با اشاره به پرونده ای حاوی گواهینامه های X.509. گواهینامه ها باید با فرمت DER یا PEM رمزگذاری شوند. در مورد گواهینامه های PEM ، پرونده نباید حاوی داده های غیر PEM اضافی مانند نظرات باشد.
  • "system" برای گواهینامه های CA سیستم از پیش نصب شده
  • "user" برای گواهینامه های CA اضافه شده توسط کاربر
overridePins

مشخص می کند که آیا CA از این منبع بای پس از منبع Pinning است یا خیر. اگر "true" ، پیننگ روی زنجیرهای گواهی انجام نمی شود که توسط یکی از CAS از این منبع امضا شده است. این می تواند برای اشکال زدایی CAS یا آزمایش حملات مردانه به ترافیک امن برنامه شما مفید باشد.

پیش فرض "false" است ، مگر اینکه در یک عنصر debug-overrides مشخص شده باشد ، در این صورت پیش فرض "true" است.

<Tin-set>

نحو:
<pin-set expiration="date">
...
</pin-set>
می تواند حاوی:
هر تعداد <pin>
توضیحات:
مجموعه ای از پین های کلید عمومی. برای اعتماد به یک ارتباط ایمن ، یکی از کلیدهای عمومی در زنجیره اعتماد باید در مجموعه پین ​​باشد. برای قالب پین به <pin> مراجعه کنید.
صفات:
expiration
تاریخ ، در قالب yyyy-MM-dd ، که پین ​​ها در آن منقضی می شوند ، بنابراین پین کردن را غیرفعال می کنند. اگر ویژگی تنظیم نشده باشد ، پین ها منقضی نمی شوند.

انقضا به جلوگیری از مشکلات اتصال در برنامه هایی که به روزرسانی در مجموعه پین ​​خود نمی رسند ، کمک می کند ، مانند زمانی که کاربر به روزرسانی های برنامه را غیرفعال می کند.

<in>

نحو:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
صفات:
digest
الگوریتم Digest که برای تولید پین استفاده می شود. در حال حاضر ، فقط "SHA-256" پشتیبانی می شود.
،

ویژگی پیکربندی امنیت شبکه به شما امکان می دهد تنظیمات امنیتی شبکه برنامه خود را در یک فایل پیکربندی ایمن و اعلانی بدون تغییر کد برنامه تنظیم کنید. این تنظیمات را می توان برای دامنه های خاص و برای یک برنامه خاص پیکربندی کرد. قابلیت های اصلی این ویژگی عبارتند از:

  • مجریان اعتماد سفارشی: به مقامات گواهینامه (CA) برای اتصالات امن یک برنامه اعتماد کنید. به عنوان مثال ، اعتماد به گواهینامه های خاص خود امضا شده یا محدود کردن مجموعه ای از CA های عمومی که برنامه به آن اعتماد دارد.
  • Overrides فقط اشکال زدایی: با خیال راحت اتصالات امن در یک برنامه بدون خطر اضافه شده به پایگاه نصب شده.
  • ClearText Traffic Opt-Out: از برنامه ها در برابر استفاده تصادفی از ترافیک ClearText (رمزگذاری نشده) محافظت کنید.
  • شفافیت CERTIFICATE OPT-IN: اتصالات امن یک برنامه را برای استفاده از گواهینامه های ورود به سیستم محدود کنید.
  • Pinning Certificate: اتصال امن یک برنامه را به گواهینامه های خاص محدود کنید.

یک فایل پیکربندی امنیتی شبکه اضافه کنید

ویژگی پیکربندی امنیت شبکه از یک فایل XML استفاده می کند که در آن تنظیمات برنامه خود را مشخص می کنید. برای اشاره به این پرونده ، باید یک ورودی را در مانیفست برنامه خود قرار دهید. گزیده کد زیر از یک مانیفست نحوه ایجاد این مطلب را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

CAS قابل اعتماد را سفارشی کنید

ممکن است بخواهید برنامه شما به جای پیش فرض پلتفرم ، به مجموعه سفارشی CAS اعتماد کند. شایع ترین دلایل این امر عبارتند از:

  • اتصال به یک میزبان با یک CA سفارشی ، مانند CA که به خودی خود امضا شده یا در داخل یک شرکت صادر می شود.
  • محدود کردن مجموعه CAS فقط به CAS شما به جای هر CA از پیش نصب شده به آن اعتماد دارید.
  • اعتماد به CA های اضافی که در سیستم گنجانده نشده است.

به طور پیش فرض ، اتصالات ایمن (با استفاده از پروتکل هایی مانند TLS و HTTPS) از همه برنامه ها به CAS سیستم از پیش نصب شده اعتماد می کنند ، و برنامه هایی که Android 6.0 (API سطح 23) را هدف قرار می دهند و پایین نیز به طور پیش فرض به فروشگاه CA اضافه شده کاربر اعتماد می کنند. شما می توانید اتصالات برنامه خود را با استفاده از base-config (برای سفارشی سازی گسترده برنامه) یا domain-config (برای سفارشی سازی در هر دامنه) سفارشی کنید.

یک CA سفارشی را پیکربندی کنید

ممکن است بخواهید به میزبان متصل شوید که از یک گواهی SSL خود امضا شده یا به میزبان استفاده می کند که گواهی SSL توسط یک CA غیر عمومی که به آن اعتماد دارید صادر می شود ، مانند CA داخلی شرکت شما. گزیده کد زیر نحوه پیکربندی برنامه خود را برای CA سفارشی در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

گواهی CA خود امضا شده یا غیر عمومی را با فرمت PEM یا DER اضافه کنید تا res/raw/my_ca .

مجموعه CAS قابل اعتماد را محدود کنید

اگر نمی خواهید برنامه شما به تمام CA های مورد اعتماد سیستم اعتماد کند ، در عوض می توانید مجموعه ای از CAS را برای اعتماد به نفس مشخص کنید. این برنامه را از گواهینامه های کلاهبرداری صادر شده توسط سایر CAS محافظت می کند.

پیکربندی برای محدود کردن مجموعه CAS قابل اعتماد شبیه به اعتماد به یک CA سفارشی برای یک دامنه خاص است به جز اینکه چندین CA در منبع ارائه شده است. گزیده کد زیر نشان می دهد که چگونه می توان مجموعه برنامه های مورد اعتماد خود را در res/xml/network_security_config.xml محدود کرد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

CA قابل اعتماد ، در قالب PEM یا DER ، به res/raw/trusted_roots اضافه کنید. توجه داشته باشید که اگر از فرمت PEM استفاده می کنید ، پرونده فقط باید حاوی داده های PEM باشد و متن اضافی نداشته باشد. همچنین می توانید به جای یک ، چندین عناصر <certificates> را ارائه دهید.

به CAS اضافی اعتماد کنید

ممکن است بخواهید برنامه شما به CA های اضافی که به سیستم اعتماد ندارند اعتماد کند ، مانند اینکه سیستم هنوز CA را شامل نمی شود یا CA الزامات لازم برای ورود در سیستم Android را برآورده نمی کند. می توانید با استفاده از کد مانند گزیده زیر ، چندین منبع گواهینامه را برای پیکربندی در res/xml/network_security_config.xml مشخص کنید.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>

CAS را برای اشکال زدایی پیکربندی کنید

هنگام اشکال زدایی برنامه ای که از طریق HTTPS متصل می شود ، ممکن است بخواهید به یک سرور توسعه محلی متصل شوید که گواهی SSL را برای سرور تولید شما ندارد. برای پشتیبانی از این بدون هیچ گونه اصلاح در کد برنامه خود ، می توانید CAS فقط اشکال زدایی را که فقط در هنگام Android قابل اعتماد است ، مشخص کنید: با استفاده debug-overrides true است. به طور معمول ، IDES و Build Tools این پرچم را به طور خودکار برای ساختهای غیر انتشار تنظیم می کنند.

این ایمن تر از کد مشروط معمول است زیرا ، به عنوان یک احتیاط امنیتی ، فروشگاه های برنامه برنامه هایی را که اشکال زدایی قابل توجه دارند ، نمی پذیرند.

گزیده های زیر نحوه مشخص کردن CAS فقط اشکال زدایی در res/xml/network_security_config.xml را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

از شفافیت گواهی استفاده کنید

توجه: پشتیبانی شفافیت گواهی فقط از Android 16 (سطح API 36) در دسترس است.

شفافیت گواهینامه (CT ، RFC 6962 ) یک استاندارد اینترنتی است که برای تقویت امنیت گواهی های دیجیتال طراحی شده است. این امر به CA نیاز دارد تا کلیه گواهینامه های صادر شده را به یک گزارش عمومی ارسال کند که آنها را ثبت می کند و شفافیت و پاسخگویی را در فرآیند صدور گواهی افزایش می دهد.

CT با حفظ سابقه قابل اثبات از کلیه گواهینامه ها ، باعث می شود که بازیگران مخرب جعل گواهینامه ها یا CAS را به اشتباه صادر کنند. این امر به محافظت از کاربران در برابر حملات میانه و سایر تهدیدهای امنیتی کمک می کند. برای اطلاعات بیشتر ، توضیحات مربوط به شفافیت را ببینید. برای کسب اطلاعات بیشتر در مورد انطباق CT در Android ، به خط مشی CT Android مراجعه کنید.

به طور پیش فرض ، گواهینامه ها بدون در نظر گرفتن اینکه در یک گزارش CT وارد سیستم شده اند ، پذیرفته می شوند. برای اطمینان از اتصال برنامه شما فقط به مقصد با گواهینامه هایی که در یک ورود به سیستم CT وارد شده اند ، می توانید به این ویژگی یا در سطح جهانی یا بر اساس هر دامنه انتخاب کنید .

از ترافیک ClearText خودداری کنید

توجه: راهنمایی در این بخش فقط مربوط به برنامه هایی است که Android 8.1 (API سطح 27) یا پایین را هدف قرار می دهند. با شروع با Android 9 (API سطح 28) ، پشتیبانی ClearText به طور پیش فرض غیرفعال می شود.

اگر قصد دارید برنامه خود را با استفاده از تنها اتصالات ایمن به مقصد متصل کنید ، می توانید از پشتیبانی از ClearText (با استفاده از پروتکل بدون رمزگذاری HTTP به جای HTTPS) به آن مقصد خودداری کنید. این گزینه به دلیل تغییر در URL های ارائه شده توسط منابع خارجی مانند سرورهای پس زمینه ، به جلوگیری از رگرسیون تصادفی در برنامه ها کمک می کند. برای اطلاعات بیشتر به NetworkSecurityPolicy.isCleartextTrafficPermitted() مراجعه کنید.

به عنوان مثال ، ممکن است شما بخواهید برنامه شما اطمینان حاصل کند که اتصالات برای secure.example.com example.com همیشه از طریق HTTPS برای محافظت از ترافیک حساس از شبکه های خصمانه انجام می شود.

گزیده های زیر نحوه انتخاب از ClearText در res/xml/network_security_config.xml را نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

گواهینامه های پین

به طور معمول ، یک برنامه به همه CAS از پیش نصب شده اعتماد دارد. اگر هر یک از این CA ها یک گواهی کلاهبرداری صادر می کردند ، این برنامه از یک مهاجم روی مسیر در معرض خطر قرار می گیرد. برخی از برنامه ها با محدود کردن مجموعه ای از CAS که به آنها اعتماد دارند یا با استفاده از گواهینامه ، می توانند مجموعه گواهینامه هایی را که می پذیرند محدود کنند.

Pinning Certificate با تهیه مجموعه ای از گواهینامه ها توسط هش از کلید عمومی ( SubjectPublicKeyInfo از گواهی X.509) انجام می شود. یک زنجیره گواهینامه فقط در صورتی معتبر است که زنجیره گواهینامه حداقل یکی از کلیدهای عمومی پین شده را داشته باشد.

توجه داشته باشید که ، هنگام استفاده از پیننگ گواهی ، همیشه باید یک کلید پشتیبان را درج کنید تا اگر مجبور شوید به کلیدهای جدید تغییر دهید یا CA را تغییر دهید (هنگام پین کردن به گواهی CA یا واسطه آن CA) ، اتصال برنامه شما بی تأثیر است. در غیر این صورت ، برای بازگرداندن اتصال باید به روزرسانی را به برنامه فشار دهید.

علاوه بر این ، می توان زمان انقضا را برای پین ها تعیین کرد که پس از آن پیننگ انجام نمی شود. این به جلوگیری از مشکلات اتصال در برنامه هایی که به روز نشده اند کمک می کند. با این حال ، تعیین زمان انقضا بر روی پین ها ممکن است مهاجمان را قادر سازد تا گواهینامه های پین شده شما را دور بزنند.

گزیده های زیر نحوه پین ​​گواهینامه ها را در res/xml/network_security_config.xml نشان می دهد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

پیکربندی رفتار وراثت

مقادیر تنظیم نشده در یک پیکربندی خاص به ارث می رسند. این رفتار در حالی که پرونده پیکربندی را قابل خواندن نگه می دارد ، پیکربندی های پیچیده تری را امکان پذیر می کند.

به عنوان مثال ، مقادیر تنظیم نشده در یک domain-config از domain-config والدین ، ​​در صورت تو در تو ، یا از base-config ، در صورتی گرفته می شوند. مقادیر تنظیم نشده در base-config از مقادیر پیش فرض پلتفرم استفاده می کنند.

به عنوان مثال ، موردی را در نظر بگیرید که تمام اتصالات به زیر دامنه های example.com باید از مجموعه سفارشی CAS استفاده کنند. علاوه بر این ، ترافیک ClearText به این دامنه ها مجاز است به جز هنگام اتصال به secure.example.com . با لانه سازی پیکربندی برای secure.example.com در داخل trust-anchors به عنوان example.com .

گزیده های زیر نشان می دهد که چگونه این لانه سازی در res/xml/network_security_config.xml به نظر می رسد:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

قالب پرونده پیکربندی

ویژگی پیکربندی امنیت شبکه از قالب پرونده XML استفاده می کند. ساختار کلی پرونده در نمونه کد زیر نشان داده شده است:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>

بخش های زیر نحو و سایر جزئیات قالب پرونده را شرح می دهد.

<network-security-config>

می تواند حاوی:
0 یا 1 از <base-config> >
هر تعداد <domain-config>
0 یا 1 از <debug-overrides>

<Sease-config>

نحو:
<base-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</base-config>
می تواند حاوی:
<trust-anchors> <certificateTransparency>
توضیحات:
پیکربندی پیش فرض استفاده شده توسط تمام اتصالات آنها که مقصد آن توسط یک domain-config پوشانده نشده است.

هر مقداری که تنظیم نشده است از مقادیر پیش فرض پلتفرم استفاده کنید.

پیکربندی پیش فرض برای برنامه های هدفمند Android 9 (API سطح 28) و بالاتر به شرح زیر است:

<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش فرض برای برنامه های هدفمند Android 7.0 (سطح API 24) به Android 8.1 (سطح API 27) به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>

پیکربندی پیش فرض برای برنامه های هدفمند Android 6.0 (API سطح 23) و پایین به شرح زیر است:

<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<Omain-Config>

نحو:
<domain-config cleartextTrafficPermitted=["true" | "false"]>
    ...
</domain-config>
می تواند حاوی:
1 یا بیشتر <domain>
0 یا 1 <certificateTransparency>
0 یا 1 <trust-anchors>
0 یا 1 <pin-set>
هر تعداد از تو <domain-config> تو
توضیحات:
پیکربندی مورد استفاده برای اتصالات به مقصد خاص ، همانطور که توسط عناصر domain تعریف شده است.

توجه داشته باشید که اگر چندین عنصر domain-config یک مقصد را پوشش دهد ، از پیکربندی با خاص ترین (طولانی ترین) قانون دامنه تطبیق استفاده می شود.

<دامنه>

نحو:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
صفات:
includeSubdomains
اگر "true" ، این قانون دامنه با دامنه و کلیه زیر دامنه ها ، از جمله زیر دامنه های زیر دامنه ها مطابقت دارد. در غیر این صورت ، این قانون فقط در مورد مسابقات دقیق اعمال می شود.

<CertificateTransParency>

نحو:
<certificateTransparency enabled=["true" | "false"]/>
توضیحات:
در صورت true ، برنامه برای تأیید گواهینامه ها از گزارش های شفافیت گواهی استفاده می کند. هنگامی که یک برنامه از گواهینامه خود (یا فروشگاه کاربر) استفاده می کند ، به احتمال زیاد این گواهی عمومی نیست و بنابراین با استفاده از شفافیت گواهی قابل اثبات نیست. به طور پیش فرض ، تأیید برای این موارد غیرفعال است. هنوز هم می توان با استفاده از <certificateTransparency enabled="true"/> در پیکربندی دامنه ، تأیید را مجبور کرد. برای هر <domain-config> ، ارزیابی از این دستور پیروی می کند:
  1. در صورت فعال بودن certificateTransparency ، تأیید را فعال کنید.
  2. اگر هر <trust-anchors> "user" یا درون خطی است (یعنی "@raw/cert.pem" ) ، تأیید را غیرفعال کنید.
  3. در غیر این صورت ، به پیکربندی ارثی اعتماد کنید.

<اشکال زدایی بیش از حد>

نحو:
<debug-overrides>
    ...
</debug-overrides>
می تواند حاوی:
0 یا 1 <trust-anchors>
توضیحات:
هنگام استفاده از Android: اشکال زدایی "true" است ، که به طور معمول در مورد ساختهای غیر انتشار تولید شده توسط IDES و ابزارهای ساخت وجود دارد. مجریان اعتماد مشخص شده در debug-overrides به همه تنظیمات دیگر اضافه می شوند و هنگامی که زنجیره گواهی سرور از یکی از این لنگرهای اعتماد فقط اشکال زدایی استفاده می کند ، پیننگ گواهی انجام نمی شود. اگر Android: Debuggable "false" باشد ، این بخش کاملاً نادیده گرفته می شود.

<Trust-anchors>

نحو:
<trust-anchors>
...
</trust-anchors>
می تواند حاوی:
هر تعداد <certificates> گواهی>
توضیحات:
مجموعه ای از لنگرهای اعتماد برای اتصالات امن.

<گواهی ها>

نحو:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
توضیحات:
مجموعه ای از گواهینامه های X.509 برای عناصر trust-anchors .
صفات:
src
منبع گواهینامه های CA. هر گواهی می تواند یکی از موارد زیر باشد:
  • شناسه منبع خام با اشاره به پرونده ای حاوی گواهینامه های X.509. گواهینامه ها باید با فرمت DER یا PEM رمزگذاری شوند. در مورد گواهینامه های PEM ، پرونده نباید حاوی داده های غیر PEM اضافی مانند نظرات باشد.
  • "system" برای گواهینامه های CA سیستم از پیش نصب شده
  • "user" برای گواهینامه های CA اضافه شده توسط کاربر
overridePins

مشخص می کند که آیا CA از این منبع بای پس از منبع Pinning است یا خیر. اگر "true" ، پیننگ روی زنجیرهای گواهی انجام نمی شود که توسط یکی از CAS از این منبع امضا شده است. این می تواند برای اشکال زدایی CAS یا آزمایش حملات مردانه به ترافیک امن برنامه شما مفید باشد.

پیش فرض "false" است ، مگر اینکه در یک عنصر debug-overrides مشخص شده باشد ، در این صورت پیش فرض "true" است.

<Tin-set>

نحو:
<pin-set expiration="date">
...
</pin-set>
می تواند حاوی:
هر تعداد <pin>
توضیحات:
مجموعه ای از پین های کلید عمومی. برای اعتماد به یک ارتباط ایمن ، یکی از کلیدهای عمومی در زنجیره اعتماد باید در مجموعه پین ​​باشد. برای قالب پین به <pin> مراجعه کنید.
صفات:
expiration
تاریخ ، در قالب yyyy-MM-dd ، که پین ​​ها در آن منقضی می شوند ، بنابراین پین کردن را غیرفعال می کنند. اگر ویژگی تنظیم نشده باشد ، پین ها منقضی نمی شوند.

انقضا به جلوگیری از مشکلات اتصال در برنامه هایی که به روزرسانی در مجموعه پین ​​خود نمی رسند ، کمک می کند ، مانند زمانی که کاربر به روزرسانی های برنامه را غیرفعال می کند.

<in>

نحو:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
صفات:
digest
الگوریتم Digest که برای تولید پین استفاده می شود. در حال حاضر ، فقط "SHA-256" پشتیبانی می شود.