Uvod u SSL u Javi

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom uputstvu predstavit ćemo SSL i istražiti kako ga možemo koristiti u Javi koristeći JSSE (Java Secure Socket Extension) API.

2. Uvod

Jednostavno rečeno, Sloj zaštićene utičnice (SSL) omogućuje sigurnu vezu između dviju strana, obično klijenti i poslužitelji.

SSL osigurava sigurni kanal između dva uređaja koji rade preko mrežne veze. Uobičajeni primjer za SSL je omogućavanje sigurne komunikacije između web preglednika i web poslužitelja.

U ovom konkretnom slučaju, web preglednici će koristiti HTTPS (S označava zaštićeno) veze za pristup resursima koje pružaju zasebni web poslužitelji.

SSL je neophodan za podršku tri glavna načela informacijske sigurnosti:

  • Šifriranje: zaštititi prijenos podataka između strana
  • Ovjera: osigurajte da je poslužitelj s kojim se povezujemo doista pravilan
  • Integritet podataka: jamstvo da su traženi podaci ono što se učinkovito isporučuje

Java nudi nekoliko API-ja temeljenih na sigurnosti koji pomažu programerima da uspostave sigurne veze s klijentom za primanje i slanje poruka u šifriranom formatu:

  • Proširenje Java zaštićene utičnice (JSSE)
  • Java kriptografska arhitektura (JCA)
  • Java kriptografsko proširenje (JCE)

U sljedećim odjeljcima predstavit ćemo proširenje Secure Socket koje Java koristi za omogućavanje sigurne komunikacije.

3. JSSE API

Java sigurnosni API-ji koriste Tvornica opsežno dizajnirati uzorak.

Zapravo se sve instancira pomoću tvornice u JSSE.

3.1. SSLSocketFactory

The javax.net.ssl.SSLSocketFactory koristi se za stvaranje SSLSocket predmeta.

Ova klasa sadrži tri skupine API-ja.

Prva skupina sastoji se od jedne statike getDefault () metoda koja se koristi za dohvaćanje zadane instance koja, pak, može stvoriti SSLSocket instance.

Druga skupina sastoji se od pet metoda koje se mogu koristiti za stvaranje SSLSocket primjerci:

  • 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 socket, string host, int port, boolean autoClose)

Ovu klasu možemo koristiti izravno dobivanjem zadane instance ili pomoću a javax.net.ssl.SSLContext objekt koji sadrži metode za dobivanje SSLSocketFactory primjer.

3.2. SSLSocket

Ova klasa proširuje Utičnica klase i osigurava sigurnu utičnicu. Takve utičnice su normalne strujne utičnice.

Uz to, dodaju sloj sigurnosne zaštite preko temeljnog protokola mrežnog prijenosa.

SSLSocket instance grade SSL vezu s imenovanim hostom na navedenom portu.

To omogućuje vezivanje klijentske strane veze na zadanu adresu i port.

3.3. SSLServerSocketFactory

The SSLServerSocketFactory razred je prilično sličan SSLSocketFactory s tom razlikom što stvara SSLServerSocket slučajevi umjesto SSLSocket instance.

Sličnošću se nazivaju metode createServerSocket kao analogno SSLSocketFactory razred.

3.4. SSLServerSocket

The SSLServerSocket klasa je analogna klasi SSLSocket razred. Metode na klasi SSLServerSocket podskup su SSLSocket razredne metode. Djeluju na suprotnoj strani SSL veze

4. Primjer SSL-a

Navedimo primjer kako možemo stvoriti sigurnu vezu s poslužiteljem:

Niz niza = getHost (...); Cjeloviti priključak = getPort (...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault (); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket (host, port); InputStream u = sslsocket.getInputStream (); OutputStream out = sslsocket.getOutputStream (); out.write (1); while (in.available ()> 0) {System.out.print (in.read ()); } System.out.println ("Sigurna veza uspješno izvedena"); 

U slučaju da dobijemo pogrešku “Javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX izgradnja puta nije uspjela: sun.security.provider.certpath.SunCertPathBuilderException: nije moguće pronaći valjanu put certifikacije do traženog cilja tijekom uspostavljanja SSL veze”, to znači da nemamo javni certifikat poslužitelja koji pokušavamo povezati u Java truststore.

Trgovina povjerenja je datoteka koja sadrži pouzdane certifikate koje Java koristi za provjeru sigurnih veza.

Da bismo riješili ovaj problem, imamo nekoliko mogućnosti:

  • dodajte javni certifikat poslužitelja na zadani cacerts trgovina povjerenjem koristi Java. tijekom pokretanja SSL veze
  • Postavite javax.net.ssl.trustStore varijabla okoline da ukazuje na datoteku truststore tako da aplikacija može podići tu datoteku koja sadrži javni certifikat poslužitelja s kojim se povezujemo.

Koraci za instaliranje novog certifikata u Java zadanu trgovinu povjerenja su:

  1. izvaditi cert s poslužitelja: openssl s_client -connect poslužitelj: 443
  2. uvoz certifikata u skladište povjerenja pomoću alata za ključeve: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Nakon što to učinimo, trebali bismo moći ponovno pokrenuti primjer i dobiti Sigurna veza uspješno izvedena poruka.

5. Zaključak

U ovom smo članku predstavili SSL i JSSE API koji implementira SSL za Javu. Korištenjem SSL-a i JSSE-a možemo učiniti naše Java programe i komunikaciju između aplikacija i unutar njih sigurnijima.

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na Githubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