Einführung in SSL in Java

Einführung in SSL in Java

1. Überblick

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, dieSecured Socket Layer (SSL) enables a secured connection between two parties, normalerweise Clients und Server.

SSL stellt einen sicheren Kanal zwischen zwei Geräten bereit, die über eine Netzwerkverbindung betrieben werden. Ein übliches Beispiel für SSL ist die Ermöglichung 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:

  • Encryption: Schützen Sie die Datenübertragung zwischen Parteien

  • Authentication: Stellen Sie sicher, dass der Server, zu dem wir eine Verbindung herstellen, tatsächlich der richtige Server ist

  • Data integrity: Gewährleistung, dass die angeforderten Daten effektiv geliefert werden

Java bietet verschiedene sicherheitsgerichtete 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-Erweiterung (JSSE)

  • Java Cryptography Architecture (JCA)

  • Java Cryptographic Extension (JCE)

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

3. JSSE API

Die Java-Sicherheits-APIs verwenden das Entwurfsmuster vonFactoryweitgehend.

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

3.1. SSLSocketFactory

Dasjavax.net.ssl.SSLSocketFactory wird zum Erstellen vonSSLSocket-Objekten verwendet.

Diese Klasse enthält drei Gruppen von APIs.

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

Die zweite Gruppe besteht aus fünf Methoden, mit denenSSLSocket-Instanzen erstellt 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 einjavax.net.ssl.SSLContext-Objekt verwenden, das Methoden zum Abrufen einerSSLSocketFactory-Instanz enthält.

3.2. SSLSocket

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

Darüber hinaus fügen sie eine Sicherheitsschicht über dem zugrunde liegenden Netzwerk-Transportprotokoll hinzu.

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

Dadurch kann die Clientseite der Verbindung an eine bestimmte Adresse und einen bestimmten Port gebunden werden.

3.3. SSLServerSocketFactory

Die KlasseSSLServerSocketFactory istSSLSocketFactory ziemlich ähnlich, mit dem Unterschied, dass sieSSLServerSocket Instanzen anstelle vonSSLSocket Instanzen erstellt.

In ähnlicher Weise werden die Methoden alscreateServerSocket bezeichnet, analog zuSSLSocketFactory Klasse.

3.4. SSLServerSocket

Die KlasseSSLServerSocketist analog zur KlasseSSLSocket. Die Methoden in der SSLServerSocket-Klasse sind eine Teilmenge der Klassenmethoden vonSSLSocket. Sie agieren 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 wir den Fehler“javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while establishing the SSL connection”,it indicates that we don’t have the public certificate of the server which we’re trying to connect in the Java truststore. erhalten

Der Truststore ist die Datei mit vertrauenswürdigen Zertifikaten, mit denen Java gesicherte Verbindungen überprüft.

Um dieses Problem zu lösen, haben wir mehrere Möglichkeiten:

  • Fügen Sie das öffentliche Zertifikat des Servers zu den von Java verwendeten Standardcacerts truststorehinzu. beim Einleiten der SSL-Verbindung

  • Stellen Sie die Umgebungsvariablejavax.net.ssl.trustStore o ein, dass sie auf die Truststore-Datei verweist, damit die Anwendung die Datei abrufen kann, die das öffentliche Zertifikat des Servers enthält, zu dem wir eine Verbindung herstellen.

Die Schritte zum Installieren eines neuen Zertifikats im Java-Standard-Truststore sind:

  1. Zertifikat vom Server extrahieren:openssl s_client -connect server:443

  2. Zertifikat mit Keytool in Truststore importieren: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 NachrichtSecured connection performed successfullyzu erhalten.

5. Fazit

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 Codeover on Github verfügbar.