Inleiding tot SSL in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In deze tutorial introduceren we SSL en onderzoeken we hoe we het in Java kunnen gebruiken met behulp van de JSSE-API (Java Secure Socket Extension).

2. Inleiding

Simpel gezegd, de Beveiligde socketlaag (SSL) maakt een beveiligde verbinding tussen twee partijen mogelijk, meestal clients en servers.

SSL biedt een veilig kanaal tussen twee apparaten die via een netwerkverbinding werken. Een gebruikelijk voorbeeld van SSL is om veilige communicatie tussen webbrowsers en webservers mogelijk te maken.

In dit specifieke geval gebruiken webbrowsers HTTPS-verbindingen (S staat voor Secured) om toegang te krijgen tot de bronnen die worden geleverd door verschillende webservers.

SSL is nodig om de drie belangrijkste principes van informatiebeveiliging te ondersteunen:

  • Versleuteling: gegevensoverdracht tussen partijen beveiligen
  • Authenticatie: zorg ervoor dat de server waarmee we verbinding maken inderdaad de juiste server is
  • Data-integriteit: garanderen dat de gevraagde gegevens zijn wat effectief wordt geleverd

Java biedt verschillende op beveiliging gebaseerde API's die ontwikkelaars helpen om veilige verbindingen met de client tot stand te brengen om berichten in een gecodeerde indeling te ontvangen en te verzenden:

  • Java Secured-Socket Extension (JSSE)
  • Java Cryptography Architecture (JCA)
  • Java Cryptographic Extension (JCE)

In de volgende secties introduceren we de Secure Socket Extension die Java gebruikt om veilige communicatie mogelijk te maken.

3. JSSE API

De Java-beveiligings-API's maken gebruik van de Fabriek ontwerppatroon uitgebreid.

In feite wordt alles geïnstantieerd met behulp van een fabriek in JSSE.

3.1. SSLSocketFactory

De javax.net.ssl.SSLSocketFactory wordt gebruikt voor het maken van SSLSocket voorwerpen.

Deze klasse bevat drie groepen API's.

De eerste groep bestaat uit één statisch getDefault () methode die wordt gebruikt om de standaardinstantie op te halen die op zijn beurt SSLSocket gevallen.

De tweede groep bestaat uit vijf methoden die kunnen worden gebruikt voor het maken SSLSocket gevallen:

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

We kunnen deze klasse rechtstreeks gebruiken door de standaardinstantie te verkrijgen of door een javax.net.ssl.SSLContext-object dat methoden bevat om een SSLSocketFactory voorbeeld.

3.2. SSLSocket

Deze klasse breidt het Stopcontact klasse en biedt een veilige aansluiting. Dergelijke stopcontacten zijn normale stroomaansluitingen.

Bovendien voegen ze een beveiligingslaag toe via het onderliggende netwerktransportprotocol.

SSLSocket instanties bouwen een SSL-verbinding met een genoemde host op een opgegeven poort.

Dit maakt het mogelijk om de clientzijde van de verbinding aan een bepaald adres en poort te binden.

3.3. SSLServerSocketFactory

De SSLServerSocketFactory klasse lijkt veel op SSLSocketFactory met het verschil dat het creëert SSLServerSocket instanties in plaats van SSLSocket gevallen.

Door gelijkenis worden de methoden aangeroepen createServerSocket analoog aan SSLSocketFactory klasse.

3.4. SSLServerSocket

De SSLServerSocket klasse is analoog aan de SSLSocket klasse. De methoden op de SSLServerSocket-klasse zijn een subset van de SSLSocket class methoden. Ze werken aan de andere kant van een SSL-verbinding

4. SSL-voorbeeld

Laten we een voorbeeld geven van hoe we een beveiligde verbinding met een server kunnen maken:

String host = getHost (...); Geheel getal poort = getPort (...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault (); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket (host, poort); InputStream in = sslsocket.getInputStream (); OutputStream uit = sslsocket.getOutputStream (); out.write (1); while (in.available ()> 0) {System.out.print (in.read ()); } System.out.println ("Beveiligde verbinding succesvol uitgevoerd"); 

Voor het geval we de fout krijgen "Javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-pad bouwen mislukt: sun.security.provider.certpath.SunCertPathBuilderException: kan geen geldig certificeringspad naar het aangevraagde doel vinden tijdens het tot stand brengen van de SSL-verbinding", het geeft aan dat we niet het openbare certificaat hebben van de server waarmee we verbinding proberen te maken in de Java-truststore.

De truststore is het bestand met vertrouwde certificaten die Java gebruikt om beveiligde verbindingen te valideren.

Om dit probleem op te lossen, hebben we verschillende opties:

  • voeg het openbare certificaat van de server toe aan de standaardwaarde cacerts truststore gebruikt door Java. tijdens het initiëren van de SSL-verbinding
  • Stel het javax.net.ssl.trustStore omgevingsvariabele om naar het truststore-bestand te verwijzen, zodat de toepassing dat bestand kan ophalen dat het openbare certificaat bevat van de server waarmee we verbinding maken.

De stappen om een ​​nieuw certificaat te installeren in de standaard Java-truststore zijn:

  1. extract certificaat van server: openssl s_client -connect server: 443
  2. certificaat importeren in truststore met keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Zodra we dit hebben gedaan, zouden we het voorbeeld opnieuw moeten kunnen uitvoeren en het Beveiligde verbinding is succesvol uitgevoerd bericht.

5. Conclusie

In dit artikel hebben we SSL en JSSE API geïntroduceerd, waarmee SSL voor Java wordt geïmplementeerd. Door SSL en JSSE te gebruiken, kunnen we onze Java-applicaties en de communicatie tussen applicaties en binnen de applicatie veiliger maken.

Zoals altijd is de code die in dit artikel wordt gepresenteerd, beschikbaar op Github.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS