Introduktion til SSL i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne vejledning introducerer vi SSL og udforsker, hvordan vi kan bruge det i Java ved hjælp af JSSE (Java Secure Socket Extension) API.

2. Introduktion

Kort sagt, den Secured Socket Layer (SSL) muliggør en sikret forbindelse mellem to parter, normalt klienter og servere.

SSL sørger for en sikker kanal mellem to enheder, der fungerer via en netværksforbindelse. Et almindeligt eksempel på SSL er at aktivere sikker kommunikation mellem webbrowsere og webservere.

I dette specifikke tilfælde bruger webbrowsere HTTPS-forbindelser (står for sikret) for at få adgang til de ressourcer, der leveres af forskellige webservere.

SSL er nødvendigt for at understøtte de tre vigtigste informationssikkerhedsprincipper:

  • Kryptering: beskytte dataoverførsler mellem parter
  • Godkendelse: Sørg for, at den server, vi opretter forbindelse til, faktisk er den rigtige server
  • Dataintegritet: garanterer, at de ønskede data er det, der faktisk leveres

Java leverer flere sikkerhedsbaserede API'er, der hjælper udviklere med at etablere sikre forbindelser med klienten til at modtage og sende meddelelser i et krypteret format:

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

I de næste sektioner introducerer vi Secure Socket Extension, som Java bruger til at muliggøre sikker kommunikation.

3. JSSE API

Java-sikkerheds-API'erne gør brug af Fabrik design mønster udførligt.

Faktisk er alt instantieret ved hjælp af en fabrik i JSSE.

3.1. SSLSocketFactory

Det javax.net.ssl.SSLSocketFactory bruges til oprettelse SSLSocket genstande.

Denne klasse indeholder tre grupper af API'er.

Den første gruppe består af en enkelt statisk getDefault () metode, der bruges til at hente standardforekomsten, som igen kan oprette SSLSocket tilfælde.

Den anden gruppe består af fem metoder, der kan bruges til oprettelse SSLSocket tilfælde:

  • Socket createSocket (streng vært, int-port)
  • Socket createSocket (String vært, int port, InetAddress clientHost, int clientPort)
  • Socket createSocket (InetAddress vært, int-port)
  • Socket createSocket (InetAddress vært, int port, InetAddress clientHost, int clientPort)
  • Socket createSocket (Socket-sokkel, String-vært, int-port, boolsk autoClose)

Vi kan bruge denne klasse direkte ved at hente standardforekomsten eller ved at bruge en javax.net.ssl.SSLContext-objekt, der indeholder metoder til at få et SSLSocketFactory eksempel.

3.2. SSLSocket

Denne klasse udvider Stikkontakt klasse og giver sikker stikkontakt. Sådanne stik er normale strømstik.

Derudover tilføjer de et lag af sikkerhedsbeskyttelse over den underliggende netværkstransportprotokol.

SSLSocket forekomster konstruerer en SSL-forbindelse til en navngivet vært i en specificeret port.

Dette gør det muligt at binde klientsiden af ​​forbindelsen til en given adresse og port.

3.3. SSLServerSocketFactory

Det SSLServerSocketFactory klasse er meget lig SSLSocketFactory med den forskel, det skaber SSLServerSocket tilfælde i stedet for SSLSocket tilfælde.

Som lighed kaldes metoderne createServerSocket som analog med SSLSocketFactory klasse.

3.4. SSLServerSocket

Det SSLServerSocket klasse er analog med SSLSocket klasse. Metoderne i SSLServerSocket-klassen er en delmængde af SSLSocket klassemetoder. De handler på den modsatte side af en SSL-forbindelse

4. SSL-eksempel

Lad os give et eksempel på, hvordan vi kan oprette en sikret forbindelse til en server:

String vært = getHost (...); Heltalsport = getPort (...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault (); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket (vært, port); InputStream in = sslsocket.getInputStream (); OutputStream out = sslsocket.getOutputStream (); out.write (1); mens (in.available ()> 0) {System.out.print (in.read ()); } System.out.println ("Sikker forbindelse udført med succes"); 

Hvis vi får fejlen “Javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-stibygning mislykkedes: sun.security.provider.certpath.SunCertPathBuilderException: kunne ikke finde en gyldig certificeringssti til det ønskede mål under oprettelse af SSL-forbindelsen”, det indikerer, at vi ikke har det offentlige certifikat for serveren, som vi prøver at oprette forbindelse i Java-truststore.

Truststore er den fil, der indeholder pålidelige certifikater, som Java bruger til at validere sikre forbindelser.

For at løse dette problem har vi flere muligheder:

  • tilføj serverens offentlige certifikat til standard cacerts truststore bruges af Java. mens du starter SSL-forbindelsen
  • Indstil javax.net.ssl.trustStore miljøvariabel for at pege på truststore-filen, så applikationen kan afhente den fil, der indeholder det offentlige certifikat for den server, vi opretter forbindelse til.

Trinene til installation af et nyt certifikat i Java-standard tillidsbutik er:

  1. uddrag cert fra server: openssl s_client -forbind server: 443
  2. importer certifikat til truststore ved hjælp af keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Når vi har gjort dette, skal vi være i stand til at køre eksemplet igen og få Sikker forbindelse udført med succes besked.

5. Konklusion

I denne artikel introducerede vi SSL og JSSE API, som implementerer SSL til Java. Ved at bruge SSL og JSSE kan vi gøre vores Java-applikationer og kommunikationen mellem applikationer og inde i applikationen mere sikker.

Som altid er koden præsenteret i denne artikel tilgængelig på Github.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN