Einführung in SSL in Java

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem Tutorial werden wir SSL vorstellen und untersuchen, wie wir es in Java mithilfe der JSSE-API (Java Secure Socket Extension) verwenden können.

2. Einführung

Einfach ausgedrückt ermöglicht der Secured Socket Layer (SSL) eine sichere Verbindung zwischen zwei Parteien , normalerweise Clients und Servern.

SSL bietet einen sicheren Kanal zwischen zwei Geräten, die über eine Netzwerkverbindung arbeiten. Ein übliches Beispiel für SSL ist die Aktivierung einer sicheren Kommunikation zwischen Webbrowsern und Webservern.

In diesem speziellen Fall verwenden Webbrowser HTTPS-Verbindungen (S steht für Secured), um auf die Ressourcen zuzugreifen, die von verschiedenen Webservern bereitgestellt werden.

SSL ist erforderlich, um die drei wichtigsten Prinzipien der Informationssicherheit zu unterstützen:

  • Verschlüsselung : Schützen Sie die Datenübertragung zwischen Parteien
  • Authentifizierung : Stellen Sie sicher, dass der Server, zu dem wir eine Verbindung herstellen, tatsächlich der richtige Server ist
  • Datenintegrität : Gewährleisten Sie, dass die angeforderten Daten effektiv geliefert werden

Java bietet mehrere sicherheitsbasierte APIs, mit denen Entwickler sichere Verbindungen zum Client herstellen können, um Nachrichten in einem verschlüsselten Format zu empfangen und zu senden:

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

In den nächsten Abschnitten stellen wir die Secure Socket Extension vor, mit der Java die sichere Kommunikation ermöglicht.

3. JSSE-API

Die Java-Sicherheits-APIs verwenden das Factory- Entwurfsmuster weitgehend.

Tatsächlich wird alles mithilfe einer Factory in JSSE instanziiert.

3.1. SSLSocketFactory

Die javax.net.ssl.SSLSocketFactory wird zum Erstellen von SSLSocket- Objekten verwendet.

Diese Klasse enthält drei Gruppen von APIs.

Die erste Gruppe besteht aus einer einzelnen statischen Methode getDefault () , mit der die Standardinstanz abgerufen wird, mit der wiederum SSLSocket- Instanzen erstellt werden können.

Die zweite Gruppe besteht aus fünf Methoden, die zum Erstellen von SSLSocket- Instanzen verwendet werden können:

  • 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, boolesches autoClose)

Wir können diese Klasse direkt verwenden, indem wir die Standardinstanz abrufen oder eine javax.net.ssl ​​verwenden. SSLContext-Objekt, das Methoden zum Abrufen einer SSLSocketFactory- Instanz enthält.

3.2. SSLSocket

Diese Klasse erweitert die Socket- Klasse und bietet einen sicheren Socket. Solche Sockets sind normale Stream-Sockets.

Darüber hinaus bieten sie eine Sicherheitsstufe für das zugrunde liegende Netzwerktransportprotokoll.

SSLSocket- Instanzen stellen eine SSL-Verbindung zu einem benannten Host an einem angegebenen Port her.

Dies ermöglicht das Binden der Clientseite der Verbindung an eine bestimmte Adresse und einen bestimmten Port.

3.3. SSLServerSocketFactory

Die SSLServerSocketFactory Klasse ist ganz ähnlich wie SSLSocketFactory mit dem Unterschied , dass es schafft SSLServerSocket Instanzen anstelle von SSLSocket Instanzen.

Durch die Ähnlichkeit werden die Verfahren genannt create als analog zu SSLSocketFactory Klasse.

3.4. SSLServerSocket

Die SSLServerSocket- Klasse ist analog zur SSLSocket- Klasse. Die Methoden der SSLServerSocket-Klasse sind eine Teilmenge der SSLSocket- Klassenmethoden. Sie wirken auf der gegenüberliegenden Seite einer SSL-Verbindung

4. SSL-Beispiel

Lassen Sie uns ein Beispiel geben, wie wir eine gesicherte Verbindung zu einem Server herstellen können:

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

Falls der Fehler "javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX-Pfaderstellung fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: Beim Einrichten des Ziels konnte kein gültiger Zertifizierungspfad gefunden werden SSL-Verbindung “bedeutet , dass wir nicht über das öffentliche Zertifikat des Servers verfügen, den wir im Java-Truststore verbinden möchten.

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. Importieren Sie das Zertifikat mit keytool in den Truststore: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Sobald wir dies getan haben, sollten wir in der Lage sein, das Beispiel erneut auszuführen und die Meldung Gesicherte Verbindung erfolgreich ausgeführt zu erhalten .

5. Schlussfolgerung

In diesem Artikel haben wir die SSL- und JSSE-API vorgestellt, die SSL für Java implementiert. Durch die Verwendung von SSL und JSSE können wir unsere Java-Anwendungen und die Kommunikation zwischen Anwendungen und innerhalb der Anwendung sicherer machen.

Wie immer ist der in diesem Artikel vorgestellte Code auf Github verfügbar.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs