Pengantar SSL di Java

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Dalam tutorial ini, kami akan memperkenalkan SSL dan menjelajahi bagaimana kami dapat menggunakannya di Java menggunakan JSSE (Java Secure Socket Extension) API.

2. Pendahuluan

Sederhananya, Secure Socket Layer (SSL) memungkinkan koneksi aman antara dua pihak , biasanya klien dan server.

SSL menyediakan saluran aman antara dua perangkat yang beroperasi melalui koneksi jaringan. Satu contoh umum untuk SSL adalah mengaktifkan komunikasi yang aman antara browser web dan server web.

Dalam kasus khusus ini, browser web akan menggunakan koneksi HTTPS (S singkatan dari Secured) untuk mengakses sumber daya yang disediakan oleh server web yang berbeda.

SSL diperlukan untuk mendukung tiga prinsip keamanan informasi utama:

  • Enkripsi : melindungi transmisi data antar pihak
  • Otentikasi : memastikan server yang kita sambungkan memang server yang tepat
  • Integritas data : menjamin bahwa data yang diminta dikirimkan secara efektif

Java menyediakan beberapa API berbasis keamanan yang membantu pengembang membangun koneksi aman dengan klien untuk menerima dan mengirim pesan dalam format terenkripsi:

  • Ekstensi Soket Aman Java (JSSE)
  • Arsitektur Kriptografi Java (JCA)
  • Ekstensi Kriptografi Java (JCE)

Di bagian selanjutnya, kami akan memperkenalkan Secure Socket Extension yang digunakan Java untuk mengaktifkan komunikasi yang aman.

3. JSSE API

API keamanan Java memanfaatkan pola desain Pabrik secara ekstensif.

Faktanya, semuanya dibuat menggunakan pabrik di BEJ.

3.1. SSLSocketFactory

The javax.net.ssl.SSLSocketFactory digunakan untuk membuat SSLSocket objek.

Kelas ini berisi tiga grup API.

Grup pertama terdiri dari satu metode getDefault () statis yang digunakan untuk mengambil instance default yang, pada gilirannya, dapat membuat instance SSLSocket .

Grup kedua terdiri dari lima metode yang dapat digunakan untuk membuat instance SSLSocket :

  • Socket createSocket (String host, int port)
  • Socket createSocket (String host, int port, InetAddress clientHost, int clientPort)
  • Socket createSocket (inetAddress host, int port)
  • Socket createSocket (InetAddress host, int port, InetAddress clientHost, int clientPort)
  • Soket createSocket (Socket socket, String host, int port, boolean autoClose)

Kita dapat menggunakan kelas ini secara langsung dengan mendapatkan contoh default atau dengan menggunakan javax.net.ssl. Objek SSLContext yang berisi metode untuk mendapatkan instance SSLSocketFactory .

3.2. SSLSocket

Kelas ini memperluas kelas Socket dan menyediakan socket yang aman. Soket tersebut adalah soket aliran normal.

Selain itu, mereka menambahkan lapisan perlindungan keamanan di atas protokol transportasi jaringan yang mendasarinya.

Instance SSLSocket membangun koneksi SSL ke host bernama di port tertentu.

Hal ini memungkinkan pengikatan sisi klien dari koneksi ke alamat dan port tertentu.

3.3. SSLServerSocketFactory

Kelas SSLServerSocketFactory sangat mirip dengan SSLSocketFactory dengan perbedaannya ia membuat instance SSLServerSocket sebagai pengganti instance SSLSocket .

Dengan kemiripan, metode ini disebut createServerSocket sebagai analog dengan kelas SSLSocketFactory .

3.4. SSLServerSocket

Kelas SSLServerSocket sama dengan kelas SSLSocket . Metode pada kelas SSLServerSocket adalah subset dari metode kelas SSLSocket . Mereka bertindak di sisi berlawanan dari koneksi SSL

4. Contoh SSL

Mari berikan contoh bagaimana kita dapat membuat koneksi aman ke server:

String host = getHost(...); Integer port = getPort(...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket(host, port); InputStream in = sslsocket.getInputStream(); OutputStream out = sslsocket.getOutputStream(); out.write(1); while (in.available() > 0) { System.out.print(in.read()); } System.out.println("Secured connection performed successfully"); 

Jika kami mendapatkan kesalahan "javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Pembuatan jalur PKIX gagal: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta saat membuat Koneksi SSL ” , ini menunjukkan bahwa kami tidak memiliki sertifikat publik dari server yang kami coba sambungkan di toko kepercayaan Java.

The truststore is the file containing trusted certificates that Java uses to validate secured connections.

In order to sort this problem out, we have several options:

  • add the public certificate of the server to the default cacerts truststore used by Java. while initiating the SSL connection
  • Set the javax.net.ssl.trustStore environment variable to point to the truststore file so that the application can pick up that file which contains the public certificate of the server we are connecting to.

The steps to install a new certificate into the Java default truststore are:

  1. extract cert from server: openssl s_client -connect server:443
  2. impor sertifikat ke truststore menggunakan keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Setelah kami melakukan ini, kami harus dapat menjalankan contoh lagi dan mendapatkan pesan Sambungan aman berhasil dijalankan .

5. Kesimpulan

Di artikel ini, kami memperkenalkan SSL dan JSSE API, yang mengimplementasikan SSL untuk Java. Dengan menggunakan SSL dan JSSE, kita dapat membuat aplikasi Java kita dan komunikasi antar aplikasi dan di dalam aplikasi lebih aman.

Seperti biasa, kode yang disajikan dalam artikel ini tersedia di Github.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya