วิธีติดตั้งใบรับรอง CA ที่เชื่อถือได้บนอุปกรณ์ Android


136

ฉันได้สร้างใบรับรอง CA ของฉันเองและตอนนี้ฉันต้องการติดตั้งบนอุปกรณ์ Android Froyo (HTC Desire Z) เพื่อให้อุปกรณ์นั้นเชื่อถือใบรับรองของฉัน

Android จัดเก็บใบรับรอง CA ในที่เก็บคีย์ Java ในรูปแบบ/system/etc/security/cacerts.bks. ฉันคัดลอกไฟล์ลงในคอมพิวเตอร์เพิ่มใบรับรองโดยใช้portecle 1.5และส่งกลับไปที่อุปกรณ์

ตอนนี้ดูเหมือนว่า Android จะไม่โหลดไฟล์ซ้ำโดยอัตโนมัติ ฉันได้อ่านในบล็อกโพสต์หลายรายการว่าฉันต้องรีสตาร์ทอุปกรณ์ การทำเช่นนี้จะส่งผลให้ไฟล์ถูกเขียนทับด้วยไฟล์ต้นฉบับอีกครั้ง

ความพยายามครั้งต่อไปของฉันคือการติดตั้งใบรับรองจากการ์ด SD โดยการคัดลอกและใช้ตัวเลือกตามจากเมนูการตั้งค่า อุปกรณ์แจ้งว่ามีการติดตั้งใบรับรองแล้ว แต่ดูเหมือนว่าใบรับรองไม่เชื่อถือ นอกจากนี้เมื่อฉันพยายามที่จะคัดลอก keystore cacerts.bksไปยังเครื่องคอมพิวเตอร์ของฉันฉันยังคงพบว่าหุ้นเดิม

ดังนั้นวิธีที่ถูกต้องในการติดตั้งใบรับรอง CA หลักของตัวเองบนอุปกรณ์ Android 2.2 เป็นใบรับรองที่เชื่อถือได้คืออะไร มีวิธีทำแบบเป็นโปรแกรมไหม


คุณสามารถสมมติโทรศัพท์ที่รูทได้ที่นี่ :)
Björn Marschollek

คำตอบ:


122

ก่อน Android KitKat คุณต้องรูทอุปกรณ์ของคุณเพื่อติดตั้งใบรับรองใหม่

ตั้งแต่ Android KitKat (4.0) จนถึง Nougat (7.0)เป็นไปได้และง่ายดาย ฉันสามารถติดตั้งใบรับรอง Charles Web Debbuging Proxy บนอุปกรณ์ที่ไม่ได้รูทและสูดดมปริมาณการใช้ SSL

สารสกัดจากhttp://wiki.cacert.org/FAQ/ImportRootCert

ก่อน Android เวอร์ชัน 4.0 ที่ใช้ Android เวอร์ชัน Gingerbread & Froyo จะมีไฟล์แบบอ่านอย่างเดียว (/system/etc/security/cacerts.bks) ไฟล์เดียวที่มี Trust store พร้อมใบรับรอง CA ('system') ทั้งหมดที่เชื่อถือได้โดยค่าเริ่มต้น Android ทั้งแอประบบและแอปพลิเคชันทั้งหมดที่พัฒนาด้วย Android SDK ใช้สิ่งนี้ ใช้คำแนะนำเหล่านี้ในการติดตั้งใบรับรอง CAcert บน Android Gingerbread, Froyo, ...

เริ่มตั้งแต่ Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' และ Android 4.4 'KitKat') ใบรับรองที่เชื่อถือได้ของระบบจะอยู่บนพาร์ติชันระบบ (อ่านอย่างเดียว) ในโฟลเดอร์ "/ system / etc / ความปลอดภัย / 'เป็นไฟล์แต่ละไฟล์ อย่างไรก็ตามขณะนี้ผู้ใช้สามารถเพิ่มใบรับรอง 'ผู้ใช้' ของตนเองได้อย่างง่ายดายซึ่งจะถูกเก็บไว้ใน '/ data / misc / keychain / certs-added'

ใบรับรองที่ติดตั้งระบบสามารถจัดการได้บนอุปกรณ์ Android ในการตั้งค่า -> ความปลอดภัย -> ใบรับรอง -> ส่วน "ระบบ" ในขณะที่ใบรับรองที่เชื่อถือได้ของผู้ใช้จะอยู่ในส่วน "ผู้ใช้" ที่นั่น เมื่อใช้ใบรับรองที่เชื่อถือได้ของผู้ใช้ Android จะบังคับให้ผู้ใช้อุปกรณ์ Android ใช้มาตรการด้านความปลอดภัยเพิ่มเติม: การใช้รหัส PIN การล็อกรูปแบบหรือรหัสผ่านเพื่อปลดล็อกอุปกรณ์เป็นสิ่งจำเป็นเมื่อใช้ใบรับรองที่ผู้ใช้จัดหา

การติดตั้งใบรับรอง CAcert เป็นใบรับรอง 'ผู้ใช้ที่เชื่อถือได้' นั้นง่ายมาก การติดตั้งใบรับรองใหม่เป็นใบรับรอง 'ระบบที่เชื่อถือได้' จำเป็นต้องใช้งานมากขึ้น (และต้องเข้าถึงรูท) แต่มีข้อดีคือหลีกเลี่ยงข้อกำหนดหน้าจอล็อกของ Android

ตั้งแต่ Android N เป็นต้นไปมันจะยากขึ้นเล็กน้อยดูสารสกัดนี้จากเว็บไซต์ Charles proxy :

สำหรับ Android N คุณต้องเพิ่มการกำหนดค่าให้กับแอปของคุณเพื่อให้แอปเชื่อถือใบรับรอง SSL ที่สร้างโดย Charles SSL Proxying ซึ่งหมายความว่าคุณสามารถใช้ SSL Proxying กับแอปที่คุณควบคุมได้เท่านั้น

ในการกำหนดค่าแอปให้เชื่อถือ Charles คุณต้องเพิ่มไฟล์การกำหนดค่าความปลอดภัยเครือข่ายลงในแอปของคุณ ไฟล์นี้สามารถลบล้างค่าเริ่มต้นของระบบทำให้แอปของคุณเชื่อถือใบรับรอง CA ที่ผู้ใช้ติดตั้งไว้ (เช่น Charles Root Certificate) คุณสามารถระบุว่าสิ่งนี้ใช้ได้เฉพาะในบิลด์การดีบักของแอ็พพลิเคชันของคุณเพื่อให้บิลด์การผลิตใช้โปรไฟล์ความน่าเชื่อถือดีฟอลต์

เพิ่มไฟล์ res / xml / network_security_config.xml ในแอปของคุณ:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

จากนั้นเพิ่มการอ้างอิงไปยังไฟล์นี้ในไฟล์ Manifest ของแอปดังนี้:

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

1
ไฟล์ใบรับรองที่กำหนดเองของฉัน ( /system/etc/security/cacerts/*.0) จะไม่ถูกเก็บไว้หลังจากรีบูต / รีสตาร์ท AVD ดังนั้นวิธีนี้จึงไม่ประสบความสำเร็จ
fikr4n

@BornToCode น่าสนใจ - ฉันไม่ค่อยใช้ AVD ดังนั้นฉันจึงไม่ทราบถึงข้อ จำกัด นี้
Dean Wild

ฉันเห็นการตั้งค่าdebug-overridesนั่นหมายความว่านี่เป็นnetwork_security_configเพียงการกำหนดเป้าหมายตัวแปรแก้ไขข้อบกพร่องเท่านั้น หากฉันมีตัวแปรอื่นเช่นตัวแปร UAT สิ่งนี้จะใช้ไม่ได้?
Isaac

1
@Isaac หมายความว่าจะใช้กับตัวแปรใด ๆ ที่ debuggable = true
Dean Wild

1
@DeanWild - ขอบคุณมาก! ฉันพยายามทำให้มันใช้งานได้ตลอดไปและได้รับ "ใบรับรอง ssl ที่ไม่ถูกต้อง" เมื่อทำการดีบักแอปของฉัน โซลูชันนี้ใช้งานได้ดีสำหรับแอป Android ของฉันที่ทำงานบน Android 9 บน Samsung Note 8
Dave Black

43

ฉันใช้เวลามากในการพยายามหาคำตอบสำหรับสิ่งนี้ (ฉันต้องการ Android เพื่อดูใบรับรอง StartSSL) สรุป: Android 2.1 และ 2.2 อนุญาตให้คุณนำเข้าใบรับรอง แต่ใช้กับ WiFi และ VPN เท่านั้น ไม่มีอินเทอร์เฟซผู้ใช้สำหรับอัปเดตรายการใบรับรองหลักที่เชื่อถือได้ แต่มีการอภิปรายเกี่ยวกับการเพิ่มคุณสมบัติดังกล่าว ไม่ชัดเจนว่ามีวิธีแก้ปัญหาที่เชื่อถือได้สำหรับการอัปเดตและแทนที่ไฟล์ cacerts.bks ด้วยตนเองหรือไม่

รายละเอียดและการเชื่อมโยง: http://www.mcbsys.com/techblog/2010/12/android-certificates/ ในโพสต์นั้นให้ดูลิงก์ไปยังข้อบกพร่องของ Android 11231 - คุณอาจต้องการเพิ่มการโหวตและคำถามของคุณในข้อบกพร่อง


3
นักพัฒนา Android ตอบคำถามของฉันอีกครั้ง การอัปเดต cacerts.bks: "ในทุกรุ่นถึง 2.3 ต้องใช้ OTA เพื่ออัปเดต cacerts.bks บนโทรศัพท์ที่ไม่ได้รูท" code.google.com/p/android/issues/detail?id=11231#c25 OTA = over-the-air ใช่ไหม? นี่อาจเป็นสาเหตุที่โทรศัพท์ของคุณเปลี่ยนกลับไปใช้ cacerts.bks จากโรงงานอยู่เสมอ? อย่างไรก็ตามหากคุณมีสิทธิ์เข้าถึงรูทดูเหมือนว่าคุณควรจะสามารถดาวน์โหลดซอร์สโค้ดเพิ่มใบรับรองของคุณจากนั้นสร้าง cacerts.bks โดยใช้สคริปต์ certimport.sh android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry

ขอบคุณ. เห็นได้ชัดว่านี่ไม่ใช่คำตอบที่ฉันอยากได้ยิน แต่ดูเหมือนจะเป็นคำตอบที่ถูกต้อง ฉันหวังว่าจะมีวิธีติดตั้งใบรับรองโดยไม่ต้องอัปเดตระบบทั้งหมด แน่นอนว่าฉันสามารถสร้าง cacerts.bks ใหม่ได้ด้วยการเข้าถึงรูทฉันสามารถแทนที่อันเก่าได้ แต่มันจะเปลี่ยนกลับเป็นเวอร์ชันดั้งเดิมทุกครั้งที่รีบูต ดูเหมือนว่า Android จะปฏิเสธที่จะโหลดไฟล์ใบรับรองที่เชื่อถือได้โดยไม่ต้องรีบูต
Björn Marschollek

27
แล้วการติดตั้งใบรับรอง CA บนแพลตฟอร์ม 3.X และ 4.X ล่ะ
Alok Kulkarni

1
4.X เป็นต้นไป: stackoverflow.com/questions/4461360/…
Dean Wild

16

หากคุณต้องการใบรับรองของคุณสำหรับการเชื่อมต่อ HTTPS คุณสามารถเพิ่มไฟล์. bks เป็นทรัพยากรดิบให้กับแอปพลิเคชันของคุณและขยาย DefaultHttpConnection เพื่อให้ใบรับรองของคุณใช้สำหรับการเชื่อมต่อ HTTPS

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

ขอบคุณสำหรับการตอบกลับของคุณ. อันที่จริงฉันต้องติดตั้งใบรับรองในลักษณะที่ทุกแอปพลิเคชันบนอุปกรณ์เชื่อถือใบรับรอง ปัญหาเดียวกันนี้ควรมีอยู่สำหรับ CA ที่มีขนาดเล็กเช่น CAcert ซึ่งใบรับรองไม่ได้รับความเชื่อถือตามค่าเริ่มต้น พวกเขาจะติดตั้งใบรับรองได้อย่างไร
Björn Marschollek

คุณลอง: การตั้งค่า -> ความปลอดภัย -> ติดตั้งจากการ์ด SD
Alexander Egger

สิ่งนี้อาจน่าสนใจ: android.git.kernel.org/?p=platform/packages/apps/…
Alexander Egger

2
ฉันมีปัญหาเดียวกันฉันต้องโหลดใบรับรอง. PDF X509 โดยใช้แอปพลิเคชัน Adroid 2.3.3 จากนั้นสร้างการเชื่อมต่อ SSL ใครสามารถช่วยฉันแสดงความคิดเห็นรหัส?
AndroidLearner

9

คำแนะนำที่เชื่อมโยงที่นี่อาจตอบคำถามเดิมโดยไม่จำเป็นต้องเขียนโปรแกรมตัวเชื่อมต่อ SSL

พบคำแนะนำโดยละเอียดเกี่ยวกับการนำเข้าใบรับรองรูทซึ่งจะช่วยคุณในการติดตั้งใบรับรอง CA ที่เชื่อถือได้ในอุปกรณ์ Android เวอร์ชันต่างๆ

โดยทั่วไปคุณจะต้อง:

  1. ดาวน์โหลด: ไฟล์ cacerts.bks จากโทรศัพท์ของคุณ

    adb ดึง /system/etc/security/cacerts.bks cacerts.bks

  2. ดาวน์โหลดไฟล์. crt จากหน่วยงานรับรองที่คุณต้องการอนุญาต

  3. แก้ไขไฟล์ cacerts.bks บนคอมพิวเตอร์ของคุณโดยใช้BouncyCastle Provider

  4. อัปโหลดไฟล์ cacerts.bks กลับไปที่โทรศัพท์ของคุณแล้วรีบูต

นี่คือรายละเอียดเพิ่มเติมทีละขั้นตอนในการอัปเดตโทรศัพท์ Android รุ่นก่อนหน้า: วิธีอัปเดตที่เก็บคีย์ผู้ออกใบรับรองความปลอดภัย HTTPS บนอุปกรณ์ก่อน Android-4.0


5

มีวิธีแก้ปัญหาที่ง่ายกว่าที่โพสต์ไว้ที่นี่หรือในเธรดที่เกี่ยวข้อง หากคุณใช้ webview (เหมือนฉัน) คุณสามารถบรรลุสิ่งนี้ได้โดยเรียกใช้ฟังก์ชัน JAVASCRIPT ภายใน หากคุณไม่ได้ใช้มุมมองเว็บคุณอาจต้องการสร้างมุมมองที่ซ่อนไว้เพื่อจุดประสงค์นี้ นี่คือฟังก์ชั่นที่ใช้งานได้กับเบราว์เซอร์ใด ๆ (หรือ webview) เพื่อเริ่มต้นการติดตั้ง ca (โดยทั่วไปผ่านที่เก็บใบรับรองระบบปฏิบัติการที่ใช้ร่วมกันรวมถึงบน Droid) ใช้เคล็ดลับดีๆกับ iFrames เพียงแค่ส่ง url ไปยังไฟล์. crt ไปยังฟังก์ชันนี้:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

อัพเดท:

เคล็ดลับ iframe ทำงานบน Droids ที่มี API 19 ขึ้นไป แต่ Webview เวอร์ชันเก่าจะไม่ทำงานเช่นนี้ แนวคิดทั่วไปยังคงใช้งานได้ - เพียงดาวน์โหลด / เปิดไฟล์ด้วย webview จากนั้นให้ระบบปฏิบัติการเข้าควบคุม นี่อาจเป็นวิธีแก้ปัญหาที่ง่ายและเป็นสากลมากขึ้น (ในจาวาจริงตอนนี้):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

โปรดทราบว่าอินสแตนซ์ _ เป็นการอ้างอิงถึงกิจกรรม สิ่งนี้จะทำงานได้อย่างสมบูรณ์หากคุณทราบ url ของใบรับรอง อย่างไรก็ตามในกรณีของฉันฉันแก้ไขปัญหานั้นแบบไดนามิกด้วยซอฟต์แวร์ฝั่งเซิร์ฟเวอร์ ฉันต้องเพิ่มรหัสเพิ่มเติมจำนวนพอสมควรเพื่อสกัดกั้น url การเปลี่ยนเส้นทางและเรียกสิ่งนี้ในลักษณะที่ไม่ก่อให้เกิดความผิดพลาดตามความซับซ้อนของเธรด แต่ฉันจะไม่เพิ่มความสับสนทั้งหมดที่นี่ ...


3

สิ่งที่ฉันทำเพื่อให้สามารถใช้ใบรับรอง startssl นั้นค่อนข้างง่าย (บนโทรศัพท์ที่รูทของฉัน)

ฉันคัดลอก /system/etc/security/cacerts.bks ไปยัง sdcard ของฉัน

ดาวน์โหลดhttp://www.startssl.com/certs/ca.crtและhttp://www.startssl.com/certs/sub.class1.server.ca.crt

ไปที่ portecle.sourceforge.net และเรียกใช้ portecle โดยตรงจากหน้าเว็บ

เปิดไฟล์ cacerts.bks จาก sdcard ของฉัน (ไม่ต้องป้อนอะไรเลยเมื่อถูกถามรหัสผ่าน)

เลือกนำเข้าใน portacle และเปิด sub.class1.server.ca.crt กรณีของฉันมันมี ca.crt อยู่แล้ว แต่บางทีคุณอาจต้องติดตั้งด้วย

บันทึกที่เก็บคีย์และคัดลอก baxck ไปที่ /system/etc/security/cacerts.bks (ฉันทำการสำรองข้อมูลของไฟล์นั้นก่อนในกรณี)

รีบูตโทรศัพท์ของฉันและตอนนี้ฉันสามารถเยี่ยมชมไซต์ของฉันโดยใช้ใบรับรอง startssl โดยไม่มีข้อผิดพลาด



มีความคิดอย่างไรที่จะนำ cacert.bks กลับมาบนอุปกรณ์ที่ไม่ได้รูท
Bob

2

ขั้นตอนเหล่านี้ใช้ได้ผลสำหรับฉัน:

  1. ติดตั้งแอพ Dory Certificate Android บนอุปกรณ์มือถือของคุณ: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. เชื่อมต่ออุปกรณ์มือถือกับแล็ปท็อปด้วยสาย USB
  3. สร้างโฟลเดอร์รูทในหน่วยความจำโทรศัพท์ภายในคัดลอกไฟล์ใบรับรองในโฟลเดอร์นั้นและถอดสายเคเบิล
  4. เปิดแอป Dory Certificate สำหรับ Android คลิกปุ่มรอบ [+] แล้วเลือกตัวเลือก Import File Certificate ที่ถูกต้อง
  5. เลือกรูปแบบระบุชื่อ (ฉันพิมพ์เหมือนกับชื่อไฟล์) เรียกดูไฟล์ใบรับรองแล้วคลิกปุ่ม [ตกลง]
  6. ไพ่สามใบจะแสดงรายการ ฉันไม่สนใจการ์ดที่มีเพียงปุ่ม [SIGN CSR] และคลิกที่ปุ่ม [INSTALL] บนการ์ดอีกสองใบ
  7. ฉันรีเฟรชเว็บแอป PWA ที่ฉันไม่ได้เปิด Chrome บนมือถือของฉัน (โฮสต์บน IIS Web Server ในเครื่อง) และ voala! ไม่มีข้อความเตือน Chrome ล็อคสีเขียวอยู่ที่นั่น มันใช้งานได้

อีกวิธีหนึ่งฉันพบตัวเลือกเหล่านี้ซึ่งฉันไม่จำเป็นต้องลองด้วยตัวเอง แต่ดูง่ายต่อการปฏิบัติตาม:

สุดท้ายอาจไม่เกี่ยวข้อง แต่หากคุณต้องการสร้างและตั้งค่าใบรับรองที่ลงนามด้วยตนเอง (พร้อม mkcert) สำหรับแอป PWA ของคุณ (เว็บไซต์) ที่โฮสต์บนเว็บเซิร์ฟเวอร์ IIS ภายในฉันทำตามหน้านี้

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

ขอบคุณและหวังว่ามันจะช่วยได้ !! :)


1

นี่คือทางเลือกอื่นที่เพิ่มใบรับรองของคุณไปยังรายการใบรับรองเริ่มต้นในตัว: การเชื่อถือใบรับรองทั้งหมดโดยใช้ HttpClient ผ่าน HTTPS

อย่างไรก็ตามจะใช้ได้กับแอปพลิเคชันของคุณเท่านั้น ไม่มีวิธีใดที่จะทำโดยใช้โปรแกรมสำหรับแอปพลิเคชันทั้งหมดบนอุปกรณ์ของผู้ใช้เนื่องจากอาจมีความเสี่ยงด้านความปลอดภัย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.