Cerita dulu, apa itu SSL.
SSL aka Secure Socket Layer adalah protokol keamanan yang mengamankan segala bentuk lalu-lintas data atau transaksi pada sebuah domain. SSL disebut juga TSL(Transport Socket Layer).
Manfaat dari SSL adalah untuk kerahasiaan dan autentikasi. Dengan SSL, data transaksi internet lebih sulit untuk di sadap, karena membutuhkan authentication.
Setiap request ke domain, clien akan meminta Certificate dari server. Client atau browser biasanya sudah menyimpan daftar certificate yg sudah di approve kemudian digunakan untuk memverifikasi keabsahan Certificate.
Domain yg terlindungi SSL dapat dilihat dari prefixnya yaitu https://
Autentikasi SSL pada aplikasi Android.
Kalo di aplikasi mobile, mekanismenya beda lagi. Di Android misalnya, certificate harus di download dari server kemudian di simpan dan di embed ke dalam aplikasi. Embeded certificate ini berbentuk keystore kemudian akan divalidasi bersamaan dengan httprequest.
Certificate hasil download-an ini dapat disimpan dalam bentuk file berekstensi *.pem.
Kemudian untuk menggenerate certificate menjadi sebuah keystore dapat dilakukan dengan menggunakan keytool java punya. Atau pake tool yg lebih ciamik namanya portecle yg udah pake GUI punya.
http://portecle.sourceforge.net/
Jika menggunakan OkHttp bisa lebih mudah lagi karena dapat menggunakan CertificatePinner.
0 1 2 |
CertificatePinner certificatePinner = new CertificatePinner.Builder() .add("domainkamu.com", "sha256/0mOSBPV1PLalshashahsaB/iYTuP/Cj+Qrw=").build(); OkHttpClient.Builder b = new OkHttpClient.Builder().certificatePinner(certificatePinner); |
Trusting tanpa Autentikasi.
Boleh dibilang ini adalah metode yg tidak aman, karena langsung percaya saja tanpa identifikasi.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
@SuppressWarnings("null") public static OkHttpClient configureClient(final OkHttpClient client) { final TrustManager[] certs = new TrustManager[]{new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { } @Override public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException { } }}; SSLContext ctx = null; try { ctx = SSLContext.getInstance("TLS"); ctx.init(null, certs, new SecureRandom()); } catch (final java.security.GeneralSecurityException ex) { } try { final HostnameVerifier hostnameVerifier = new HostnameVerifier() { @Override public boolean verify(final String hostname, final SSLSession session) { return true; } }; client.setHostnameVerifier(hostnameVerifier); client.setSslSocketFactory(ctx.getSocketFactory()); } catch (final Exception e) { } return client; } |
Referensi:
http://software.endy.muhardin.com/aplikasi/apa-itu-ssl/https://www.digicert.com/ssl.htmhttps://gist.github.com/Kursulla/0fd3549a99b8f594da8d