Socket in SSL - Mode bringen

Status
Nicht offen für weitere Antworten.

REDBARON

Mitglied
Hallo Community,

es existiert eine selbstsignierte CA. Das Serverzertifikat und das Clientzertifikat
ist von dieser CA signiert. Die Zertifikate sind in Ordnung und funktionieren mit
einer anderen Anwendung. Die Zertifikate liegen im PEM Format als base46 String
vor.

Aufgabe:
Ein verbundener Socket soll in SSL-Mode versetzt werden soll.

Problem:
ich bin noch recht neu bei Java, Zielplatform ist "Android" - OS.

Die bestehende Lösung sieht wie Folgt aus: ( C++ Code, openSSL )

// Methode festlegen
m_pSSLMethod = TLSv1_client_method();
// Context erstellen
m_pSSLContext = SSL_CTX_new(m_pSSLMethod);
// Serverzertifikat, nicht in Cert-chain einer der großen bekannten CAs enthalten !
SSL_CTX_load_verify_locations(m_pSSLContext, CA_CERT);
// Clientzertifikat laden
SSL_CTX_use_certificate_file(m_pSSLContext, CERT_CLIENT, SSL_FILETYPE_PEM);
// Clientkey laden
SSL_CTX_use_PrivateKey_file(m_pSSLContext, PRIV_CLIENT, SSL_FILETYPE_PEM);

soweit die Vorbereitungen, und nun der SSL-Handshake

// SSL initalisieren ...
m_pSSL = SSL_new(m_pSSLContext);
// ... den bereits verbundenen Socket an SSL Layer übergeben
SSL_set_fd(m_pSSL, m_sock);
// ... Status setzten
SSL_set_connect_state(m_pSSL);
// Handshake
SSL_do_handshake(m_pSSL);


Wie sieht aber nun der Ablauf in Java aus ?
Ich habe bisher nur folgenden Einstieg:

SSLContext ctx = SSLContext.getInstance("TLS");
SSLSessionContext sessctx = ctx.getClientSessionContext();

// wie läd man hier die Zertifikat-Strings in den Context ?
// wie wird der Context mit dem SSL-Socket "verbunden"

SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);

c.startHandshake();

Ergebnis:
Der Server sendet sein Zertifikat, es wird eine "not trusted"-Exception gewurfen.
Trustet kann das Zerti auch erst sein, nachdem der Client das ServerZert *irgendwie*
geladen hat. Zudem muss der Client auch sein Zertifikat und private Key laden um
Daten verschlüsselt senden zu können.

Anwendung soll das ganze finden beim Datenaustausch mit einem MySQL-Server.
Das Protokoll ist soweit schon implementiert, nur die Umschaltung in SSL fehlt noch.


Ich habe schon einige Tuturial angesehen und auch im Forum gesucht, nur vll.
kennt das jemand - den Wald vor Bäumen nicht zu sehen ;(

Ich freue mich jedenfalls über jede sachdienliche Hinweise :)

Viele Grüße, RB

Edit: neuer Code in Anlehnung an:
http://www.java-forum.org/netzwerkprogrammierung/79529-https-einloggen.html#post491246


Java:
		final 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){}
 
        }};
		
			new MySQLLoginPacket40(user, passwd, mServer, mSocket.getOutputStream());
			if( (mServer.mCapabilities & MySQLServerPacket.CLIENT_SSL) > 0)
			{
				
				SSLContext ctx = SSLContext.getInstance("TLS");
				ctx.init(null, trustAllCerts, new java.security.SecureRandom());
				
				SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
				SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
				
				
				c.startHandshake();
				c.getOutputStream();
			}

Ergebnis: Exception: not trusted server certificate
 
Zuletzt bearbeitet:

REDBARON

Mitglied
Danke, ja eigener TrustStore ist leicht gesagt :)

Neuer Code im wesentlichen jetzt:
Java:
		final 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){}


				SSLContext ctx = SSLContext.getInstance("TLS");
				ctx.init(null, trustAllCerts, new java.security.SecureRandom());
				
				SSLSocketFactory f = ctx.getSocketFactory();
				//SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
				SSLSocket c =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
						
				c.startHandshake();

die Exception "not trusted server certificate" erscheint nicht mehr, die Verbindung
zwischen Ctx und SocketFactory ist mir jetzt auch irgendwie klar gewurden :toll:

Ich werde erstmal schauen warum der Client auch ein Zerti braucht ... hatte mein
C++ Beispiel aus den MySQL Quellen abgeschaut. Vll. ist es technisch auch nicht
ganz so wichtig ... wenn der Client seine Daten mit dem Server public Key verwurstet
sollte es dem Server auch möglich sein die Daten zu entschlüsseln ...
 

REDBARON

Mitglied
Das Problem was sich mir jetzt noch darstellt, ist:
der neue SSLSocket ist nicht verbunden nach :

Java:
				SSLContext ctx = SSLContext.getInstance("TLS");
				ctx.init(null, trustAllCerts, new java.security.SecureRandom());
				SSLSocketFactory f = ctx.getSocketFactory();
				mSSLSocket =(SSLSocket)f.createSocket(mSocket, mHost, mPort, false);
				mSSLSocket.startHandshake();

mSSLSocket.HandshakeStartet ist true. Ich sehe auch das Server Zertifikat
in einem der Context Member, der Server hat definitiv sein Zertifikat übermittelt.

Nur Senden und Empfangen funktioniert über den SSLSocket nicht. Beim Senden
passiert nichts und beim Empfangen kommt, Exception I/O Error .

mSSLSocket.isConnected = false;

Seltsam. :rtfm:
 

REDBARON

Mitglied
Code:
mSSLContext = SSLContext.getInstance("TLS");
mSSLContext.init(null, trustAllCerts, new java.security.SecureRandom());
mSSLSocketFactory = mSSLContext.getSocketFactory();
mSSLSocket = (SSLSocket)mSSLSocketFactory.createSocket(mSocket, mHost, mPort, false);
mSSLSocket.addHandshakeCompletedListener(new MyHandshakeListener());
mSSLSocket.startHandshake();
				
mServer.mSSLLogin = true;
new MySQLLoginPacket40(user, passwd, mServer, mSSLSocket.getOutputStream());

Das Problem ist wie ich festgestellt habe weniger die SLL Mimik, sondern das ich etwas
anderes erwarte von mSSLSocket.getOutputStream() als mir geliefert wird.

Der SSL HandShakeCompleteHandler wird aufgerufen, keine Exceptions treten auf.
mSSLSocket.isConnected = false
mSSLSocket.Socket.isConnected = true

ein mSSLSocket.getOutputStream() liefert nicht den darunterliegenden Socketstream
welcher als verbunden markiert ist sondern den ssl-stream welcher nicht verbunden ist.

egal über welchen stream ich sende, exception: broken pipe.
Wenn irgendwas mit dem SSL Zeugs nicht stimmen würde aus Richtung Zertis sollte
doch eine Exception kommen !

Könnte es sein, die Darwin VM von Android OS hat ne Macke ?
 

FArt

Top Contributor
Kann ich dir nicht sagen. Probiere es halt erst mal von einer "normalen VM" aus...

noch mal zu vorher: der Client muss das Zertifkat nur dann importieren, wenn es als nicht vertrauenswürdig angesehen wird, wie z.B. selbsterstellte Zertifikate.
 

REDBARON

Mitglied
Hallo, ich habe Teilerfolg zu verkünden :D

meine Socketumschaltung sieht jetzt so aus:
Code:
if( (mServer.mCapabilities & MySQLServerPacket.CLIENT_SSL) > 0)
{	
	mSSLContext = SSLContext.getInstance("TLS");
	mSSLContext.init(null, trustAllCerts, null); //new java.security.SecureRandom());
	mSSLSocketFactory = mSSLContext.getSocketFactory();
	mSocket = (SSLSocket)mSSLSocketFactory.createSocket(mSocket, mHost, mPort, true);
	//((javax.net.ssl.SSLSocket)mSocket).setEnabledProtocols(new String[] { "TLSv1" });
	((javax.net.ssl.SSLSocket)mSocket).addHandshakeCompletedListener(new MyHandshakeListener());
	((javax.net.ssl.SSLSocket)mSocket).startHandshake();				
	mSocket.getOutputStream().flush();
				
	mServer.mSSLLogin = true;
	new MySQLLoginPacket40(user, passwd, mServer, mSocket.getOutputStream());
				
	mCommand = new MySQLCommand(mServer, mSocket);
	packet = new MySQLPacket(mSocket.getInputStream(), true);
}

habe etwas im jdbc Treiber gestöbert und bin in ExportControlled.java fündig gewurden.

Diese Zeile stammt daraus, macht aber Probleme auf Android, daher kommentiert
//((javax.net.ssl.SSLSocket)mSocket).setEnabledProtocols(new String[] { "TLSv1" });

Fehler: unknown protocol

... und trozdem funktioniert es :autsch: obwohl im jdbc als Komentar verfasst ist zur Zeile:
// need to force TLSv1, or else JSSE tries to do a SSLv2 handshake
// which MySQL doesn't understand

ob nun daran lag weiß ich nicht aber, die Zeile
mSocket.getOutputStream().flush();

nach dem handshake ist auch neu und dem jdbc Treiber entnommen.

und die letzte Änderung betrifft
MySQLLoginPacket40(user, passwd, mServer, mSocket.getOutputStream());

hier wurde die Paketnummer 1 verwendet, obwohl es Paket 2 ist, was aber auch
nur für den Fall "SSL" zutrifft, sonst ist es Paket 1.

Ergebnis:

Anmeldung am Server : ok
Selektierung einer DB : ok
Absenden einer Abfrage : ok

( laut process list des servers )

was noch fehlt sind die Resultpackets ... :rtfm:

Das clientseitige Zertifikat wird übrigens nicht verwendet wie es beim jdbc
notwendig ist. Dadurch ist allerdings eine MITM-Attack möglich !
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
B Versuch mit Socket etwas zu lesen und zu schreiben Netzwerkprogrammierung 15
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
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
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
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
D Socket Run Args Client/Server Socket 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 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
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
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
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
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
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
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
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
T Socket blockierter Socket Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
D RMI oder Socket Netzwerkprogrammierung 4
H Socket Socket listening Netzwerkprogrammierung 11
D Client Socket mit Eventlistener? Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Netzwerkprogrammierung 18
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
J Socket Socket Programmierung. Wie anfangen? Netzwerkprogrammierung 4
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
Dit_ FTP Download | "PassiveMode"-Socket öffnen Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben