sertifikat yang ditandatangani sendiri berhasil, mengklaim, tetapi android bertindak seolah-olah sertifikat tidak ada

17

Saya mencoba menginstal sertifikat yang ditandatangani sendiri untuk server web saya di Android 4.3. Saya memiliki file .crt di root kartu SD (yang sebenarnya ditiru karena saya tidak memiliki kartu SD di dalam slot).

Untuk menginstal sertifikat saya pergi ke Pengaturan -> Umum -> Keamanan -> Penyimpanan Kredensial -> Instal dari penyimpanan perangkat.

Saya mendapatkan kotak dialog yang menunjukkan nama sertifikat (nama file dikurangi ekstensi .crt) yang dapat saya ubah (tetapi tidak), "digunakan untuk" pull down dengan "VPN dan aplikasi" dipilih dan teks di bagian bawah dialog yang menginformasikan "Paket berisi: satu sertifikat pengguna". Semuanya terlihat oke, jadi saya klik "Oke". Dialog hilang dan pesan roti panggang muncul dengan "[nama] diinstal".

Namun jika saya langsung pergi ke "kredensial Tepercaya dan pilih" Pengguna "tidak ada apa-apa di sana! Sertifikat baru juga tidak di bawah" Sistem "tetapi saya tidak akan mengharapkannya di sana. Jika saya pergi ke browser setelah ini dan mencoba pergi ke saya situs web, saya masih mendapat peringatan bahwa sertifikat situs tidak tepercaya. Saya juga mencoba me-reboot, tetapi tidak ada bedanya.

Apa yang saya lakukan salah? Tidak adanya pesan kesalahan sama sekali tidak membantu. Apakah mungkin sertifikat saya dalam format yang salah? Saya telah mencoba menggunakan file .crt di direktori ssl server dan saya telah mencoba mengubahnya menjadi format DER.

Pembaruan: Saya membaca bahwa Android memerlukan sertifikat dalam format p12, jadi saya mengonversi sertifikat Apache2 ke p12 menggunakan perintah berikut:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Saya kemudian mengulangi langkah-langkah di atas, mendapatkan pesan sukses yang sama, dan kemudian melanjutkan untuk tetap tidak melihat sertifikat di kredensial pengguna dan saya masih mendapatkan kesalahan sertifikat yang tidak dipercaya dari browser ponsel.

Michael
sumber

Jawaban:

19

Saya memiliki masalah yang sama dengan Android untuk benar-benar menginstal sertifikat, sampai saya menemukan situs ini yang menjelaskan metode yang bekerja untuk saya. Itu bermuara pada langkah-langkah berikut:

  1. Buat kunci pribadi dan sertifikat x509 publik dengan ekstensi v3_req dan diaktifkan sebagai CA:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Konversikan sertifikat ke format DER, yang dipahami oleh Android:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Gunakan metode apa saja untuk mendapatkan my_site.der.crtke perangkat Android Anda - Saya merasa mudah untuk hanya memiliki file yang di-host oleh server web saya dan mengunduhnya melalui browser Android, yang kemudian secara otomatis memungkinkan Anda menginstalnya.

Meskipun saya ingin langkah 1 dibagi menjadi dua (1a. Kunci pribadi dan 1b. Sertifikat publik), saya tidak menginvestasikan terlalu banyak waktu untuk menyelidiki bagaimana melakukannya. Tolong beri tahu saya di komentar jika Anda menemukan cara yang berhasil, terima kasih.

(Daripada menambahkan komentar, saya merasa ini benar-benar milik sebagai bagian dari jawaban untuk referensi di masa mendatang, jadi saya mengeditnya. --Michael)

Alih-alih membuat sertifikat yang diaktifkan sebagai CA, saya membuat CA yang ditandatangani sendiri dan kemudian menandatangani ulang kunci / csr yang ada dengan CA baru. Lalu saya menambahkan CA yang ditandatangani sendiri ke Android dan voila! Berhasil!

Menghasilkan CA yang ditandatangani sendiri:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Menandatangani kembali CSR yang ada yang saya miliki dari pembuatan kunci dari

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Sekarang menggunakan bentuk modifikasi dari perintah kedua Anda, saya mengonversi sertifikat CA ke bentuk DER:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

Hal yang hebat tentang hal ini adalah, setiap sertifikat tambahan yang tidak dipercaya yang sekarang ditandatangani kembali dengan CA yang ditandatangani sendiri sekarang akan dipercaya pada perangkat apa pun daripada CA baru diinstal tanpa perlu menginstal apa pun. Ini tidak benar-benar menyelesaikan masalah mempercayai situs yang tidak Anda kendalikan, tetapi mungkin membuatnya lebih mudah jika Anda memiliki pengaruh atas (katakanlah) departemen TI Anda untuk server internal atau sesuatu.

FriendFX
sumber
1
Saya sudah memiliki sertifikat yang harus saya instal, jadi saya mencoba langkah 2 dan masih belum muncul di Kredensial Tepercaya Pengguna setelah mengklaim berhasil menginstal, dan Chrome masih menampilkan kesalahan "situs tidak dipercaya" setelah memulai ulang.
Michael
1
Mungkinkah ada sesuatu tentang ekstensi v3_req dan diaktifkan sebagai CA yang harus dimiliki sertifikat untuk Android untuk menggunakannya? Jika demikian, apakah ada perintah yang dapat saya gunakan untuk mengambil sertifikat yang ada dan menambahkan informasi itu ke dalamnya, karena saya tidak memiliki kendali atas semua sertifikat yang ingin saya instal.
Michael
3
Untuk menjawab bagian pertama dari pertanyaan saya sebelumnya, saya membaca halaman yang Anda tautkan, dan tampaknya masalahnya adalah Android menolak untuk menginstal sertifikat yang ditandatangani sendiri (tetapi bukan CA yang ditandatangani sendiri). Ini sepertinya tidak didokumentasikan, dan fakta bahwa Android berpura-pura menginstal membuatnya semakin buruk. Tetapi pertanyaannya tetap, jika saya memiliki sertifikat yang ditandatangani sendiri dan saya tidak memiliki kendali atas, apakah ada cara untuk "CA" - verifikasi sehingga saya dapat menginstalnya?
Michael
1
@Saya harap Anda tidak keberatan, saya akan mengedit jawaban Anda untuk memasukkan solusi saya, daripada memasukkannya dalam komentar, karena itu benar-benar milik sebagai bagian dari jawaban.
Michael
1
Saya tidak mengerti bagaimana permintaan penandatanganan yang ada.csr dihasilkan. Saya pikir ini adalah titik terakhir yang hilang untuk tutorial langkah demi langkah lengkap.
cguenther