# SSL Verbindung ohne Zertifikat



## Grizzly (4. Nov 2005)

Anlehnend an den Thread No trusted certificate found (der leider ein Häckchen hat, das nicht mehr zu löschen ist), hätte ich folgendes Problem (ich weiss, steht in dem Thread auch schon - aber das Häckchen...):

Ich möchte per SSLSocket und SSLServerSocket eine Verbindung aufbauen. Allerdings ohne Zertifikat.

Mein Quellcode sieht so aus (erst Client, dann Server):

```
import javax.net.SocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;

public class SSLClient {

	public static void main(String[] args) {
		SSLSocket ssl;
		SSLContext sc;
		SocketFactory sf;
		
		try {
			sc = SSLContext.getInstance("SSL");
			sc.init(null, new TrustManager[]{new TrustAllManager()}, null);
			sf = sc.getSocketFactory();
			ssl = (SSLSocket) sf.createSocket("localhost", 25000);
			
			ssl.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}
```


```
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;

import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;

public class SSLServer {

	public static void main(String[] args) {
		SSLServerSocket ssl;
		SSLSocket socket;
		SSLContext sc;
		SSLServerSocketFactory sf;
		
		try {
			sc = SSLContext.getInstance("SSL");
			sc.init(null, new TrustManager[]{new TrustAllManager()}, null);
			sf = sc.getServerSocketFactory();
			ssl = (SSLServerSocket) sf.createServerSocket(25000);
			socket = (SSLSocket) ssl.accept();
			if (socket != null) {
				System.out.println(socket.getPort());
			}
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}
```

Die Klasse TrustAllManager sieht folgendermaßen aus:

```
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAllManager implements X509TrustManager {
	public TrustAllManager() {
		super();
	}
	
	public void checkClientTrusted(final X509Certificate[] chain,
		final String authType) throws CertificateException {
	}
	
	public void checkServerTrusted(final X509Certificate[] chain,
		final String authType) throws CertificateException {
	}
	
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
}
```

Beim Server kommt aber immer die Meldung (Die Zeilenummer der Exception - 28 - stimmt wahrscheinlich nicht, da ich einige Sachen herausgenommen habe - ist aber in der Zeile von ssl.accept() ):

```
javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
	at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(SSLServerSocketImpl.java:303)
	at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(SSLServerSocketImpl.java:253)
	at test.SSLServer.main(SSLServer.java:28)
```



Irgendwelche Ideen, wie man das hinbekommt?


----------



## Grizzly (8. Nov 2005)

Kommt, jetzt sagt bloss, ich bin der erste Mensch, der so etwas in Java realisieren will, und das vor mir das noch nie einer probiert hat. :?


----------



## tuxedo (11. Nov 2005)

Ich habe dafuer eine fertige API genommen... Weiss nur gerade wie die heisst. Damit kannst du SSH Verbindungen aufbauen und damit dein eigenes "putty" schreiben, Verbindungen tunneln, und und und und...Beinahe alles was man mit SSH eben machen kann. Und eben auch Verbindungen mit und ohne Zertifikat etc...

Wenn ich dran denke schau ich heute Abend nach wie die API hiess.. War jedenfalls OpenSource.

gruss
Alex


----------



## Grizzly (11. Nov 2005)

Das wäre super. Vor allem: Wenn das Teil Open Source ist, kann ich auch reinschauen, wie die das machen. Ich denke mal, dass die auch die Java Funktionen irgendwie benutzen werden.


----------



## tuxedo (12. Nov 2005)

Hier:

http://www.ganymed.ethz.ch/ssh2/

Viel Spass damit.. 

gruss
Alex


----------



## Grizzly (12. Nov 2005)

Schankedön. 
Werde es mir gleich mal anschauen.


----------



## Grizzly (12. Nov 2005)

So, hab' das mal überflogen. Ich könnte mich ja irren - aber die Bibliothek behandelt SSH2 Verbindungen, nicht SSL.  
Ich möchte nur verschlüsselt Daten übertragen - keine Terminal Sitzung aufmachen.


----------



## tuxedo (14. Nov 2005)

Oh, dann hab ich mich wohl krass verlesen.. sorry...Ist ja beinah das selbe 

Gruss
Alex


----------



## Bleiglanz (14. Nov 2005)

@alex

ich frage mich ehrlich gesagt schon die ganze Zeit ob das geht, bin aber ebenfalls schon die ganze Zeit zufaul das nochmal nachzulesen

-> wenn du kein Zertifikat für den Server hast, kann dann der SSL-Handshake überhaupt durchgeführt werden?? Woher bekommt der Client in dem Fall den öffentlichen Schlüssel des Servers, den er braucht um diesem sein Secret zu schicken?

oder lieg ich da jetzt falsch...


----------



## Grizzly (16. Nov 2005)

Hmm, hab mich mal auf Wikipedia.de etwas schlau gemacht. Anscheinend geht es schon, ist aber nicht zu empfehlen. Heisst, ich kann entweder gleich selber verschlüsseln oder ich muss für beide Seiten Zertifikate erstellen.


----------

