Bagaimana cara menginstal sertifikat CA tepercaya di perangkat Android?

134

Saya telah membuat sertifikat CA sendiri dan sekarang saya ingin menginstalnya di perangkat Android Froyo saya (HTC Desire Z), sehingga perangkat mempercayai sertifikat saya.

Android menyimpan sertifikat CA di keystore Java di /system/etc/security/cacerts.bks. Saya menyalin file ke komputer saya, menambahkan sertifikat saya menggunakan portecle 1.5 dan mendorongnya kembali ke perangkat.

Sekarang, Android sepertinya tidak memuat ulang file secara otomatis. Saya telah membaca di beberapa posting blog bahwa saya perlu me-restart perangkat. Melakukan hal itu mengakibatkan file ditimpa dengan yang asli lagi.

Percobaan saya berikutnya adalah menginstal sertifikat dari kartu SD dengan menyalinnya dan menggunakan opsi yang sesuai dari menu pengaturan. Perangkat memberi tahu saya bahwa sertifikat telah diinstal, tetapi ternyata tidak mempercayai sertifikat. Terlebih lagi, ketika saya mencoba menyalin keystore ke komputer saya, saya masih menemukan stok aslinya cacerts.bks.

Jadi, apa cara yang tepat untuk menginstal sertifikat CA root saya sendiri di perangkat Android 2.2 sebagai sertifikat tepercaya? Apakah ada cara untuk melakukannya secara terprogram?

Björn Marschollek
sumber
Anda dapat menganggap telepon yang di-rooting di sini. :)
Björn Marschollek

Jawaban:

116

Sebelum Android KitKat, Anda harus melakukan root pada perangkat Anda untuk menginstal sertifikat baru.

Dari Android KitKat (4.0) hingga Nougat (7.0) itu mungkin dan mudah. Saya dapat menginstal sertifikat Proxy Charles Web Debbuging pada perangkat yang belum di-root dan berhasil mengendus lalu lintas SSL.

Ekstrak dari http://wiki.cacert.org/FAQ/ImportRootCert

Sebelum Android versi 4.0, dengan versi Android Gingerbread & Froyo, ada satu file read-only (/system/etc/security/cacerts.bks) yang berisi toko kepercayaan dengan semua sertifikat CA ('sistem') yang dipercaya secara default di Android. Baik aplikasi sistem dan semua aplikasi yang dikembangkan dengan Android SDK menggunakan ini. Gunakan petunjuk ini untuk menginstal sertifikat CAcert pada Android Gingerbread, Froyo, ...

Mulai dari Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' & Android 4.4 'KitKat'), sertifikat tepercaya sistem ada di partisi sistem (baca-saja) di folder '/ system / etc / keamanan / 'sebagai file individual. Namun, pengguna sekarang dapat dengan mudah menambahkan sertifikat 'pengguna' mereka sendiri yang akan disimpan di '/ data / misc / gantungan kunci / tambah sertifikat'.

Sertifikat yang diinstal sistem dapat dikelola pada perangkat Android di bagian Pengaturan -> Keamanan -> Sertifikat -> 'Sistem', sedangkan sertifikat tepercaya pengguna dibuat di bagian 'Pengguna' di sana. Saat menggunakan sertifikat tepercaya pengguna, Android akan memaksa pengguna perangkat Android untuk menerapkan langkah-langkah keamanan tambahan: penggunaan kode PIN, kunci pola atau kata sandi untuk membuka kunci perangkat adalah wajib ketika sertifikat yang disediakan pengguna digunakan.

Memasang sertifikat CAcert sebagai sertifikat 'tepercaya pengguna' sangat mudah. Menginstal sertifikat baru sebagai sertifikat 'tepercaya sistem' memerlukan lebih banyak pekerjaan (dan memerlukan akses root), tetapi memiliki keuntungan untuk menghindari persyaratan layar kunci Android.

Dari Android N dan seterusnya semakin sedikit, lihat kutipan ini dari situs web proxy Charles :

Pada Android N, Anda perlu menambahkan konfigurasi ke aplikasi Anda agar mempercayai sertifikat SSL yang dihasilkan oleh Charles SSL Proxying. Ini berarti bahwa Anda hanya dapat menggunakan SSL Proxying dengan aplikasi yang Anda kontrol.

Untuk mengkonfigurasi aplikasi Anda agar mempercayai Charles, Anda perlu menambahkan File Konfigurasi Keamanan Jaringan ke aplikasi Anda. File ini dapat menimpa default sistem, memungkinkan aplikasi Anda untuk mempercayai sertifikat CA yang diinstal pengguna (mis. Sertifikat Charles Root). Anda dapat menentukan bahwa ini hanya berlaku di debug membangun aplikasi Anda, sehingga membangun produksi menggunakan profil kepercayaan default.

Tambahkan file res / xml / network_security_config.xml ke aplikasi Anda:

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

Kemudian tambahkan referensi ke file ini dalam manifes aplikasi Anda, sebagai berikut:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
Dean Wild
sumber
1
File sertifikat khusus saya ( /system/etc/security/cacerts/*.0) tidak disimpan setelah me-reboot / me-restart AVD, jadi solusi ini tidak berhasil.
fikr4n
@BornToCode menarik - Saya jarang menggunakan AVD jadi saya tidak mengetahui batasan ini
Dean Wild
Saya melihat pengaturan debug-overrides, apakah itu berarti ini network_security_confighanya menargetkan varian debug? Jika saya memiliki varian lain seperti varian UAT, maka ini tidak akan berfungsi?
Isaac
1
@Isaac, ini artinya akan berlaku untuk varian mana pun di mana debuggable = true
Dean Wild
1
@DeanWild - terima kasih banyak! Saya mencoba agar ini berfungsi selamanya dan terus mendapatkan "sertifikat ssl tidak valid" saat men-debug aplikasi saya. Solusi ini bekerja seperti pesona untuk aplikasi Android saya yang berjalan di Android 9 pada Samsung Note 8.
Dave Black
43

Saya menghabiskan banyak waktu untuk mencari jawaban atas hal ini (saya perlu Android untuk melihat sertifikat StartSSL). Kesimpulan: Android 2.1 dan 2.2 memungkinkan Anda mengimpor sertifikat, tetapi hanya untuk digunakan dengan WiFi dan VPN. Tidak ada antarmuka pengguna untuk memperbarui daftar sertifikat root tepercaya, tetapi ada diskusi tentang menambahkan fitur itu. Tidak jelas apakah ada solusi yang dapat diandalkan untuk memperbarui dan mengganti file cacerts.bks secara manual.

Detail dan tautan: http://www.mcbsys.com/techblog/2010/12/android-certificates/ . Di pos itu, lihat tautan ke bug Android 11231 - Anda mungkin ingin menambahkan suara dan permintaan ke bug itu.

Mark Berry
sumber
3
Pengembang Android menjawab pertanyaan saya kembali. memperbarui cacerts.bks: "dalam semua rilis meskipun 2.3, OTA diperlukan untuk memperbarui cacerts.bks pada ponsel yang tidak di-root." code.google.com/p/android/issues/detail?id=11231#c25 . OTA = over-the-air, kan? Mungkinkah ini sebabnya ponsel Anda tetap kembali ke cacerts.bks pabrik? Namun jika Anda DO memiliki akses root, tampaknya Anda harus dapat mengunduh kode sumber, menambahkan sertifikat Anda, lalu membangun cacerts.bks menggunakan skrip certimport.sh. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Mark Berry
Terima kasih. Ini jelas bukan jawaban yang ingin saya dengar, tetapi tampaknya jawaban yang benar. Saya berharap ada cara untuk menginstal sertifikat tanpa memperbarui seluruh sistem. Tentu saja saya dapat membangun cacerts.bks baru, dengan akses root saya bahkan dapat mengganti yang lama, tetapi kembali ke versi asli dengan setiap reboot. Tanpa me-reboot, Android tampaknya menolak untuk memuat ulang file sertifikat tepercaya.
Björn Marschollek
27
Bagaimana dengan menginstal sertifikat CA pada platform 3.X dan 4.X?
Alok Kulkarni
1
4.X dan seterusnya: stackoverflow.com/questions/4461360/…
Dean Wild
16

Jika Anda memerlukan sertifikat untuk koneksi HTTPS, Anda dapat menambahkan file .bks sebagai sumber daya mentah ke aplikasi Anda dan memperluas DefaultHttpConnection sehingga sertifikat Anda digunakan untuk koneksi 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);
        }
    }
}
Alexander Egger
sumber
Terima kasih untuk balasan Anda. Sebenarnya, saya perlu menginstal sertifikat sedemikian rupa sehingga setiap aplikasi pada perangkat mempercayai sertifikat. Masalah yang sama juga harus ada untuk beberapa CA kecil seperti CAcert, yang sertifikatnya tidak dipercaya secara default. Bagaimana mereka menginstal sertifikat mereka?
Björn Marschollek
Apakah Anda mencoba: Pengaturan -> Keamanan -> Instal dari SD Card
Alexander Egger
Juga ini mungkin menarik: android.git.kernel.org/?p=platform/packages/apps/…
Alexander Egger
2
Saya memiliki masalah yang sama, saya harus memuat sertifikat .PDX X509 menggunakan aplikasi Adroid 2.3.3 dan kemudian membuat Koneksi SSL. Adakah yang bisa membantu saya dengan kode komentar?
AndroidLearner
9

Panduan yang ditautkan di sini mungkin akan menjawab pertanyaan awal tanpa perlu memprogram konektor SSL khusus.

Temukan panduan cara mendetail tentang cara mengimpor sertifikat root yang benar-benar membantu Anda memasang sertifikat CA tepercaya pada berbagai versi perangkat Android (di antara perangkat lain).

Pada dasarnya Anda harus:

  1. Unduh: file cacerts.bks dari ponsel Anda.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Unduh file .crt dari otoritas sertifikasi yang ingin Anda izinkan.

  3. Ubah file cacerts.bks di komputer Anda menggunakan BouncyCastle Provider

  4. Unggah file cacerts.bks kembali ke ponsel Anda dan reboot.

Berikut ini adalah langkah demi langkah yang lebih rinci untuk memperbarui ponsel Android sebelumnya: Cara memperbarui keystore otoritas sertifikat keamanan HTTPS pada perangkat pra-android-4.0

RightHandedMonkey
sumber
5

Ada solusi JAUH lebih mudah untuk ini daripada diposting di sini, atau di utas terkait. Jika Anda menggunakan tampilan web (seperti saya), Anda dapat mencapainya dengan menjalankan fungsi JAVASCRIPT di dalamnya. Jika Anda tidak menggunakan tampilan web, Anda mungkin ingin membuatnya untuk tujuan ini. Berikut adalah fungsi yang berfungsi di hampir semua browser (atau tampilan web) untuk memulai instalasi (umumnya melalui repositori os cert bersama, termasuk pada Droid). Ini menggunakan trik yang bagus dengan iFrames. Cukup kirimkan url ke file .crt ke fungsi ini:

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

MEMPERBARUI:

Trik iframe berfungsi pada Droid dengan API 19 dan yang lebih tinggi, tetapi versi webview yang lebih lama tidak akan berfungsi seperti ini. Gagasan umum masih berfungsi - unduh / buka file dengan tampilan web lalu biarkan os mengambil alih. Ini mungkin solusi yang lebih mudah dan lebih universal (di java aktual sekarang):

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

Perhatikan bahwa instance_ adalah referensi ke Kegiatan. Ini berfungsi dengan baik jika Anda mengetahui url ke sertifikat. Namun, dalam kasus saya, saya menyelesaikannya secara dinamis dengan perangkat lunak sisi server. Saya harus menambahkan cukup banyak kode tambahan untuk mencegat url pengalihan dan menyebutnya dengan cara yang tidak menyebabkan kerusakan berdasarkan komplikasi threading, tapi saya tidak akan menambahkan semua kebingungan di sini ...

Terima kasih
sumber
3

Apa yang saya lakukan untuk dapat menggunakan sertifikat beginsl cukup mudah. (di telepon root saya)

Saya menyalin /system/etc/security/cacerts.bks ke sdcard saya

Unduh http://www.startssl.com/certs/ca.crt dan http://www.startssl.com/certs/sub.class1.server.ca.crt

Pergi ke portecle.sourceforge.net dan menjalankan portecle langsung dari halaman web.

Membuka file cacerts.bks saya dari sdcard saya (tidak memasukkan apa pun ketika diminta kata sandi)

Pilih impor di portacle dan buka sub.class1.server.ca.crt, im case saya semuanya sudah memiliki ca.crt tapi mungkin Anda perlu menginstalnya juga.

Menyimpan keystore dan menyalinnya baxck ke /system/etc/security/cacerts.bks (saya membuat cadangan file itu terlebih dahulu untuk jaga-jaga)

Reboot ponsel saya dan sekarang saya bisa mengunjungi situs saya menggunakan sertifikat beginsl tanpa kesalahan.

hans
sumber
Baru dari Mozilla: Tidak Memercayai WoSign Baru dan Sertifikat StartCom .
jww
tahu bagaimana cara mengembalikan cacert.bks pada perangkat NON yang di-rooting?
Bob
1

Langkah-langkah ini berhasil bagi saya:

  1. Pasang aplikasi Android Dory Certificate di perangkat seluler Anda: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=id
  2. Sambungkan perangkat seluler ke laptop dengan Kabel USB.
  3. Buat folder root pada memori Telepon Internal, salin file sertifikat di folder itu dan lepaskan kabel.
  4. Buka aplikasi Android Dory Certificate, klik tombol bulat [+] dan pilih opsi Impor File Sertifikat yang tepat.
  5. Pilih format, berikan nama (saya ketik sama dengan nama file), telusuri file sertifikat dan klik [OK].
  6. Tiga kartu akan terdaftar. Saya mengabaikan kartu yang hanya memiliki tombol [SIGN CSR] dan melanjutkan untuk mengklik tombol [INSTALL] pada dua kartu lainnya.
  7. Saya menyegarkan aplikasi web PWA yang saya buka tidak ada Chrome ponsel saya (itu di-host di Server Web IIS lokal) dan voala! Tidak ada pesan peringatan chrome. Kunci hijau ada di sana. Itu berhasil.

Atau, saya menemukan opsi-opsi ini yang tidak perlu saya coba sendiri tetapi terlihat mudah diikuti:

Akhirnya, ini mungkin tidak relevan tetapi, jika Anda ingin membuat dan mengatur sertifikat yang ditandatangani sendiri (dengan mkcert) untuk aplikasi PWA Anda (situs web) yang dihosting di server Web IIS lokal, saya mengikuti halaman ini:

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

Terima kasih dan harap ini membantu !! :)

Manuel Hernandez
sumber
0

Berikut solusi alternatif yang sebenarnya menambahkan sertifikat Anda ke daftar bawaan sertifikat bawaan: Memercayai semua sertifikat menggunakan HttpClient melalui HTTPS

Namun, itu hanya akan berfungsi untuk aplikasi Anda. Tidak ada cara untuk melakukannya secara terprogram untuk semua aplikasi pada perangkat pengguna, karena itu akan menjadi risiko keamanan.

emmby
sumber