SSL+mySQL+Python, geht das?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
bicpi
User
Beiträge: 23
Registriert: Samstag 28. Mai 2005, 12:35

Hi, ich habe mir einen mySQL-Server mit SSL-Unterstützung kompiliert und die nötigen Zertifikate erstellt.
Gibt es nun eine Möglichkeit, von Python aus SSL-Verbindungen zum mySQL-Server aufzubauen? Wenn, ja, wie?
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

bicpi hat geschrieben:Hi, ich habe mir einen mySQL-Server mit SSL-Unterstützung kompiliert und die nötigen Zertifikate erstellt.
Gibt es nun eine Möglichkeit, von Python aus SSL-Verbindungen zum mySQL-Server aufzubauen? Wenn, ja, wie?
Den gibt es wohl, denn im Befehl MySQLdb.connect kann ja das Argument ssl=... angegeben werden. Auf der Sourceforge-Seite von MySQLdb hab' ich folgenden Thread dazu entdeckt.

http://sourceforge.net/forum/message.php?msg_id=2856078

Ich weiß allerdings nicht ob dir das weiterhilft. (Leider bin ich PostgeSQL-Anwender und kann somit nicht so viel über MySQL sagen)

Jörg Gollers
bicpi
User
Beiträge: 23
Registriert: Samstag 28. Mai 2005, 12:35

Der Thread schaut schon mal sehr gut aus, Danke !
Werde das mal versuchen jetzt und berichte dann von den Erfahrungen :-)
bicpi
User
Beiträge: 23
Registriert: Samstag 28. Mai 2005, 12:35

Hi, also ich habe nun folgendes Progrämmchen geschrieben:.

Code: Alles auswählen

#!/usr/bin/env python

import MySQLdb

ssl_test = {}
ssl_test['ca'] = '/root/cacert.pem'
ssl_test['capath'] = '/root'
ssl_test['cert'] = '/root/client-cert.pem'
ssl_test['key'] = '/root/client.key'


verbindung = MySQLdb.connect(host='192.168.0.103', \
                             user='bicpi', \
                             passwd='geheim', \
                             db='bicpi', \
                             port=3306, \
                             compress=1, \
                             ssl=ssl_test)
c = verbindung.cursor()
c.execute('SELECT * from test_db')
erg = c.fetchall()
print erg
und das wird mit folgendem Fehler quittiert:

Code: Alles auswählen

Traceback (most recent call last):
  File "/root/mysql_ssl.py", line 18, in -toplevel-
    ssl=ssl_test)
  File "/usr/lib/python2.4/site-packages/MySQLdb/__init__.py", line 66, in Connect
    return Connection(*args, **kwargs)
  File "/usr/lib/python2.4/site-packages/MySQLdb/connections.py", line 134, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
NotSupportedError: client library does not have SSL support
Ich habe daraufhin noch das Packet "python-openssl" installiert, aber das hat auch nichts geholfen.

Was fehlt mir?
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

bicpi hat geschrieben:Was fehlt mir?
Es sieht ganz so aus als ob deine MySQL Client Library keine SSL-Unterstützung bieten würde. Aber du hast ja schon gesagt, daß du MySQL mit SSL Unterstützung selbst kompiliert hast.

Kann man denn (ohne Python) mit dem MySQL-Client eine SSL-Verbindung zur Datenbank aufbauen?

Jörg Gollers
Gast

Mit dem mySQL-Konsolen-Programm kann ich eine SSL-Verbindung aufbauen, ja. Das sagt zumindest ein STATUS auf der mySQL-Konsole ("SSL in use").
Jetzt hab ich mit

Code: Alles auswählen

spaceweb:~ # ldd /usr/lib/mysql/libmysqlclient.so
        linux-gate.so.1 =>  (0xffffe000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x4011b000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x4014e000)
        libm.so.6 => /lib/tls/libm.so.6 (0x40163000)
        libz.so.1 => /lib/libz.so.1 (0x40186000)
        libc.so.6 => /lib/tls/libc.so.6 (0x40197000)
        /lib/ld-linux.so.2 (0x80000000)
herausgefunden, dass da die Einträge "libssl" and "libcrypto" drin stehen sollten. Also muss ich die mySQL-Client Libraries rebuilden, aber ich hab keine Ahnung wie das geht. Weiss da jemand Bescheid?

bicpi
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Aber der Fehler lautet "NotSupportedError". Könnte es vielleicht sein, das mySQLdb es nicht kann? Vielleicht eine zu alte Version?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jgollers
User
Beiträge: 42
Registriert: Freitag 29. November 2002, 12:23
Wohnort: Kirchlengern

jens hat geschrieben:Aber der Fehler lautet "NotSupportedError". Könnte es vielleicht sein, das mySQLdb es nicht kann? Vielleicht eine zu alte Version?
Ich glaube eher nicht. Die Fehlermeldung wird wohl in der _mysql.c von mySQLdb auf die Reise geschickt. Der Code an dieser Stelle lautet...

Code: Alles auswählen

#if HAVE_OPENSSL
		PyObject *value = NULL;
		_stringsuck(ca, value, ssl);
		_stringsuck(capath, value, ssl);
		_stringsuck(cert, value, ssl);
		_stringsuck(key, value, ssl);
		_stringsuck(cipher, value, ssl);
#else
		PyErr_SetString(_mysql_NotSupportedError,
				"client library does not have SSL support");
		return -1;
... und soviel ich weiß, wird HAVE_OPENSSL in der msql.h definiert.

(Aber ich bin mir da auch nicht (mehr) so ganz sicher.)

Jörg Gollers
bicpi
User
Beiträge: 23
Registriert: Samstag 28. Mai 2005, 12:35

Also die mySQLdb hab ich selbst neu kompiliert, aktuellste Version, daran kanns nicht liegen.

Wie krieg ich jetzt bloss diesen Support hinein?
Antworten