Pengenalan SSL di Java

Java Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

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

2. Pengenalan

Ringkasnya, Secured Socket Layer (SSL) membolehkan sambungan selamat antara dua pihak , biasanya pelanggan dan pelayan.

SSL menyediakan saluran selamat antara dua peranti yang beroperasi melalui sambungan rangkaian. Salah satu contoh biasa untuk SSL adalah mengaktifkan komunikasi yang selamat antara penyemak imbas web dan pelayan web.

Dalam kes khusus ini, penyemak imbas web akan menggunakan sambungan HTTPS (S bermaksud Selamat) untuk mengakses sumber yang dibekalkan oleh pelayan web yang berbeza.

SSL diperlukan untuk menyokong tiga prinsip keselamatan maklumat utama:

  • Penyulitan : melindungi penghantaran data antara pihak
  • Pengesahan : pastikan pelayan yang kita sambungkan memang merupakan pelayan yang betul
  • Integriti data : menjamin bahawa data yang diminta adalah yang disampaikan dengan berkesan

Java menyediakan beberapa API berasaskan keselamatan yang membantu pembangun menjalin hubungan selamat dengan klien untuk menerima dan menghantar mesej dalam format yang dienkripsi:

  • Penyambungan Soket Selamat-Java (JSSE)
  • Senibina Kriptografi Java (JCA)
  • Sambungan Kriptografi Java (JCE)

Pada bahagian seterusnya, kami akan memperkenalkan Secure Socket Extension yang digunakan Java untuk membolehkan komunikasi yang selamat.

3. API JSSE

API keselamatan Java menggunakan corak reka bentuk Kilang secara meluas.

Sebenarnya, semuanya dibuat menggunakan kilang di JSSE.

3.1. SSLSocketFactory

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

Kelas ini mengandungi tiga kumpulan API.

Kumpulan pertama terdiri daripada kaedah getDefault () statik tunggal yang digunakan untuk mengambil contoh lalai yang, seterusnya, dapat membuat contoh SSLSocket .

Kumpulan kedua terdiri daripada lima kaedah yang boleh digunakan untuk membuat contoh 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)
  • Socket createSocket (Socket soket, String host, int port, boolean autoClose)

Kita boleh menggunakan kelas ini secara langsung dengan mendapatkan contoh lalai atau dengan menggunakan javax.net.ssl. Objek SSLConteks yang mengandungi kaedah untuk mendapatkan contoh SSLSocketFactory .

3.2. SSLSoket

Kelas ini meluaskan kelas Socket dan menyediakan soket yang selamat. Soket sedemikian adalah soket aliran biasa.

Di samping itu, mereka menambahkan lapisan perlindungan keselamatan daripada protokol pengangkutan rangkaian yang mendasari.

Contoh SSLSocket membina sambungan SSL ke host bernama pada port yang ditentukan.

Ini membolehkan mengikat bahagian sambungan pelanggan ke alamat dan port yang diberikan.

3.3. SSLServerSocketFactory

The SSLServerSocketFactory kelas adalah agak sama dengan SSLSocketFactory dengan perbezaan bahawa ia mewujudkan SSLServerSocket contoh di tempat SSLSocket keadaan.

Dengan kesamaan, kaedah dipanggil createServerSocket sebagai analog dengan kelas SSLSocketFactory .

3.4. SSLServerSocket

The SSLServerSocket kelas adalah mirip kepada SSLSocket kelas. Kaedah pada kelas SSLServerSocket adalah sebahagian daripada kaedah kelas SSLSocket . Mereka bertindak di seberang sambungan SSL

4. Contoh SSL

Mari berikan contoh bagaimana kita dapat membuat sambungan selamat ke pelayan:

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"); 

Sekiranya kita mendapat ralat "javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Pembinaan jalan PKIX gagal: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat mencari jalan sijil yang sah ke sasaran yang diminta semasa membuat Sambungan SSL " , ini menunjukkan bahawa kami tidak mempunyai sijil awam pelayan yang kami cuba sambungkan di kedai 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. import sijil ke truststore menggunakan keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Sebaik sahaja kita melakukan ini, kita seharusnya dapat menjalankan contohnya lagi dan mendapatkan mesej Sambungan selamat yang berjaya dilakukan .

5. Kesimpulan

Dalam artikel ini, kami memperkenalkan SSL dan JSSE API, yang menerapkan SSL untuk Java. Dengan menggunakan SSL dan JSSE, kita dapat menjadikan aplikasi Java dan komunikasi antara aplikasi dan di dalam aplikasi lebih aman.

Seperti biasa, kod yang disajikan dalam artikel ini terdapat di Github.

Bahagian bawah Java

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

>> SEMAK KURSUS