# No trusted certificate found



## alert0h52 (25. Aug 2005)

Bekomme folgende Fehlermeldung
_javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found_

tritt nur bei servern mit einem ungültigen Zertifikat auf.

gibt es eine Möglichkeit die Prüfung nach der Gültigkeit zu deaktivieren, so dass die Seite
trotz des ungültigen Zertifikats geladen wird?


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;


public class Https {

	public static void main(String[] args)  {
		
		try{
	              URL url = new URL( "https://www.irgendeineSeiteMitUngueligemZertifikat.de" );

	              Reader is = new InputStreamReader( url.openStream() );
	              BufferedReader in = new BufferedReader( is );

	              for ( String s; ( s = in.readLine() ) != null; )
	      	     System.out.println( s );
	      
	              in.close();
	          }
		 catch ( MalformedURLException e ) {
	    	     System.out.println( "MalformedURLException: " + e );
	          }
	          catch ( IOException e ) {
	    	     System.out.println( "IOException: " + e );
	          }
		

	}
    
}
```


----------



## Guest (29. Aug 2005)

hi, klar ist das moeglich.
um die pruefung ausser kraft zu setzen, kannst du den trustmanager ueberschreiben. zustaetzlich wirst du wahrscheinlich auch den hostname-verfifier ueberschreiben muessen. hier ein beispiel, was einfach alles aktzeptiert:


```
public static void main(String[] args)  {
  // trustmanager der alles akzeptiert
  TrustManager[] trustAll = new TrustManager[]{
    new X509TrustManager() {
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; }
      public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
    }
  };

  // name verifier, der alles akzeptiert
  HostnameVerifier nameVerifier = new HostnameVerifier() { 
    public boolean verify(String name, SSLSession session)  {return true;}
  };

  SSLContext sc  = null;
  try{
    sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAll,null);
  } catch(Exception e) {e.printStackTrace();};

  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  HttpsURLConnection.setDefaultHostnameVerifier(nameVerifier);

   // dein code
  try{
     URL url = new URL( args[0] );
     Reader is = new InputStreamReader( url.openStream() );
     BufferedReader in = new BufferedReader( is );

     for ( String s; ( s = in.readLine() ) != null; )
       System.out.println( s );
...
```

hth


----------



## alert0h52 (29. Aug 2005)

danke, hat geholfen.


----------



## Grizzly (25. Okt 2005)

Ähm, dumme Frage: Die Verbindung wird aber trotzdem verschlüsselt. Nur die Authorisierung per Zertifikat fällt weg, oder? :bahnhof:


----------



## Mag1c (25. Okt 2005)

Moin,

ist keine dumme Frage  natürlich wird trotzdem verschlüsselt. Der Fehler bezieht sich ja auf die Identität des Servers und hat nichts mit dem Verschlüsseln zu tun.

Gruß
Mag1c


----------



## Grizzly (26. Okt 2005)

Okay, danke.


----------



## Grizzly (2. Nov 2005)

Jetzt muss ich doch nochmal nachfragen - ich verwende nämlich direkt Sockets und keine HttpsURLConnection.
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 enthält den Code, der ihm obigen Beispiel steht, entsprechend.

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)
```


----------



## olden (30. Apr 2006)

Hallo zusamm

Ich habe auch dieses Problem mit:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

Allerdings möchte ich gern Zertifikate benutzen!!! Ich habe mich an folgendes Beispiel gehalten und leider 
bekomme ich immer oben genannt Fehlermeldung.

Link: http://www.linuxfocus.org/English/March2003/article285.shtml

I bin folgendermassen vorgegeangen

1. Erstellen der Schlüssel für den Server

```
keytool -genkey -alias serverprivate -keystore servestore -keyalg rsa -keysize 2048
```

2. exportieren des Schlüssels

```
keytool -export -alias serverprivate -keystore -rfc servestore -file server.cer
```

3. importieren des Schlüssels

```
keytool -import -alias trustservercert -file server.cer -keystore clienttruststore
```

Das gleiche für den Clienten

1. Erstellen der Schlüssel für den Clienten

```
keytool -genkey -alias clientprivate -keystore clientstore -keyalg rsa -keysize 2048
```

2. exportieren des Schlüssels

```
keytool -export -rfc -alias clientprivate -file client.cer -keystore clientstore
```

3. importieren des Schlüssels

```
keytool -import -alias trustclientcert -file client.cer -keystore servertruststore
```

Dann habe ich den Server gestartet:

```
java SSLRelayServer servestore clienttruststore storepass1 prikeypass0 2222 5432
```

Dann den Clieneten:

```
java RelayApp clientstore servertruststore storepass2 prikeypass1 localhost 2222 2002
```

...bis hier hin funktioniert alles einwandfrei

Dann habe ich in einer neuen Konsole folgendes eingegeben:

```
psql -U MyUserName -W MyDataBase -h localhost -p 2002
```

Und bekomme diese Fehlermeldung
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

Info: Die Datenbank arbeitet fehlerfrei, es kann also nicht daran liegen

Was mache ich bitte falsch beim erstellen der Schlüssel?

btw. des Keytool ist das Tool von Sun

Über hlfreiche Tipps wäre ich sehr dankbar

MfG olden

NACHTRAG!!!!

Habe das PROBLEM selbst gelöst:

Client muss mit dem clienttruststore gestartet werden

```
java RelayApp clientstore clienttruststore storepass2 prikeypass1 localhost 2222 2002
```


----------

