No trusted certificate found

Status
Nicht offen für weitere Antworten.
A

alert0h52

Gast
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?

Code:
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 );
	          }
		

	}
    
}
 
G

Guest

Gast
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:

Code:
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
 

Grizzly

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

Mag1c

Top Contributor
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

Top Contributor
Jetzt muss ich doch nochmal nachfragen - ich verwende nämlich direkt Sockets und keine HttpsURLConnection.
Mein Quellcode sieht so aus (erst Client, dann Server):
Code:
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();
		}
	}
}
Code:
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() ):
Code:
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

Neues Mitglied
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
Code:
keytool -genkey -alias serverprivate -keystore servestore -keyalg rsa -keysize 2048

2. exportieren des Schlüssels
Code:
keytool -export -alias serverprivate -keystore -rfc servestore -file server.cer

3. importieren des Schlüssels
Code:
keytool -import -alias trustservercert -file server.cer -keystore clienttruststore

Das gleiche für den Clienten

1. Erstellen der Schlüssel für den Clienten
Code:
keytool -genkey -alias clientprivate -keystore clientstore -keyalg rsa -keysize 2048

2. exportieren des Schlüssels
Code:
keytool -export -rfc -alias clientprivate -file client.cer -keystore clientstore

3. importieren des Schlüssels
Code:
keytool -import -alias trustclientcert -file client.cer -keystore servertruststore

Dann habe ich den Server gestartet:
Code:
java SSLRelayServer servestore clienttruststore storepass1 prikeypass0 2222 5432

Dann den Clieneten:
Code:
java RelayApp clientstore servertruststore storepass2 prikeypass1 localhost 2222 2002

...bis hier hin funktioniert alles einwandfrei

Dann habe ich in einer neuen Konsole folgendes eingegeben:
Code:
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
Code:
java RelayApp clientstore clienttruststore storepass2 prikeypass1 localhost 2222 2002
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben