SSL in MySQL Connector/J verschlüsselt alle Daten (außer dem Handshake am Anfang) zwischen dem JDBC-Treiber und dem Server. Allerdings dauert die Verarbeitung von Anfragen, je nach ihrer Größe und dem Umfang der Rückgabedaten, bei Einschaltung von SSL 36% bis 50% länger.
Damit die SSL-Unterstützung funktioniert, ist folgendes erforderlich:
Ein JDK, das JSSE (Java Secure Sockets Extension) enthält, wie etwa JDK 1.4.1 oder höher. SSL funktioniert zurzeit nicht mit einem JDK, zu dem man JSSE hinzufügen kann, wie JDK-1.2.x oder JDK-1.3.x. Das liegt an folgendem Fehler in JSSE: http://developer.java.sun.com/developer/bugParade/bugs/4273544.html
Ein MySQL-Server, der SSL unterstützt und auch für SSL kompiliert und konfiguriert ist, also MySQL-4.0.4 oder höher. Mehr Informationen finden Sie unter Abschnitt 5.9.7, „Verwendung sicherer Verbindungen“.
Ein Client-Zertifikat (wird weiter unten in diesem Abschnitt noch erklärt)
Sie müssen als Erstes das CA-Zertifikat des MySQL-Servers in
einen Java-Truststore importieren. Ein Beispiel eines
CA-Zertifikats für MySQL-Server finden Sie im Unterverzeichnis
SSL
der MySQL-Quelldistribution. Anhand
dieses Zertifikats wird SSL feststellen, ob Sie mit einem
sicheren MySQL-Server kommunizieren.
Um mit dem Java-keytool einen Truststore im
aktuellen Verzeichnis anzulegen und das CA-Zertifikat des
Servers (cacert.pem
) zu importieren, gehen
Sie wie unten beschrieben vor (vorausgesetzt, das
keytool liegt in Ihrem Pfad). (Das
keytool müsste im Unterverzeichnis
bin
Ihres JDK oder JRE zu finden sein):
shell> keytool -import -alias mysqlServerCACert -file cacert.pem -keystore truststore
Keytool antwortet mit folgenden Informationen:
Enter keystore password: ********* Owner: EMAILADDRESS=walrus@example.com, CN=Walrus, O=MySQL AB, L=Orenburg, ST=Some -State, C=RU Issuer: EMAILADDRESS=walrus@example.com, CN=Walrus, O=MySQL AB, L=Orenburg, ST=Som e-State, C=RU Serial number: 0 Valid from: Fri Aug 02 16:55:53 CDT 2002 until: Sat Aug 02 16:55:53 CDT 2003 Certificate fingerprints: MD5: 61:91:A0:F2:03:07:61:7A:81:38:66:DA:19:C4:8D:AB SHA1: 25:77:41:05:D5:AD:99:8C:14:8C:CA:68:9C:2F:B8:89:C3:34:4D:6C Trust this certificate? [no]: yes Certificate was added to keystore
Dann müssen sie ein Client-Zertifikat generieren, damit der MySQL-Server weiß, dass er es mit einem sicheren Client zu tun hat:
shell> keytool -genkey -keyalg rsa -alias mysqlClientCertificate -keystore keystore
Das Keytool fragt Sie nach folgenden Informationen und erstellt
einen Keystore namens keystore
im aktuellen
Verzeichnis.
Bitte geben Sie die passenden Informationen für Ihre Situation ein:
Enter keystore password: ********* What is your first and last name? [Unknown]: Matthews What is the name of your organizational unit? [Unknown]: Software Development What is the name of your organization? [Unknown]: MySQL AB What is the name of your City or Locality? [Unknown]: Flossmoor What is the name of your State or Province? [Unknown]: IL What is the two-letter country code for this unit? [Unknown]: US Is <CN=Matthews, OU=Software Development, O=MySQL AB, L=Flossmoor, ST=IL, C=US> correct? [no]: y Enter key password for <mysqlClientCertificate> (RETURN if same as keystore password):
Damit JSSE den Keystore und den Truststore auch benutzt, müssen Sie zum Schluss die folgenden Systemeigenschaften einstellen, wenn Sie Ihre JVM starten. Ersetzen Sie dabei path_to_keystore_file durch den vollständigen Pfad zu der von Ihnen angelegten Keystore-Datei und path_to_truststore_filedurch den vollständigen Pfad zu der von Ihnen angelegten Truststore-Datei und benutzen Sie für jede Eigenschaft die passenden Passwortwerte.
-Djavax.net.ssl.keyStore=path_to_keystore_file -Djavax.net.ssl.keyStorePassword=********* -Djavax.net.ssl.trustStore=path_to_truststore_file -Djavax.net.ssl.trustStorePassword=*********
Außerdem müssen Sie in den Verbindungsparametern für SQL
Connector/JuseSSL auf
true
setzen, indem Sie entweder
useSSL=true
in Ihren URL einfügen, oder die
Eigenschaft useSSL in dem
java.util.Properties
-Objekt, das Sie an
DriverManager.getConnection()
übergeben, auf
true
einstellen.
Das Funktionieren von SSL können Sie testen, indem Sie JSSE-Debugging (wie unten beschrieben) einschalten und nach folgenden Key-Ereignissen Ausschau halten:
... *** ClientHello, v3.1 RandomCookie: GMT: 1018531834 bytes = { 199, 148, 180, 215, 74, 12, 54, 244, 0, 168, 55, 103, 215, 64, 16, 138, 225, 190, 132, 153, 2, 217, 219, 239, 202, 19, 121, 78 } Session ID: {} Cipher Suites: { 0, 5, 0, 4, 0, 9, 0, 10, 0, 18, 0, 19, 0, 3, 0, 17 } Compression Methods: { 0 } *** [write] MD5 and SHA1 hashes: len = 59 0000: 01 00 00 37 03 01 3D B6 90 FA C7 94 B4 D7 4A 0C ...7..=.......J. 0010: 36 F4 00 A8 37 67 D7 40 10 8A E1 BE 84 99 02 D9 6...7g.@........ 0020: DB EF CA 13 79 4E 00 00 10 00 05 00 04 00 09 00 ....yN.......... 0030: 0A 00 12 00 13 00 03 00 11 01 00 ........... main, WRITE: SSL v3.1 Handshake, length = 59 main, READ: SSL v3.1 Handshake, length = 74 *** ServerHello, v3.1 RandomCookie: GMT: 1018577560 bytes = { 116, 50, 4, 103, 25, 100, 58, 202, 79, 185, 178, 100, 215, 66, 254, 21, 83, 187, 190, 42, 170, 3, 132, 110, 82, 148, 160, 92 } Session ID: {163, 227, 84, 53, 81, 127, 252, 254, 178, 179, 68, 63, 182, 158, 30, 11, 150, 79, 170, 76, 255, 92, 15, 226, 24, 17, 177, 219, 158, 177, 187, 143} Cipher Suite: { 0, 5 } Compression Method: 0 *** %% Created: [Session-1, SSL_RSA_WITH_RC4_128_SHA] ** SSL_RSA_WITH_RC4_128_SHA [read] MD5 and SHA1 hashes: len = 74 0000: 02 00 00 46 03 01 3D B6 43 98 74 32 04 67 19 64 ...F..=.C.t2.g.d 0010: 3A CA 4F B9 B2 64 D7 42 FE 15 53 BB BE 2A AA 03 :.O..d.B..S..*.. 0020: 84 6E 52 94 A0 5C 20 A3 E3 54 35 51 7F FC FE B2 .nR..\ ..T5Q.... 0030: B3 44 3F B6 9E 1E 0B 96 4F AA 4C FF 5C 0F E2 18 .D?.....O.L.\... 0040: 11 B1 DB 9E B1 BB 8F 00 05 00 .......... main, READ: SSL v3.1 Handshake, length = 1712 ...
JSSE bietet Debugging (in STDOUT), wenn Sie die
Systemeigenschaft -Djavax.net.debug=all
einstellen. So erfahren Sie, welche Keystores und Truststores
benutzt werden und was während des SSL-Handshakes und beim
Austauschen des Zertifikats passiert. Dies ist nützlich, wenn
eine SSL-Verbindung einmal nicht erfolgreich aufgebaut werden
kann und Sie versuchen, den Fehler zu finden.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.