# Mehrere SSL Verbindungen



## Gast_Michael (19. Mai 2006)

Hi, ich schreibe eine Anwendung, in der ich mehrere gesicherte Verbindungen zu anderen Servern herstellen möchte. Mit einer habe ich kein Problem, dann erstelle ich eine SSLSocket- Verbindung, die über die System Properties javax.net.ssl.keyStore und trustStore.

Das Problem beginnt, wenn ich eine zweite, zu einem andern Server aufbauen möchte. Mein Testcode sieht folgendermassen aus (und klappt natürlich gar nicht):


```
System.setProperty("javax.net.ssl.keyStore", "c:/keystore1");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStore", "c:/keystore1");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket("server1", 1099);
s.startHandshake();
System.out.println("Handshake1 klappt");
			
System.setProperty("javax.net.ssl.keyStore", "c:/keystore2");
System.setProperty("javax.net.ssl.keyStorePassword", "tetappl");
System.setProperty("javax.net.ssl.trustStore", "c:/keystore2");
System.setProperty("javax.net.ssl.trustStorePassword", "tetappl");
s = (SSLSocket) SSLSocketFactory.getDefault().createSocket("server2", 636);
s.startHandshake();
System.out.println("Handshake klappt2");
```

Wie mache ichs besser?


----------



## Gast_Michael (22. Mai 2006)

Ich pusche die Frage noch mal hoch. Hat denn niemand ne Idee, wie man das macht? Von der Sache her glaube ich, dass ich mehrere SSLSocketFactorys erstellen muss, denen ich nur jeweils eigene Keystore-Files und Passwörter zuweisen muss, aber ich finde nirgends Infos dazu.
Wenn schon keine komplette Lösung, hat vielleicht jemand ein Suchbegriffe für mich?

Gruß Michael


----------



## Gast_Michael (22. Mai 2006)

An alle, die irgendwann mal hier reinstolpern und das selbe Problem haben:


```
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class SSLSocketFactoryCreator {
	SSLContext context;
	
	public SSLSocketFactoryCreator(String filename, String password)  throws KeyStoreException, NoSuchAlgorithmException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException
	{
    	KeyManagerFactory keystorefactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    	KeyStore keystore = KeyStore.getInstance("JKS");
    	keystore.load(new FileInputStream(filename), password.toCharArray());
    	keystorefactory.init(keystore, password.toCharArray());
    	
    	TrustManagerFactory trustmanagerfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    	trustmanagerfactory.init(keystore);
    	
    	context = SSLContext.getInstance("SSL");
    	context.init(keystorefactory.getKeyManagers(), trustmanagerfactory.getTrustManagers(), null);

	}
	
	public SSLSocketFactory getSSLSocketFactory()
	{
	   	return context.getSocketFactory();
	}
	
	public SSLServerSocketFactory getSSLServerSocket()
	{
		return context.getServerSocketFactory();
	}
	
	public static void main(String[] args) {
		try
		{
			SSLSocketFactoryCreator m = new SSLSocketFactoryCreator("c:/keystore1", "tetappl");
			SSLSocket s = (SSLSocket) m.getSSLSocketFactory().createSocket("server1", 636);
			s.startHandshake();
			
			SSLSocketFactoryCreator n = new SSLSocketFactoryCreator("c:/keystore2", "123456");
			SSLSocket t = (SSLSocket) n.getSSLSocketFactory().createSocket("server2", 1099);
			t.startHandshake();
		}
		catch(Exception e)
		{
			System.out.println(e);
		}
	}
}
```

Gruß Michael


----------

