ฟีเจอร์การกำหนดค่าความปลอดภัยของเครือข่ายช่วยให้คุณปรับแต่งการตั้งค่าความปลอดภัยของเครือข่ายของแอปได้ในไฟล์การกำหนดค่าที่ปลอดภัยและประกาศได้โดยไม่ต้องแก้ไขโค้ดของแอป คุณกำหนดค่าการตั้งค่าเหล่านี้สำหรับโดเมนที่เฉพาะเจาะจงและสำหรับแอปที่เฉพาะเจาะจงได้ ความสามารถหลักของฟีเจอร์นี้มีดังนี้
- 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
โดยค่าเริ่มต้น ระบบจะยอมรับใบรับรองไม่ว่าจะมีการบันทึกในบันทึก CT หรือไม่ก็ตาม หากต้องการ ตรวจสอบว่าแอปเชื่อมต่อเฉพาะปลายทางที่มีใบรับรองที่บันทึกไว้ในบันทึก CT คุณสามารถเลือกใช้ฟีเจอร์ได้ทั้งทั่วโลกหรือต่อโดเมน
การรับส่งข้อมูลข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัส
นักพัฒนาแอปสามารถเลือกใช้หรือไม่ใช้การรับส่งข้อความที่ไม่มีการเข้ารหัส (ใช้โปรโตคอล 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>
รูปแบบไฟล์การกำหนดค่า
ฟีเจอร์การกำหนดค่าความปลอดภัยเครือข่ายใช้รูปแบบไฟล์ 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>
- description:
-
การกำหนดค่าเริ่มต้นที่ใช้โดยการเชื่อมต่อทั้งหมดซึ่งมีปลายทางที่ไม่ได้
ครอบคลุมโดย
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>
<domain-config>
- ไวยากรณ์:
-
<domain-config cleartextTrafficPermitted=["true" | "false"]> ... </domain-config>
- อาจมีข้อมูลต่อไปนี้
-
<domain>
ตั้งแต่ 1 รายการขึ้นไป
0 หรือ 1<certificateTransparency>
0 หรือ 1<trust-anchors>
0 หรือ 1<pin-set>
<domain-config>
ที่ซ้อนกันได้ไม่จำกัด
- description:
- การกำหนดค่าที่ใช้สำหรับการเชื่อมต่อกับปลายทางที่เฉพาะเจาะจงตามที่กำหนดโดยองค์ประกอบ
domain
โปรดทราบว่าหากองค์ประกอบ
domain-config
หลายรายการครอบคลุมปลายทาง ระบบจะใช้การกำหนดค่าที่มีกฎการจับคู่โดเมนที่เจาะจงที่สุด (ยาวที่สุด)
<โดเมน>
- ไวยากรณ์:
-
<domain includeSubdomains=["true" | "false"]>example.com</domain>
- แอตทริบิวต์
-
-
includeSubdomains
-
หาก
"true"
กฎโดเมนนี้จะตรงกับโดเมนและโดเมนย่อยทั้งหมด รวมถึงโดเมนย่อยของโดเมนย่อย มิเช่นนั้น กฎจะมีผลกับ การจับคู่ที่ตรงกันทุกประการเท่านั้น
-
<certificateTransparency>
- ไวยากรณ์:
-
<certificateTransparency enabled=["true" | "false"]/>
- description:
-
หาก
true
แอปจะใช้บันทึกความโปร่งใสของใบรับรองเพื่อตรวจสอบ ใบรับรอง เมื่อแอปใช้ใบรับรองของตัวเอง (หรือที่เก็บของผู้ใช้) มีแนวโน้มว่า ใบรับรองจะไม่ใช่แบบสาธารณะและตรวจสอบไม่ได้โดยใช้ความโปร่งใสของใบรับรอง โดย ค่าเริ่มต้น ระบบจะปิดใช้การยืนยันสำหรับกรณีเหล่านี้ คุณยังคงบังคับให้มีการยืนยันได้โดยใช้<certificateTransparency enabled="true"/>
ในการกำหนดค่าโดเมน สำหรับการประเมิน<domain-config>
แต่ละครั้ง จะดำเนินการตามลำดับต่อไปนี้- หากเปิดใช้
certificateTransparency
ให้เปิดใช้การยืนยัน -
หาก
<trust-anchors>
เป็น"user"
หรืออยู่ในบรรทัด (เช่น"@raw/cert.pem"
) ให้ปิดใช้ การยืนยัน - หรือใช้การกำหนดค่าที่รับช่วง
- หากเปิดใช้
<debug-overrides>
- ไวยากรณ์:
-
<debug-overrides> ... </debug-overrides>
- อาจมีข้อมูลต่อไปนี้
-
0 หรือ 1
<trust-anchors>
- description:
-
การลบล้างที่จะใช้เมื่อ android:debuggable
เป็น
"true"
ซึ่งโดยปกติแล้วจะเป็นกรณีสำหรับการบิลด์ที่ไม่ใช่รุ่นที่เผยแพร่ ที่ IDE และเครื่องมือบิลด์สร้างขึ้น ระบบจะเพิ่ม Trust Anchor ที่ระบุในdebug-overrides
ลงในการกำหนดค่าอื่นๆ ทั้งหมด และจะไม่ทำการปักหมุดใบรับรอง เมื่อห่วงโซ่ใบรับรองของเซิร์ฟเวอร์ใช้ Trust Anchor ที่ใช้สำหรับการแก้ไขข้อบกพร่องเท่านั้นรายการใดรายการหนึ่ง หาก android:debuggable เป็น"false"
ระบบจะไม่สนใจส่วนนี้โดยสิ้นเชิง
<trust-anchors>
- ไวยากรณ์:
-
<trust-anchors> ... </trust-anchors>
- อาจมีข้อมูลต่อไปนี้
-
<certificates>
จำนวนเท่าใดก็ได้ - description:
- ชุดจุดยึดความน่าเชื่อถือสำหรับการเชื่อมต่อที่ปลอดภัย
<certificates>
- ไวยากรณ์:
<certificates src=["system" | "user" | "raw resource"] overridePins=["true" | "false"] />
- description:
- ชุดใบรับรอง 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>
จำนวนเท่าใดก็ได้ - description:
-
ชุดการปักหมุดคีย์สาธารณะ หากต้องการให้การเชื่อมต่อที่ปลอดภัยเป็นที่เชื่อถือ คีย์สาธารณะอย่างน้อย 1 รายการในห่วงโซ่ความน่าเชื่อถือต้องอยู่ในชุดพิน ดูรูปแบบของหมุดได้ที่
<pin>
- แอตทริบิวต์
-
-
expiration
-
วันที่ในรูปแบบ
yyyy-MM-dd
ที่ PIN หมดอายุ ซึ่งจะ ปิดใช้การปักหมุด หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ PIN จะไม่มีวันหมดอายุการหมดอายุช่วยป้องกันปัญหาการเชื่อมต่อในแอปที่ไม่ได้อัปเดตชุดพิน เช่น เมื่อผู้ใช้ปิดใช้การอัปเดตแอป
-
<pin>
- ไวยากรณ์:
-
<pin digest=["SHA-256"]>base64 encoded digest of X.509 SubjectPublicKeyInfo (SPKI)</pin>
- แอตทริบิวต์
-
-
digest
-
อัลกอริทึมสำหรับไดเจสต์ที่ใช้ในการสร้างพิน ปัจจุบันรองรับเฉพาะ
"SHA-256"
-