Saya mencoba membuat koneksi HTTPS, menggunakan HttpClient
lib, tetapi masalahnya adalah, karena sertifikat tersebut tidak ditandatangani oleh Otoritas Sertifikat (CA) yang diakui seperti Verisign , GlobalSIgn , dll., Yang tercantum pada set Sertifikat Tepercaya Android, Saya terus mendapatkan javax.net.ssl.SSLException: Not trusted server certificate
.
Saya telah melihat solusi di mana Anda cukup menerima semua sertifikat, tetapi bagaimana jika saya ingin bertanya kepada pengguna?
Saya ingin mendapatkan dialog yang mirip dengan browser, membiarkan pengguna memutuskan untuk melanjutkan atau tidak. Lebih disukai saya ingin menggunakan sertifikat yang sama seperti browser. Ada ide?
Jawaban:
Hal pertama yang perlu Anda lakukan adalah mengatur tingkat verifikasi. Level seperti itu tidak terlalu banyak:
Meskipun metode setHostnameVerifier () sudah usang untuk apache perpustakaan baru, tetapi untuk versi di Android SDK adalah normal. Jadi kami mengambil
ALLOW_ALL_HOSTNAME_VERIFIER
dan mengaturnya di pabrik metodeSSLSocketFactory.setHostnameVerifier()
.Selanjutnya, Anda perlu mengatur pabrik kami untuk protokol ke https. Untuk melakukan ini, cukup panggil
SchemeRegistry.register()
metode tersebut.Maka Anda perlu membuat
DefaultHttpClient
denganSingleClientConnManager
. Juga dalam kode di bawah ini Anda dapat melihat bahwa secara default juga akan menggunakan flag kami (ALLOW_ALL_HOSTNAME_VERIFIER
) oleh metodeHttpsURLConnection.setDefaultHostnameVerifier()
Kode di bawah ini berfungsi untuk saya:
sumber
org.apache.http.conn.ssl.SSLSocketFactory
mengapa saya ingin menggunakanjavax.net.ssl.HttpsURLConnection
??Langkah-langkah utama berikut ini diperlukan untuk mencapai koneksi aman dari Otoritas Sertifikasi yang tidak dianggap dipercaya oleh platform android.
Seperti yang diminta oleh banyak pengguna, saya telah mencerminkan bagian terpenting dari artikel blog saya di sini:
java.net.ssl.HttpsURLConnection
(lebih mudah dimengerti, lebih banyak performan)Raih sertifikat tersebut
Anda harus mendapatkan semua sertifikat yang membangun rantai dari sertifikat titik akhir hingga Root CA. Ini berarti, setiap (jika ada) CA CA menengah dan juga CA CA Root. Anda tidak perlu mendapatkan sertifikat titik akhir.
Buat keystore
Unduh Penyedia BouncyCastle dan simpan ke lokasi yang diketahui. Juga pastikan bahwa Anda dapat menjalankan perintah keytool (biasanya terletak di bawah folder bin instalasi JRE Anda).
Sekarang impor sertifikat yang diperoleh (jangan impor sertifikat titik akhir) ke dalam keystore yang diformat BouncyCastle.
Saya tidak mengujinya, tetapi saya pikir urutan mengimpor sertifikat itu penting. Ini berarti, impor sertifikat CA Menengah paling bawah terlebih dahulu dan kemudian sampai ke sertifikat CA Root.
Dengan perintah berikut, keystore baru (jika belum ada) dengan kata sandi mysecret akan dibuat dan sertifikat CA Menengah akan diimpor. Saya juga mendefinisikan penyedia BouncyCastle, di mana dapat ditemukan pada sistem file saya dan format keystore. Jalankan perintah ini untuk setiap sertifikat dalam rantai.
Verifikasi apakah sertifikat diimpor dengan benar ke dalam keystore:
Haruskah mengeluarkan seluruh rantai:
Sekarang Anda dapat menyalin keystore sebagai sumber daya mentah di aplikasi Android Anda di bawah
res/raw/
Gunakan keystore di aplikasi Anda
Pertama-tama kita harus membuat Apache HttpClient kustom yang menggunakan keystore kita untuk koneksi HTTPS:
Kami telah membuat HttpClient kustom kami, sekarang kami dapat menggunakannya untuk koneksi yang aman. Misalnya ketika kami melakukan panggilan GET ke sumber daya REST:
Itu dia ;)
sumber
/res/raw/mykeystore.bks
, meskipun tidak dapat menyelesaikan referensi untuk itu. bagaimana mengatasi ini?Jika Anda memiliki sertifikat khusus yang ditandatangani sendiri di server yang tidak ada di perangkat, Anda dapat menggunakan kelas di bawah ini untuk memuatnya dan menggunakannya di sisi klien di Android:
Tempatkan
*.crt
file sertifikat/res/raw
sehingga tersedia dariR.raw.*
Gunakan kelas di bawah ini untuk mendapatkan
HTTPClient
atauHttpsURLConnection
yang akan memiliki pabrik soket menggunakan sertifikat itu:Poin-poin penting:
Certificate
objek dihasilkan dari.crt
file.KeyStore
dibuat.keyStore.setCertificateEntry("ca", cert)
menambahkan sertifikat ke penyimpanan kunci di bawah alias "ca". Anda memodifikasi kode untuk menambahkan lebih banyak sertifikat (CA menengah dll).SSLSocketFactory
yang kemudian dapat digunakan olehHTTPClient
atauHttpsURLConnection
.SSLSocketFactory
dapat dikonfigurasi lebih lanjut, misalnya untuk melewati verifikasi nama host, dll.Informasi lebih lanjut di: http://developer.android.com/training/articles/security-ssl.html
sumber
.crt
file? Unduh dari server?Saya frustrasi mencoba menghubungkan Aplikasi Android saya ke layanan RESTful saya menggunakan https. Saya juga agak jengkel tentang semua jawaban yang menyarankan untuk menonaktifkan memeriksa sertifikat sama sekali. Jika Anda melakukannya, apa gunanya https?
Setelah googled tentang topik untuk sementara waktu, saya akhirnya menemukan solusi ini di mana guci eksternal tidak diperlukan, hanya Android API. Terima kasih kepada Andrew Smith, yang mempostingnya pada Juli, 2014
Ini bekerja dengan baik untuk App mockup saya.
sumber
import java.security.cert.X509Certificate;
Jawaban teratas tidak berhasil untuk saya. Setelah beberapa penyelidikan saya menemukan informasi yang diperlukan pada "Pengembang Android": https://developer.android.com/training/articles/security-ssl.html#SelfSigned
Membuat implementasi X509TrustManager yang kosong melakukan trik:
Ketahuilah bahwa penerapan TustManager yang kosong ini hanyalah contoh dan menggunakannya di lingkungan yang produktif akan menyebabkan ancaman keamanan yang parah!
sumber
Google merekomendasikan penggunaan Android Volley untuk koneksi HTTP / HTTPS , karena
HttpClient
sudah tidak digunakan lagi. Jadi, Anda tahu pilihan yang tepat :).Dan juga, TIDAK PERNAH NUKE SSL Certificate (TIDAK PERNAH !!!).
Untuk membatalkan Sertifikat SSL, sama sekali bertentangan dengan tujuan SSL, yang mempromosikan keamanan . Tidak ada gunanya menggunakan SSL, jika Anda berencana untuk mengebom semua sertifikat SSL yang datang. Solusi yang lebih baik adalah, tidak menggunakan SSL, atau solusi yang lebih baik, akan membuat custom
TrustManager
di App + Anda menggunakan Android Volley untuk koneksi HTTP / HTTPS.Berikut adalah Intisari yang saya buat, dengan LoginApp dasar, melakukan koneksi HTTPS, menggunakan Sertifikat yang Ditandatangani Sendiri di sisi server, diterima di App.
Berikut juga Intisari lain yang dapat membantu, untuk membuat Sertifikat SSL yang Ditandatangani Sendiri untuk pengaturan di Server Anda dan juga menggunakan sertifikat pada Aplikasi Anda. Sangat penting: Anda harus menyalin file .crt yang dihasilkan oleh skrip di atas, ke direktori "mentah" dari proyek Android Anda.
sumber
Inilah cara Anda dapat menambahkan sertifikat tambahan ke KeyStore Anda untuk menghindari masalah ini: Mempercayai semua sertifikat menggunakan HttpClient melalui HTTPS
Itu tidak akan meminta pengguna seperti yang Anda minta, tetapi itu akan membuat lebih kecil kemungkinannya bahwa pengguna akan mengalami kesalahan "Sertifikat server tidak tepercaya".
sumber
Cara termudah untuk membuat sertifikat SSL
Buka Firefox (saya kira itu juga mungkin dengan Chrome, tetapi lebih mudah bagi saya dengan FF)
Kunjungi situs pengembangan Anda dengan sertifikat SSL yang ditandatangani sendiri.
Klik pada sertifikat (di sebelah nama situs)
Klik pada "Informasi lebih lanjut"
Klik pada "Lihat sertifikat"
Klik pada "Detail"
Klik pada "Ekspor ..."
Pilih "X.509 Certificate whith chain (PEM)", pilih folder dan nama untuk menyimpannya dan klik "Simpan"
Pergi ke baris perintah, ke direktori tempat Anda mengunduh file pem dan jalankan "openssl x509-informasikan PEM-outform DM-in .pem -out .crt"
Salin file .crt ke root folder / sdcard di dalam perangkat Android Anda Di dalam perangkat Android Anda, Pengaturan> Keamanan> Instal dari penyimpanan.
Ini harus mendeteksi sertifikat dan membiarkan Anda menambahkannya ke perangkat Browse ke situs pengembangan Anda.
Pertama kali itu harus meminta Anda untuk mengkonfirmasi pengecualian keamanan. Itu saja.
Sertifikat harus bekerja dengan browser apa pun yang diinstal di Android Anda (Browser, Chrome, Opera, Dolphin ...)
Ingat bahwa jika Anda menyajikan file statis dari domain lain (kami semua adalah pelacur kecepatan halaman), Anda juga perlu menambahkan sertifikat untuk domain itu.
sumber
Saya menulis perpustakaan kecil ssl-utils-android untuk mempercayai sertifikat tertentu di Android.
Anda cukup memuat sertifikat apa pun dengan memberikan nama file dari direktori aset.
Pemakaian:
sumber
Tidak satu pun dari perbaikan ini yang berfungsi untuk platform saya yang menargetkan SDK 16, Rilis 4.1.2, jadi saya menemukan solusinya.
Aplikasi saya menyimpan data di server menggunakan " http://www.example.com/page.php?data=somedata "
Baru-baru ini page.php dipindahkan ke " https://www.secure-example.com/page.php " dan saya terus mendapatkan "javax.net.ssl.SSLException: Sertifikat server tidak tepercaya".
Alih-alih menerima semua sertifikat hanya untuk satu halaman, mulai dengan panduan ini saya memecahkan masalah saya menulis page.php saya sendiri yang diterbitkan di " http://www.example.com/page.php "
sumber
19 Jan, 2020 Sertifikat Mandiri, MASALAH TETAP:
Untuk memutar video, gambar, memanggil layanan web untuk sertifikat yang ditandatangani sendiri atau menghubungkan ke url tanpa jaminan, panggil saja metode ini sebelum melakukan tindakan apa pun, itu akan memperbaiki masalah Anda mengenai masalah sertifikat:
KODE KOTLIN
sumber
Mungkin ini akan membantu ... ini berfungsi pada klien java menggunakan sertifikat yang ditandatangani sendiri (tidak ada pemeriksaan sertifikat). Hati-hati dan gunakan hanya untuk kasus pengembangan karena itu sama sekali tidak aman !!
Cara mengabaikan kesalahan sertifikat SSL di Apache HttpClient 4.0
Semoga berhasil di Android dengan hanya menambahkan pustaka HttpClient ... semoga berhasil !!
sumber
Ini adalah masalah yang disebabkan oleh kurangnya dukungan SNI (Server Name Identification) diA, ndroid 2.x. Saya berjuang dengan masalah ini selama seminggu sampai saya menemukan pertanyaan berikut, yang tidak hanya memberikan latar belakang masalah yang baik tetapi juga memberikan solusi yang efektif dan bekerja tanpa ada celah keamanan.
Kesalahan 'Tidak ada sertifikat sebaya' di Android 2.3 tetapi TIDAK di 4
sumber