SSL Socket zu IRC Server aufbauen?

sh

Aktives Mitglied
Hi!

Ich wollte - in erster Linie zur Übung - einen kleinen IRC-Channel-Bot schreiben. Funktioniert alles auch prima, kann für
bestimmte User bestimmte Commands erlauben, wie zB. "!quote", woraufhin der Bot dann ein zufälliges Zitat ausspuckt.

Nur jetzt wollt ich das ganze auch mit optionalem SSL versehen, da manche Server die Clients nur über SSL connecten lassen.

Soweit hab ich das ganze mal angefangen:

Code:
	public void connectSSL(String serv, int port) {
		try {
            
		    SocketFactory socketFactory = SSLSocketFactory.getDefault();
		    Socket socket = socketFactory.createSocket(serv, port);

		    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    
		    String data;
		    while((data = br.readLine()) != null) {
		    	System.out.println(data);
		    	//parse data here
		    }
		    
		    socket.close();
		    br.close();

		} catch(IOException e) {
			System.err.print(e);
		}

	}


Und sogleich diesen Fehler hier bekommen:
Code:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Also erstmal Google gefragt und herausgefunden:
- Die Methode ansich baut schon eine sichere Verbindung auf
- Manche IRC Server (scheinbar auch der, auf den ich meinen Bot connecten lassen will) senden zuerst eine art "Test"-Zertifikat welches man dann irgendwie speichern und "laden" muss


Heady86 hat hier auch dieses Problem:
http://www.java-forum.org/soa/107453-ssl-verbindung-jupload.html
Allerdings noch keine Antworten zu seinem Thread.

Brauche ich, um auf den SSL Port eines IRCd connecten zu können eine Art HandShake am Anfang? Wenn ja, wie genau stellt man das an? Wie speicher ich dieses "Test"-Zertifikat?
Wäre dankbar für den link zu einem guten Tutorial oder einen kurzen Beispielcode anhand dessen ich nachvollziehen kann was da gemacht wird und wie das funktioniert.


Gruß
 

Murray

Top Contributor
Bei SSL sendet der Server ein Zertifikat, mit dem er bestatigt, das er auch wirklich der ist, der er zu sein vorgibt. Es obliegt dann dem Client, diesem Zertifikat zu trauen oder nicht.
In Java es ist so, dass das "Vertrauen" darin besteht, dass sich das jeweilige Zertifikat im Keystore befindet.
Man kann daher
- mit dem Browser der Wahl die HTTPs-URL angehen
- danach aus dem Brower das Zertifkat n eine Datei exportieren
- diese Datei mit keytool.exe (beim JDK und bei der JRE dabei) in den Keystore übernehmen
 

sh

Aktives Mitglied
Ist das auch direkt in meinem Programm automatisiert moeglich?

Da der Bot auf mehrere Netzwerke gleichzeitig connecten soll und mindestens 2 davon SSL benutzen und eventuell in Zukunft noch mehr Netzwerke dazukommen hätt ichs lieber alles automatisiert, also das ich nichts mehr von Hand dazu beisteuern muss, wie zB. das Zertifikat exportieren etc.

Vielen Dank für die Informationen das hilft schon weiter, da muss ich wohl Google nochmal nach SSL Referenz befragen.
 

sh

Aktives Mitglied

Auf die Idee bin ich auch schon gekommen, allerdings hab ich nur Beispiele für "Java KeyTool" gefunden - was natürlich nicht voll automatisch funktioniert.. Da muss ich selber das Zertifikat in die trustStore eintragen, soweit ich das verstanden hab, oder lieg ich da falsch?

Auch steht bischen was zu HttpURLConnection-Zertifikate "einfangen", allerdings connecte ich ja auf ein IRC Server und nicht auf eine Website.

Danke trotzdem!
 

sh

Aktives Mitglied
Ah jetz versteh ich das ganze langsam! Ja, danke, ich werds gleich mal ausprobieren wenn ich mal ne Stunde freizeit hab.

Grüße
 

sh

Aktives Mitglied
So, jetzt hab ich wieder mehr Zeit. Also, hab mal nochmal bei google geschaut und folgendes gefunden:
No more PKIX PATH Exceptions
InstallCert Example

Wenn ich das InstallCert.java nun ausfuehre sagt es mir es hat das Unsigned Certificate (nach dem hand-shake) in "cacerts" eingetragen.

Gut so weit, nur wie lade ich jetzt das Zertifikat wenn ich eine sichere Verbindung zu dem Server aufbauen will, dessen Zertifikat ich eben mit InstallCert gespeichert habe, aus dem KeyStore so das mein Programm sich mit diesem Zertifikat am Server anmeldet?

Kurz: Wie baue ich mit hilfe dieses Zertifikates jetzt eine SSLSocket-Verbindung zum Server auf?
 

sh

