MySQL Datenbankzugriff mit SSL

Cyborg

Aktives Mitglied
Hi Leutz,

ich habe heute mehr oder weniger den halben Tag damit verbracht, eine SQL Abfrage + Antwort über mein Java-Test-Programm mittels SSL zu realisieren.

Da ich mich heute erst damit beschäftigt habe, habe ich leider keinerlei großes Hintergrundwissen bezüglich SSL.
Ich habe deshalb diverse Tutorials ausm Netz solange getestet, bis irgendwann irgendwas geklappt hat :D

Durch den User-Comment von Rahul Gupta konnte ich von der MySQL Seite alle nötigen .pem-Dateien erstellen.

Ein anschließender Test mit HeidiSQL, bestätigte mir, dass SSL eingerichtet ist und auch funktioniert. (konnte mich erfolgreich verbinden)

Dann wollte ich das ganze in Java einbauen und bin diesem Tutorial gefolgt.

keystore und truststore wurden erfolgreich erstellt und liegen jetzt auf D:\

Mein Testprogramm sieht wie folgt aus:

Java:
package mysqltest;

import java.sql.*;

public class Main
{
	public static void main (String[] args)
	{
		Connection con = null;
		try
		{
			String url = "jdbc:mysql://127.0.0.1:3306/test"+
				"?verifyServerCertificate=false"+
				"&useSSL=true"+
				"&requireSSL=true";
			String user = "ssluser";
			String password = "goodsecret";
      System.setProperty("javax.net.ssl.keyStore","D:/keystore");
      System.setProperty("javax.net.ssl.keyStorePassword","hallo");
      System.setProperty("javax.net.ssl.trustStore","D:/truststore");
      System.setProperty("javax.net.ssl.trustStorePassword","hallo");
			Class dbDriver = Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection(url, user, password);
    }
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		finally
		{
			if (con != null)
			{
				try
				{
					con.close();
				}
				catch (Exception e){}
			}
		}
	}
}

Wenn ich dieses jedoch ausführe, erhalte ich eine SQL Exception:
Code:
java.sql.SQLException: Access denied for user 'ssluser'@'localhost' (using password: YES)

User und PW sind 100% korrekt.
Mit meinem HeidiSQL habe ich keine Probleme damit.

Ich vermute, dass es an der fehlerhaft eingebundenen SSL Verschlüsselung liegt.
Denn wenn ich im HeidiSQL die Zertifikate weglasse und versuche mich mit dem User einzuloggen, dann bekomm ich exakt den selben Fehler.

Nun die Frage: Wo steckt der doofe Fehler? :)
 
G

Gast2

Gast
Schon mal so versucht wie es auf der MySQL Seite steht:

Java:
import java.sql.*;

public class HelloWorld{
public static void main(String args[]){
System.out.println("Starting program");
try {
//Register the JDBC driver for MySQL.
Class.forName("com.mysql.jdbc.Driver");

String url =
"jdbc:mysql://localhost:3306/mysql?useSSL=true&requireSSL=true";

Connection con =
DriverManager.getConnection(
url,"javatestuser", "secretpassword");

//Display URL and connection information
System.out.println("URL: " + url);
System.out.println("Connection: " + con);

con.close();
} catch(Exception ex){
ex.printStackTrace();
}
}
}

8. compile and run the program
$ javac HelloWorld.java
$ java \
-Djavax.net.ssl.keyStore=/home/ca/java/keystore \
-Djavax.net.ssl.keyStorePassword=passpass \
-Djavax.net.ssl.trustStore=/home/ca/java/truststore \
-Djavax.net.ssl.trustStorePassword=passpass \
-Djavax.net.debug=all \

Dein connect String sieht zum Beispiel anders aus. System.setProperty nutze ich meist auch lieber nicht sondern verwende die -D option. Probier doch mal diesen Sample Code aus.
 

Cyborg

Aktives Mitglied
hmm, entweder ich machs noch falsch. oder es geht auch nicht.

Code:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

habe eben noch ein bisschen runtergescrollt und bin auf folgendes gestoßen:

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
 
Zuletzt bearbeitet:

Cyborg

Aktives Mitglied
eventuell bin ich jetzt ein stückchen weiter.

Wenn ich den Code von fassy mit den angegebenen Parametern start, bekomm ich folgende Ausgabe und danach, folgende Exception.

Ausgabe: Starting program keyStore is : D:\\keystore keyStore type is : jks keyStore p - Pastebin.com
Exception:
Java:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Cannot connect to MySQL server on 127.0.0.1:3306.

Make sure that there is a MySQL server running on the machine/port you are trying to connect to and that the machine this software is running on
ed). Also make sure that the server has not been started with the --skip-networking flag.


        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
        at com.mysql.jdbc.Util.getInstance(Util.java:382)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:827)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:378)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at HelloWorld.main(HelloWorld.java:13)
Caused by: java.lang.UnsupportedOperationException: The method shutdownInput() is not supported in SSLSocket
        at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.shutdownInput(BaseSSLSocketImpl.java:180)
        at com.mysql.jdbc.MysqlIO.forceClose(MysqlIO.java:509)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2404)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2163)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794)
        ... 11 more

Der Mysql Server ist definitiv Online!!
 
G

Gast2

Gast
Das entscheidende ist das hier:
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

Du "traust" deinen self-signed Zertifikaten nicht ;)

Howardism: Accepting Self-Signed SSL Certificates in Java
 

Cyborg

Aktives Mitglied
was ist denn das für eine Grütze.
ich dachte ich mach den ganzen keystore und truststore quatsch um mir weiteres gefummel zu ersparen. -.-
 
G

Gast2

Gast
mit einem "offiziel" gesignten Zertifikat hättest du auch kein Problem. SSL ist ja dazu da Sicherheit zu haben das beide Kommunikationspartner "echt" sind. Einfach einem unbekannten Vertauen würde dem wiedersprechen. Du kannst ja auch nicht irgendwo hingehen und sagen ich bin Heinz Müller (dein Zertifikat) und das kann mein Freund Kurt Schulz (deine CA) bestätigen. Wenn der andere Kurt Schulz nicht kennt wird er der Aussage wohl wenig vertrauen.

Es gibt zwei Möglichkeiten:

Entweder du machst es wie im link beschrieben
ODER:
Du importierst deine Root CA mit der du die Zertifikate ausgestellt hast in deinen truststore.
 
Zuletzt bearbeitet von einem Moderator:

Cyborg

Aktives Mitglied
Du importierst deine Root CA mit der du die Zertifikate ausgestellt hast in deinen truststore.

genau das möchte ich machen !

ich habe mir mit openssl folgende zertifikate(?!) erstellt:

ca-cert.pem
client-cert.pem
client-key.pem
server-cert.pem
server-key.pem

und mit keytools im sdk Ordner habe ich die ca-cert.pm wie folgt verwendet:
Code:
keytool -import -alias mysqlServerCACert -file ca-cert.pem -keystore truststore
keytool -genkey -keyalg rsa -alias mysqlClientCertificate -keystore keystore

alles ohne fehlermeldung.
und dann mit deinem beispiel code auch angewendet.
aber ohne erfolg.
 
G

Gast2

Gast
Erm... wieso "generierst" du denn noch einen key? Du hast doch schon ein client-cert.pem und client-key.pem?

Du musst in dem keystore deine private und public keys haben.

In dem Truststore die Certs denen du traust, sprich ca-cert.pem und server-cert.pem

Code:
// CA cert importieren
keytool -import -alias myCA -file ca-cert.pem -trustcacerts -keystore truststore
// Server cert importieren 
keytool -import -alias mysqlServerCert -file server-cert.pem -keystore truststore


Mobilefish.com - A tutorial about Java keytool. Includes examples.
 

Cyborg

Aktives Mitglied
ja, es funktioniert jetzt.
obwohl die Verschlüsselung eine andere zu sein scheint:

Code:
SHOW STATUS LIKE 'Ssl_cipher'
MySQL direkt: DHE-RSA-AES256-SHA
aus Java: DHE-RSA-AES128-SHA

aber das soll mich nicht weiter stören :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Problem mit dem Datenbankzugriff über ucanaccess Datenbankprogrammierung 15
Danloc Datenbankzugriff wie gestalten? Datenbankprogrammierung 7
M MySQL JSF Datenbankzugriff maxActive, maxIdle, maxWait Datenbankprogrammierung 1
T MySQL Multithreading beim Datenbankzugriff Datenbankprogrammierung 3
N Beispielprogramm Datenbankzugriff Datenbankprogrammierung 7
T SSL Zertifikat für mysql datenbankzugriff Datenbankprogrammierung 6
E was passiert bei parallelem Datenbankzugriff ? Datenbankprogrammierung 9
C Datenbankzugriff standarisieren Datenbankprogrammierung 2
G Frontend für Datenbankzugriff Datenbankprogrammierung 7
G Datenbankzugriff auf MS-Navision Datenbankprogrammierung 2
A Andere Möglichkeit als JDBC Treiber für den Datenbankzugriff Datenbankprogrammierung 3
A Datenbankzugriff per Applet - Problem beim Treiber laden Datenbankprogrammierung 6
C Hausarbeit -> Datenbankzugriff über JDBC Datenbankprogrammierung 2
T Applet bekommt keinen Datenbankzugriff Datenbankprogrammierung 11
T Datenbankzugriff (Oracle) mit Applet via Internet? Datenbankprogrammierung 6
D Datenbankzugriff auf MS SQL Server 2000 funktioniert nicht Datenbankprogrammierung 3
A MS SQL Datenbankzugriff per JDBC Datenbankprogrammierung 4
K Datenbankzugriff geht nicht :( Datenbankprogrammierung 5
M Datenbankzugriff Datenbankprogrammierung 4
O Datenbankzugriff "ohne" Server ? Datenbankprogrammierung 9
G Datenbankzugriff Datenbankprogrammierung 4
T Lotus Notes Datenbankzugriff via Java Datenbankprogrammierung 3
A MYSQL Datenbankzugriff unter Linux Datenbankprogrammierung 3

Ähnliche Java Themen


Oben