直接前往內容

最常造訪的網頁

最近瀏覽的網頁

navigation

網路安全性設定

Android N 包括網路安全性設定功能,讓應用程式在安全的宣告式設定檔中即可自訂網路安全性設定,而不必修改應用程式的程式碼。 這些設定可以針對特定網域以及針對特定應用程式來設定。 此功能的主要能力如下:

新增安全性設定檔

網路安全性設定功能會使用 XML 檔案,而您為應用程式指定的設定就在此。 您必須在應用程式的宣示說明包括一個指向這個檔案的項目。 以下節錄自宣示說明的程式碼,示範如何建立此項目:

<?xml version="1.0" encoding="utf-8"?>
...
<app ...>
    <meta-data android:name="android.security.net.config"
               android:resource="@xml/network_security_config" />
    ...
</app>

自訂信任的 CA

應用程式會想要信任自訂的一組 CA,而不是平台預設的 CA。 最常見的原因如下:

根據預設,來自所有應用程式的安全連線全都信任預先安裝的系統 CA,而目標為 API 層級 23 (Android M) 和以下版本的應用程式預設也會信任使用者新增的 CA 存放區。 應用程式可以使用 base-config (針對整個應用程式自訂) 或 domain-config (針對每個網域自訂),自訂自己的連線。

設定自訂 CA

假設您想要連線的主機使用自我簽署的 SSL 憑證,或要連線的主機使用 SSL 憑證是由您信任的非公用 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>

將 PEM 或 DER 格式的自我簽署或非公用 CA 憑證新增至 res/raw/my_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>

將 PEM 或 DER 格式的信任 CA 新增至 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 憑證。 若以不修改應用程式的程式碼為前提,為了支援此動作,您可以使用 debug-overrides 來指定僅偵錯 CA,「只」有在 android:debuggabletrue 時才予以信任。 一般來說,IDE 和建置工具會為非發行版本自動設定此旗標。

因為應用程式商店採取的安全措施是,不接受標示為可偵錯的應用程式,所以這種方式會比條件式程式碼安全。

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>

退出明碼流量

打算只使用安全連線連線至目的地的應用程式,可以針對那些目的地退出支援明碼 (使用未加密的 HTTP 通訊協定,而非 HTTPS)。 此選項有助於避免應用程式由於外部來源 (例如,後端伺服器) 提供的 URL 中發生變更,而造成意外回復。 如需更多詳細資料,請參閱 NetworkSecurityPolicy.isCleartextTrafficPermitted()

例如,應用程式想要確保 的所有連線一律要透過 HTTPS 完成,以保護敏感流量不受惡意網路危害。

res/xml/network_security_config.xml

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

關聯憑證

應用程式一般會信任所有預先安裝的 CA。若這類的任何 CA 意在發行詐騙憑證,應用程式會有遭受 MiTM 攻擊的風險。 有些應用程式選擇透過限制所信任的 CA 組或關聯憑證,來限制可接受的憑證組。

憑證關聯的方法是,透過公用金鑰的雜湊 (X.509 憑證的 SubjectPublicKeyInfo) 來提供一組憑證。 只有當憑證鏈至少包含一個關聯的公用金鑰時,才是有效的憑證鏈。

請注意,使用憑證關聯時,您務必要包括備份金鑰,這樣萬一強制您切換到新的金鑰或變更 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>
    </domain-config>
</network-security-config>

設定繼承行為

繼承的值都未設定在特定設定中。此行為允許有更複雜的設定,同時保持設定檔讓人看得懂。

如果值未設定在特定項目中時,就會使用下一個更一般項目的值。 如為巢狀結構,就會從上層 domain-config 取得未在 domain-config 中設定的值,或非巢狀時,則會從 base-config 取得值。 未在 base-config 中設定的值會使用平台的預設值。

例如,假設所有連至 example.com 子網域的連線都必須使用一組自訂 CA。此外,允許明碼流量送往這些網域,但連線到 secure.example.com 時「除外」。 example.com 的設定內以巢狀方式排列 secure.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 usesCleartextTraffic=["true" | "false"]>
    ...
</base-config>
可以包含:
<trust-anchors>
描述:
連線到 domain-config 所未涵蓋的目的地時使用的預設設定。

任何未設定的值都會使用平台預設值。目標為 API 層級 24 和更新版本的應用程式預設設定:

<base-config usesCleartextTraffic="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>
目標為 API 層級 23 和以下版本的應用程式預設設定:
<base-config usesCleartextTraffic="true">
    <trust-anchors>
        <certificates src="system" />
        <certificates src="user" />
    </trust-anchors>
</base-config>

<domain-config>

語法:
<domain-config usesCleartextTraffic=["true" | "false"]>
    ...
</domain-config>
可以包含:
1 或更多個 <domain>
0 或 1 個 <trust-anchors>
0 或 1 個 <pin-set>
任何數目的巢狀 <domain-config>
描述
依照 domain 元素所定義,連線至特定目的地時使用的設定。

請注意,如有多個 domain-config 元素涵蓋同一個目的地,則會使用含有最明確 (最長) 比對網域規則的設定。

<domain>

語法:
<domain includeSubdomains=["true" | "false"]>example.com</domain>
屬性:
includeSubdomains
如為 "true",表示此網域規則會比對網域和所有子網域,包括子網域的子網域在內,反之此規則只會套用到完全相符者。
描述:

<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>

語法:
<certificates src=["system" | "user" | "raw resource"]
              overridePins=["true" | "false"] />
描述:
可供 trust-anchors 元素使用的 X.509 憑證組。
屬性:
src
CA 憑證的來源,可以是其中一個原始資源識別碼,其指向含有 X.509 憑證的檔案。
  • 憑證必須以 DER 或 PEM 格式編碼。如為 PEM 憑證,檔案中「不可」包含非 PEM 的額外資料,例如註解。
  • "system" 代表預先安裝的系統 CA 憑證
  • "user" 代表使用者新增的 CA 憑證
overridePins

指定來自此來源的 CA 是否要略過憑證關聯。如為 "true",憑證鏈的鏈結若經過此來源的其中一個 CA,就不會執行關聯。 這對偵錯 CA 會很實用,或支援讓使用者 MiTM 應用程式的安全流量。

預設為 "false",除非您在 debug-overrides 元素中指定,而那種情況的預設為 "true"

<pin-set>

語法:
<pin-set expiration="date">
...
</pin-set>
可以包含:
任何數目的 <pin>
描述:
一組公用金鑰關聯。信任鏈中的其中一個公用金鑰必須要在這組關聯中,才是可信任的安全連線。 如需關聯的格式,請參閱 <pin>
屬性:
expiration
到期之後就會停用關聯的日期,格式為 yyyy-MM-dd。 如果未設定屬性,關聯就不會到期。

到期有助於避免因使用者停用應用程式更新,而無法取得關聯組更新的應用程式發生連線問題。

<pin>

語法:
<pin digest=["SHA-256"]>base64 encoded digest of X.509
    SubjectPublicKeyInfo (SPKI)</pin>
屬性:
digest
用來產生關聯的摘要演算法。目前僅支援 "SHA-256"
本網站使用 Cookie 儲存你在此指定的語言和顯示選項偏好設定。

掌握有關 Android 開發人員的最新消息和實用訣竅,協助你製作最受歡迎的 Google Play 內容。

* 必填欄位

訂閱成功!

在 WeChat 上追蹤 Google Developers

你要以瀏覽這個網站嗎?

你要求以顯示這個網頁,但你為此網站指定的語言偏好設定為

是否要變更語言偏好設定並改用瀏覽網站?稍後如要變更語言偏好設定,請利用位在每個網頁最下方的語言選單來調整設定。

你的 API 層級必須達 以上才能存取這個級別

本說明文件已隱藏,因為你為該文件選取的 API 層級為 。使用左側導覽列上方的選取工具即可變更說明文件的 API 層級。

如需進一步瞭解如何為應用程式指定 API 層級的相關資訊,請參閱 Supporting Different Platform Versions (支援不同的平台版本) (英文)。

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)