Aktives Mitglied
Deine Idee mit dem "eigenen TrustManager" hat mich einiges weiter gebracht, es scheint das der Socket jetzt eine Verbindung herstellen kann, ich bekomme auch die erste Zeile des IRC Protokolls zurück, nur
Komischerweise kann ich nichts senden, bzw. wenn ich etwas sende passiert einfach nichts.

Hier mal mein Test-Code:

Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


public class Main {
	public static void main(String... args) {
	
		// Create a trust manager that does not validate certificate chains
		TrustManager[] trustAllCerts = 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) {
		        }
		    }
		};

		// Install the all-trusting trust manager
		try {
		    SSLContext sc = SSLContext.getInstance("SSL");
		    sc.init(null, trustAllCerts, new java.security.SecureRandom());
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			PrintStream out = System.out;
		    SSLSocketFactory f = (SSLSocketFactory) sc.getSocketFactory();
		      try {
		         SSLSocket c = (SSLSocket) f.createSocket("irc.link-net.org", 7000);
		         c.startHandshake();
		         BufferedWriter w = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
		         BufferedReader r = new BufferedReader(new InputStreamReader(c.getInputStream()));
		         String m = null;
		         
		         while ((m=r.readLine())!= null) {
		        	out.println(m);
		        	if(m.contains("NOTICE AUTH :***")) {
				        sendRaw(c, "USER SMtest SMtest SMtest :SMTest");
				        sendRaw(c, "NICK SMtest");
		        	}
		            m = in.readLine();
		            w.write(m,0,m.length());
		            w.newLine();
		            w.flush();
		         }
		         w.close();
		         r.close();
		         c.close();
		      } catch (IOException e) {
		         System.err.println(e.toString());
		      }
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public static void sendRaw(SSLSocket socket, String command, Object... args) {
		try {
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write(String.format(command, args));
			System.out.println("RAW -> "+String.format(command, args));
			bw.newLine();
			bw.flush();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
	
}

Normalerweise sollte der Nutzer nach USER und NICK event am Chat-Server angemeldet sein und für andere Nutzer sichtbar werden.

Allerdings gehts bei mir einfach nicht weiter. Geh ich die Sache vll Komplett falsch an? Die funktion sendRaw() funktioniert bei meinem Original-Projekt und "normalem" Socket, also keine SSL Verbindung, prima.
 

sh

Aktives Mitglied
Ihr glaubt nicht worans lag.. am Routing zum Zielserver. Ich habe immer die ersten 2, 3 Protokoll-Zeilen empfangen und danach wars tot. Also hab ich mal die gleiche DNS benutzt mit mIRC und rausgefunden das die auf verschiedene zufällige IP-Adressen zeigt, wovon manche tot waren..

Also es funkt jetzt, hier nochmal für diejenigen die mal das gleiche Problem haben:

Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class Example {
	public static void main(String[] args) throws Exception {
		TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
				public java.security.cert.X509Certificate[] getAcceptedIssuers() {
					return null;
				}
				public void checkClientTrusted(X509Certificate[] certs, String authType) {
				}
				public void checkServerTrusted(X509Certificate[] certs, String authType) {
				}
			}
		};


		SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		

		
		SSLSocketFactory sslF = sc.getSocketFactory();
		SSLSocket sock = (SSLSocket) sslF.createSocket("irc.link-net.org", 7000);

		BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
		
		bw.write("USER SMtest SMtest SMtest :SMtest");
		bw.newLine();
		bw.flush();
		bw.write("NICK SMtest\r\n");
		bw.newLine();
		bw.flush();
		
		String str = null;
		while((str = br.readLine()) != null) {
			
			System.out.println(str);
		}

	}
}

Danke an alle für die Hilfe :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y server client socket verbindung übers internet aufbauen Netzwerkprogrammierung 8
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
Y client server socket via internet Netzwerkprogrammierung 8
A Socket Server-Socket wiederholt starten Netzwerkprogrammierung 3
E Socket HTTP-Server Netzwerkprogrammierung 6
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
P über Socket Kommando an Win2000-Server absetzen Netzwerkprogrammierung 12
N Über Socket an Linux-Server Kommandos absetzen? Netzwerkprogrammierung 4
B Server socket springt nicht gleich an Netzwerkprogrammierung 3
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
A http request per socket an apache server Netzwerkprogrammierung 5
M Vom Server per Socket Empfangen, aber wieviel Bytes? Netzwerkprogrammierung 11
D Server Socket läuft nicht -> java.net.SocketException: Netzwerkprogrammierung 4
D Habe 2 Probleme: Input eingabe und Multi Socket Server Netzwerkprogrammierung 2
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
G Socket Socket Kommunikation Netzwerkprogrammierung 1
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A TCP multiClientServer mit socket mittels ObjectOutputStream Netzwerkprogrammierung 12
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
F Einfache Socket Verbindung Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben