ฟีเจอร์การกำหนดค่าความปลอดภัยของเครือข่ายช่วยให้คุณปรับแต่งการตั้งค่าความปลอดภัยของเครือข่ายของแอปได้ในไฟล์การกำหนดค่าที่ปลอดภัยและประกาศได้โดยไม่ต้องแก้ไขโค้ดของแอป คุณกำหนดค่าการตั้งค่าเหล่านี้สำหรับโดเมนที่เฉพาะเจาะจงและสำหรับแอปที่เฉพาะเจาะจงได้ ความสามารถหลักของฟีเจอร์นี้มีดังนี้
- Trust Anchor ที่กำหนดเอง: กำหนดผู้ออกใบรับรอง (CA) ที่เชื่อถือได้สำหรับการเชื่อมต่อที่ปลอดภัยของแอป เช่น การเชื่อถือใบรับรองที่ลงนามด้วยตนเองที่เฉพาะเจาะจงหรือ การจำกัดชุด CA สาธารณะที่แอปเชื่อถือ
- การลบล้างเฉพาะการแก้ไขข้อบกพร่อง: แก้ไขข้อบกพร่องการเชื่อมต่อที่ปลอดภัยในแอปได้อย่างปลอดภัยโดยไม่มีความเสี่ยงเพิ่มเติมต่อ ฐานการติดตั้ง
- การเลือกไม่ใช้การรับส่งข้อมูลแบบข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัส: ปกป้องแอปจากการใช้งานการรับส่งข้อมูลแบบข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัส (ไม่ได้เข้ารหัส) โดยไม่ตั้งใจ
- ความโปร่งใสของใบรับรอง: จำกัดการเชื่อมต่อที่ปลอดภัยของแอปให้ใช้ใบรับรองที่บันทึกไว้ซึ่งพิสูจน์ได้
- การปักหมุดใบรับรอง: จำกัดการเชื่อมต่อที่ปลอดภัยของแอปกับใบรับรองที่เฉพาะเจาะจง
เพิ่มไฟล์การกำหนดค่าการรักษาความปลอดภัยเครือข่าย
ฟีเจอร์การกำหนดค่าความปลอดภัยเครือข่ายใช้ไฟล์ XML ที่คุณระบุการตั้งค่าสำหรับ แอปของคุณ คุณต้องรวมรายการในไฟล์ Manifest ของแอปเพื่อชี้ไปยังไฟล์นี้ ข้อมูลโค้ดต่อไปนี้จากไฟล์ Manifest แสดงวิธีสร้างรายการนี้
<?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 แบบ Self-signed หรือโฮสต์ที่
ผู้ออกใบรับรอง 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 ที่ลงนามด้วยตนเองหรือ 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 และเครื่องมือบิลด์จะตั้งค่า
แฟล็กนี้โดยอัตโนมัติสำหรับการบิลด์ที่ไม่ใช่เวอร์ชันที่เผยแพร่
วิธีนี้ปลอดภัยกว่าโค้ดแบบมีเงื่อนไขทั่วไป เนื่องจาก App Store ไม่ยอมรับแอปที่ทำเครื่องหมายว่าแก้ไขข้อบกพร่องได้เพื่อเป็นการป้องกันด้านความปลอดภัย
ข้อมูลที่ตัดตอนมาด้านล่างแสดงวิธีระบุ 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) เป็นมาตรฐานอินเทอร์เน็ต ที่ออกแบบมาเพื่อเพิ่มความปลอดภัยของใบรับรองดิจิทัล โดยกำหนดให้ CA ต้องส่งใบรับรองที่ออกทั้งหมดไปยังบันทึกสาธารณะที่บันทึกใบรับรองเหล่านั้น ซึ่งจะช่วยเพิ่มความโปร่งใสและความรับผิดชอบในกระบวนการออกใบรับรอง
การเก็บรักษาบันทึกที่ตรวจสอบได้ของใบรับรองทั้งหมดทำให้ผู้ไม่ประสงค์ดีปลอมแปลงใบรับรองหรือ CA ออกใบรับรองโดยไม่ได้ตั้งใจได้ยากขึ้นอย่างมาก ซึ่งจะช่วยปกป้อง ผู้ใช้จากการโจมตีแบบแทรกกลางการสื่อสารและภัยคุกคามด้านความปลอดภัยอื่นๆ ดูข้อมูลเพิ่มเติมได้ที่คำอธิบายใน transparency.dev ดูข้อมูลเพิ่มเติมเกี่ยวกับ การปฏิบัติตามข้อกำหนด CT ใน Android ได้ที่นโยบาย CT ของ Android
ลักษณะการทำงานเริ่มต้นของความโปร่งใสของใบรับรองจะขึ้นอยู่กับระดับ API ดังนี้
- เริ่มตั้งแต่ Android 17 (ระดับ API 37) เป็นต้นไป ระบบจะเปิดใช้ความโปร่งใสของใบรับรองโดยค่าเริ่มต้น แอปสามารถเลือกไม่ใช้ฟีเจอร์ได้ทั้งทั่วโลกหรือต่อโดเมน
- ใน Android 16 (ระดับ API 36) ความโปร่งใสของใบรับรองจะปิดใช้โดยค่าเริ่มต้น แอปสามารถเลือกใช้ฟีเจอร์นี้ได้ทั้งทั่วโลกหรือตามโดเมน
- ใน Android 15 (ระดับ API 35) และต่ำกว่า ความโปร่งใสของใบรับรองจะใช้ไม่ได้
เลือกไม่ใช้ความโปร่งใสของใบรับรอง
หมายเหตุ: สำหรับ Android 16 (API ระดับ 36) ให้เลือกใช้ความโปร่งใสของใบรับรองโดยการตั้งค่า
<certificateTransparency enabled="true"/> (ปิดใช้โดยค่าเริ่มต้น)
หากต้องการให้แอปเชื่อมต่อกับปลายทางโดยไม่ต้องกำหนดให้บันทึกใบรับรองลงในบันทึกความโปร่งใสของใบรับรอง คุณสามารถเลือกไม่ใช้ความโปร่งใสของใบรับรองได้
ตัวอย่างเช่น คุณอาจต้องการอนุญาตให้แอปเชื่อมต่อกับ
secure.example.com
โดยไม่ต้องใช้ความโปร่งใสของใบรับรอง
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">secure.example.com</domain> <certificateTransparency enabled="false"/> </domain-config> </network-security-config>
ClientHello ที่เข้ารหัส
หมายเหตุ: การรองรับ Encrypted Client Hello จะใช้ได้ตั้งแต่ Android 17 (ระดับ API 37) ขึ้นไปเท่านั้น และกำหนดให้ไลบรารีเครือข่ายของแอปต้องรองรับ ECH การกำหนดค่าที่ระบุ ที่นี่จะมีผลก็ต่อเมื่อไลบรารีเครือข่ายใช้ ECH
ClientHello ที่เข้ารหัส (ECH, RFC 9849) คือส่วนขยายโปรโตคอล TLS ที่ออกแบบมาเพื่อเพิ่มความเป็นส่วนตัวของการเชื่อมต่อที่ปลอดภัย โดยจะเข้ารหัสส่วนที่มีความละเอียดอ่อนของแฮนด์เชค TLS เริ่มต้น ซึ่งส่วนที่สำคัญที่สุดคือช่องการระบุชื่อเซิร์ฟเวอร์ (SNI)
การเข้ารหัส SNI ด้วย ECH จะช่วยป้องกันไม่ให้ตัวกลางในเครือข่ายสังเกตชื่อโดเมนที่เฉพาะเจาะจงซึ่งไคลเอ็นต์พยายามเชื่อมต่อ ซึ่งจะช่วยป้องกันไม่ให้มีการ ลายนิ้วมือหรือการตรวจสอบผู้ใช้ตามโดเมนที่เข้าชม ซึ่งจะช่วยลดการรั่วไหลของข้อมูลส่วนตัว ที่สำคัญซึ่งมีอยู่ในแฮนด์เชค TLS มาตรฐาน
ลักษณะการทำงานเริ่มต้นของ Encrypted Client Hello จะขึ้นอยู่กับระดับ API ดังนี้
- ตั้งแต่ Android 17 (API ระดับ 37) เป็นต้นไป ระบบจะใช้ ECH ในโหมด "เปิดใช้" โดยค่าเริ่มต้น แอปสามารถเลือกไม่ใช้ฟีเจอร์หรือแก้ไขลักษณะการทำงานของฟีเจอร์ได้ทั่วโลกหรือต่อโดเมน
- ใน Android 16 (ระดับ API 36) และต่ำกว่า ECH จะไม่พร้อมใช้งาน
เลือกไม่ใช้ Encrypted Client Hello
คุณเลือกไม่ใช้ฟีเจอร์นี้ได้โดยการปิดใช้ ตัวอย่างเช่น หากต้องการปิดใช้ ECH
เมื่อเชื่อมต่อกับ disable-ech.example.com เท่านั้น แต่เปิดใช้ ECH ไว้สำหรับ
โดเมนอื่นๆ ทั้งหมด คุณสามารถใช้การกำหนดค่าต่อไปนี้
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <domainEncryption mode="enabled"/> </base-config> <domain-config> <domain includeSubdomains="true">disable-ech.example.com</domain> <domainEncryption mode="disabled"/> </domain-config> </network-security-config>
การรับส่งข้อมูลข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัส
นักพัฒนาแอปสามารถเลือกใช้หรือไม่ใช้การรับส่งข้อความที่ไม่มีการเข้ารหัส (ใช้โปรโตคอล HTTP ที่ไม่มีการเข้ารหัสแทน
HTTPS) สำหรับแอปพลิเคชันของตนได้ ดูรายละเอียดเพิ่มเติมได้ที่
NetworkSecurityPolicy.isCleartextTrafficPermitted()
ลักษณะการทำงานเริ่มต้นของการรับส่งข้อมูลข้อความธรรมดาจะขึ้นอยู่กับระดับ API ดังนี้
- ใน Android 8.1 (ระดับ API 27) ขึ้นไป ระบบจะเปิดใช้การรองรับข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัสโดยค่าเริ่มต้น แอปพลิเคชันสามารถเลือกไม่ใช้การรับส่งข้อความที่ไม่มีการเข้ารหัสเพื่อเพิ่มความปลอดภัย
- ตั้งแต่ Android 9 (ระดับ API 28) เป็นต้นไป ระบบจะปิดใช้การรองรับข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัสโดยค่าเริ่มต้น แอปพลิเคชันที่ต้องใช้การเข้าชมแบบข้อความธรรมดา (Cleartext) สามารถเลือกใช้การเข้าชมแบบข้อความธรรมดาได้
เลือกไม่ใช้การรับส่งข้อมูลแบบข้อความธรรมดา
หมายเหตุ: คำแนะนำในส่วนนี้ใช้ได้กับแอปที่กำหนดเป้าหมายเป็น Android 8.1 (API ระดับ 27) หรือต่ำกว่าเท่านั้น
หากต้องการให้แอปเชื่อมต่อกับปลายทางโดยใช้เฉพาะการเชื่อมต่อที่ปลอดภัย คุณสามารถ เลือกไม่รองรับการเข้าชมแบบข้อความธรรมดา (Cleartext) ไปยังปลายทางเหล่านั้นได้ ตัวเลือกนี้ช่วยป้องกัน การถดถอยโดยไม่ตั้งใจในแอปเนื่องจากการเปลี่ยนแปลง URL ที่ได้รับจากแหล่งที่มาภายนอก เช่น เซิร์ฟเวอร์แบ็กเอนด์
เช่น คุณอาจต้องการให้แอปตรวจสอบว่าการเชื่อมต่อกับ
secure.example.com
ดำเนินการผ่าน HTTPS เสมอเพื่อปกป้องการรับส่งข้อมูลที่มีความละเอียดอ่อนจากเครือข่ายที่เป็นอันตราย
<?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>
เลือกใช้การรับส่งข้อมูลข้อความธรรมดา
หมายเหตุ: คำแนะนำในส่วนนี้ใช้กับแอปที่กำหนดเป้าหมายเป็น Android 9 (API ระดับ 28) ขึ้นไปเท่านั้น
หากแอปต้องเชื่อมต่อกับปลายทางโดยใช้การรับส่งข้อมูลแบบข้อความธรรมดา (HTTP) คุณสามารถเลือกใช้ การรองรับข้อความธรรมดาไปยังปลายทางเหล่านั้นได้
เช่น คุณอาจต้องการอนุญาตให้แอปทำการเชื่อมต่อที่ไม่ปลอดภัยกับ insecure.example.com
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">insecure.example.com</domain> </domain-config> </network-security-config>
หากแอปต้องเลือกใช้การเข้าชมแบบข้อความธรรมดา (Cleartext) ไปยังโดเมนใดก็ตาม ให้ตั้งค่า
cleartextTrafficPermitted="true" ใน base-config โปรดทราบว่าควรหลีกเลี่ยงการกำหนดค่าที่ไม่ปลอดภัยนี้
ทุกครั้งที่ทำได้
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> </base-config> </network-security-config>
ปักหมุดใบรับรอง
โดยปกติแล้ว แอปจะเชื่อถือ CA ที่ติดตั้งไว้ล่วงหน้าทั้งหมด หาก CA เหล่านี้ออกใบรับรองที่ฉ้อโกง แอปจะมีความเสี่ยงจากผู้โจมตีที่อยู่บนเส้นทาง บางแอปเลือกที่จะจำกัด ชุดใบรับรองที่ยอมรับโดยจำกัดชุด CA ที่เชื่อถือหรือโดยการปักหมุดใบรับรอง
การปักหมุดใบรับรองทำได้โดยการระบุชุดใบรับรองตามแฮชของคีย์สาธารณะ
(SubjectPublicKeyInfo ของใบรับรอง X.509) จากนั้นเชนใบรับรองจะ
ใช้ได้ก็ต่อเมื่อเชนใบรับรองมีคีย์สาธารณะที่ปักหมุดไว้อย่างน้อย 1 รายการ
โปรดทราบว่าเมื่อใช้การปักหมุดใบรับรอง คุณควรใส่คีย์สำรองเสมอ เพื่อให้แอปยังคงเชื่อมต่อได้ตามปกติในกรณีที่ คุณต้องเปลี่ยนไปใช้คีย์ใหม่หรือเปลี่ยน 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 ที่กำหนดเอง นอกจากนี้ ยังอนุญาตการเข้าชมแบบข้อความธรรมดา (Cleartext) ไปยังโดเมนเหล่านี้ยกเว้นเมื่อเชื่อมต่อกับ 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>
การกำหนดค่า localhost
โดยทั่วไปแล้วไม่จำเป็นต้องบังคับใช้ฟีเจอร์ความปลอดภัยของเครือข่ายสำหรับการเชื่อมต่อ localhost เช่น ไม่ค่อยจำเป็นต้องใช้ความโปร่งใสของใบรับรองสำหรับการเชื่อมต่อ localhost
ตั้งแต่ Android 17 (ระดับ API 37) ขึ้นไป หากไม่ได้กำหนดค่าสำหรับ localhost ระบบจะรวมการกำหนดค่าโดยนัยไว้ด้วย โดยค่าเริ่มต้น การกำหนดค่านี้จะทำสิ่งต่อไปนี้
- อนุญาตการรับส่งข้อมูลแบบข้อความธรรมดา (Cleartext)
- ไม่บังคับใช้การตรวจสอบความโปร่งใสของใบรับรอง (CT)
- ไม่บังคับใช้การปักหมุดใบรับรอง
- มอบสิทธิ์ให้
<base-config>สำหรับจุดยึดความน่าเชื่อถือ
ระบบจะถือว่าการกำหนดค่าเป็นการกำหนดเป้าหมาย localhost หากโดเมนมีลักษณะดังนี้
localhostip6-localhostหรือ-
ที่อยู่ IP ที่เป็นตัวเลขและ
InetAddress.isLoopback()คือtrue(เช่น127.0.0.1หรือ[::1])
รูปแบบไฟล์การกำหนดค่า
ฟีเจอร์การกำหนดค่าความปลอดภัยเครือข่ายใช้รูปแบบไฟล์ 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>