# TCP SSL Verbindung



## Generic1 (20. Jan 2010)

Hallo,

ich möchte zwei Java Programme (Client und Server) über TCP verbinden und mit SSL verschlüsseln. Diesen Code habe ich bis jetzt mal, kenn mich aber mit der Zertifizierung nicht so aus. Vielleicht könnte mir jemand schreiben, wie ich es auf die Reihe bekomme, das Client und Server das gleiche Zertifikat benutzen. Besten Dank, 

Momentan bekomme ich folgende Exception:

```
Ausnahme Klasse EncryptedConnection, Methode connectToServer2: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
```

Server- Programm:

```
public void serverSocketStart() {
        try {
            final SSLServerSocketFactory ssocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            final SSLServerSocket sslServerSocket = (SSLServerSocket)ssocketFactory.createServerSocket(port);
            final String[] enabledCipherSuites = {"SSL_DH_anon_WITH_RC4_128_MD5"};
            sslServerSocket.setEnabledCipherSuites(enabledCipherSuites);
            sslServerSocket.setReuseAddress(true);
            System.out.println("SSL factory started..");
            System.out.println("Listening for connections on port " + port);
            while (true) {
                try {
                    final SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept();
                    clientCounter++;
                    System.out.println("Client " + clientCounter + " verbunden");
                    final ServerThread serverThread = new ServerThread("DataServerTcpipVerbindung " + clientCounter, sslSocket);
                    serverThread.setName("TCP/SSLConnection");
                    serverThread.start();
                    }
                catch (Exception e) {
                    System.out.println("Ausnahme Klasse EncryptedConnection, Methode serverSocketStart: " + e);
                    }
                }
            }
        catch (Exception e) {
             e.printStackTrace();
            }
        }
```

Client- Programm:

```
public boolean connectToServer() {
        boolean result = false;
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());      
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        try {
            try {
                SSLContext context = null;
                try {
                    context = SSLContext.getInstance("SSL");
                    context.init(null, createTrustManager(), new java.security.SecureRandom());
                    }
                catch (Exception ex) {
                    System.out.println("Ausnahme Klasse EncryptedConnection, Methode connectToServer1: " + ex);
                    }
                final SSLSocketFactory dfactory = context.getSocketFactory();
                sslSocket = (SSLSocket)dfactory.createSocket(host, port);
                try {
                    System.out.println("Vor dem handshake: " + sslSocket.isConnected());
                    sslSocket.startHandshake();
                    System.out.println("Nach dem handshake: " + sslSocket.isConnected());
                    }
                catch (Exception ex) {
                    System.out.println("Ausnahme Klasse EncryptedConnection, Methode connectToServer2: " + ex);
                    }
                result = true;
                }
            catch (UnknownHostException ex) {
                System.out.println("Ausnahme Klasse EncryptedConnection, Methode connectToServer3: " + ex);
                return false;
                }
            //then here you can start using the socket object
            }
        catch (IOException ex) {
            ex.printStackTrace();
            }
        return result;
        }
```


----------



## FArt (20. Jan 2010)

Installing and Configuring SSL Support
Debugging SSL/TLS connections


----------



## Generic1 (20. Jan 2010)

Ok, ich hab jetzt mal den ersten Schritt hinbekommen indem ich mir 2 keys mit dem Tool keytool generiert habe und beim Starten des Servers gebe ich an:


```
-cp ./bin -Djavax.net.ssl.keyStore=./keys/server.jks -Djavax.net.ssl.keyStorePassword=test123 -Djavax.net.ssl.trustStore=./keys/client.jks -Djavax.net.ssl.trustStorePassword=test123
```

und beim Starten des Clients muss ich das als VM- Option mitgeben, damit meine beiden keys gefunden werden.


```
-cp ./bin -Djavax.net.ssl.keyStore=./keys/client.jks -Djavax.net.ssl.keyStorePassword=test123 -Djavax.net.ssl.trustStore=./keys/server.jks -Djavax.net.ssl.trustStorePassword=test123
```

(Beruhigt Euch, ich hab da ein anderes Passwort hingeschieben)

Das ist soweit mal OK, mein problem ist aber nun, dass 2 Web- Applikationen verbunden werden (Tomcat Server) und ich nicht unbedingt die VM- Optionen beim starten mitgeben will.

Meine Frage wäre jetzt, gehts auch so, dass ich keine externen *.jks Dateinen benötige sondern irgendwas in den Code schreibe?
lg


----------



## FArt (20. Jan 2010)

In den Code schreiben (gerade in einem Container) ist in der Regel dämlich. Ein Container lässt sich aber in der Regel konfigurieren.

tomcat ssl - Google-Suche


----------

