SSL in MySQL aktivieren


24

Ich verwende Ubuntu Server 12.04 und möchte SSL-Verbindungen zu MySQL aktivieren.

Ich habe mit OpenSSL die folgenden Keys / Certs-Dateien generiert:

  • ca-cert.pem
  • server-cert.pem
  • server-key.pem

Ich habe diese unter gespeichert /etc/mysqlund dann die folgenden Zeilen hinzugefügt /etc/mysql/my.cnf:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

Als nächstes habe ich den Server mit neu gestartet sudo service restart mysql.

Dies scheint jedoch SSL nicht zu aktivieren. Innerhalb einer MySQL-Sitzung:

mysql> show variables like '%ssl%';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| have_openssl  | DISABLED                   |
| have_ssl      | DISABLED                   |
| ssl_ca        | /etc/mysql/ca-cert.pem     |
| ssl_capath    |                            |
| ssl_cert      | /etc/mysql/server-cert.pem |
| ssl_cipher    |                            |
| ssl_key       | /etc/mysql/server-key.pem  |
+---------------+----------------------------+

Irgendwelche Ideen, was mir fehlt? Vielen Dank


2
Schauen Sie sich diesen tollen Thread an . Vielleicht könnte er Ihnen helfen.
SirCharlo

Vielen Dank für den Link SirCharlo, aber das in diesem Thread angesprochene Problem scheint nicht auf meine Situation zuzutreffen.
visitor93746

1
Was @ SirCharlo erwähnt, ist, wo Sie suchen möchten. Insbesondere der Apparmor-Teil und der Beitrag Nr. 10 . Schlüssel, die ich in Debian Squeeze oder einem älteren Ubuntu generiert habe, funktionieren einwandfrei - bei der Neuerstellung in 12.04 schlägt dies erneut fehl. Siehe auch die MySQL-Fehlerprotokolle.
Gertvdijk

2
Ich hatte dieselbe Frage und verbrachte Stunden damit, aber die Antwort von @ user262116 löste sie. Ich würde Sie ermutigen, diese Antwort zu akzeptieren, wenn es Ihnen hilft!
Elixenide,

Antworten:


33

Ubuntu 12.04 wird mit OpenSSL 1.0.1 ausgeliefert, das etwas andere Standardeinstellungen als die ältere Version von OpenSSL 0.9.8 hat.

Unter anderem, wenn Sie openssl req -newkey rsa:2048einen RSA-Schlüssel generieren, erhalten Sie einen Schlüssel im Format PKCS # 8 . Diese Schlüssel werden im PEM-Format dargestellt und haben den allgemeineren -----BEGIN PRIVATE KEY-----Header, der nicht angibt, um welche Art von Schlüssel es sich handelt (RSA, DSA, EC).

Zuvor hatten Schlüssel mit OpenSSL 0.9.8 immer das Format PKCS # 1 , das als PEM dargestellt wurde, und hatten den Header -----BEGIN RSA PRIVATE KEY-----.

Aus diesem Grund können Sie die Kopf- und Fußzeile nicht einfach wie folgt ändern:

-----BEGIN PRIVATE KEY-----

zu

-----BEGIN RSA PRIVATE KEY-----`

Es ist nicht dasselbe und es wird nicht funktionieren. Stattdessen müssen Sie den Schlüssel mit in das alte Format konvertieren openssl rsa. So was:

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem

MySQL (v5.5.35) unter Ubuntu 12.04 verwendet eine SSL-Implementierung namens yaSSL (v2.2.2). Es wird erwartet, dass die Schlüssel im PKCS # 1-Format vorliegen und das von OpenSSL 1.0 und höher verwendete PKCS # 8-Format nicht unterstützt. Wenn Sie einfach die Kopf- und Fußzeile ändern, wie in anderen Beiträgen in diesem Thread vorgeschlagen, wird sich MySQL / yaSSL nicht beschweren, aber Sie können keine Verbindung herstellen und erhalten stattdessen den folgenden Fehler:

ERROR 2026 (HY000): SSL connection error: protocol version mismatch

Ubuntu 14.04 wird mit OpenSSL 1.0.1f und neuen Einstellungen geliefert. Unter anderem werden Zertifikate mit SHA256-Digests anstelle von SHA1 generiert, das in früheren Versionen verwendet wurde. Übrigens unterstützt die mit MySQL gebündelte yaSSL-Version dies auch nicht.

Wenn Sie Zertifikate zur Verwendung mit MySQL generieren, müssen Sie sicherstellen, dass die RSA-Schlüssel in das traditionelle PKCS # 1-PEM-Format konvertiert werden und dass Zertifikate SHA1-Digests verwenden.

Im Folgenden finden Sie ein Beispiel für die Erstellung einer eigenen Zertifizierungsstelle, eines Serverzertifikats und eines Clientzertifikats.

# Generate a CA key and certificate with SHA1 digest
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

# Create server key and certficate with SHA1 digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -sha1 -req -in server-req.pem -days 730  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl rsa -in server-key.pem -out server-key.pem

# Create client key and certificate with SHA digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
openssl rsa -in client-key.pem -out client-key.pem

1
Dieser Beitrag hat mir den Tag gerettet! Fantastische Erklärung und Lösung.
generalopinion

Ich habe 'ERROR 2026 (HY000): SSL-Verbindungsfehler: ASN: vor Datum in der Zukunft'
Nitsan Baleli

Leider habe ich immer noch die ERROR 2026 (HY000): SSL connection error: protocol version mismatchFehler (mit OpenSSL 1.0.1f). Ich habe auf OpenSSL 1.0.1e umgestellt und es hat mit den obigen Anweisungen funktioniert.
Jarrett

2
Diese Antwort ist erstaunlich - würde eine massive Prämie gewähren, wenn ich könnte. Tolle Erklärung des Problems.
Elixenide

Eine weitere Stimme für die Horde. Ich habe im Internet nach einer Lösung gesucht, warum das mit MySQL dokumentierte Setup einfach nicht funktioniert. Der untere Teil dieses Beitrags hat mir den Tag gerettet.
Steve Chambers

4

Das hat mir geholfen:

Die Kopf- und Fußzeile der Datei server-key.pem sah folgendermaßen aus:

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----

Aber es erfordert so etwas:

-----BEGIN RSA PRIVATE KEY-----
...
...
-----END RSA PRIVATE KEY-----

Beachten Sie den BEGIN RSA PRIVATE KEY

Um das Protokoll zu sehen:

sudo vim /var/log/mysql/error.log

Hoffe das hilft.


Ich hatte ein ähnliches Problem in meinem Ubunbtu 12.04 mit MySQL 5.5.34, wo die PEM-Dateien von allen lesbar waren und mir immer noch das gleiche Problem bereiteten. Aber diese Antwort zusammen mit dem Eigentümerwechsel hat den Trick getan.
Tommy Andersen

Fügen Sie "RSA" nicht manuell hinzu - dies unterdrückt nur den Fehler, aber SSL funktioniert nicht (es wird ein weiterer Fehler angezeigt, " SSL-Verbindungsfehler: Protokollversionskonflikt "). Konvertieren Sie stattdessen von PKCS # 8 in das PKCS # 1-Format mitopenssl rsa
rustyx

3

Ich hatte am 12.04 die gleichen Probleme, aber es war in der Tat Apparmor, der die Probleme verursachte.

Ich habe in den Ubuntu-Foren eine Lösung gefunden, bei der das Verschieben von .pemDateien /etc/mysqlbehoben wurde.

Sie können die Apparmor-Konfiguration auch in ändern /etc/apparmor.d/usr.sbin.mysqld.


Dies war das Problem, das ich auch hatte
Jonathan

ist das ein Tippfehler? Meinen Sie "Verschieben von PEM-Dateien in" anstatt "Verschieben von PEM-Dateien in"? sorry für so Pedant zu sein , aber ich habe ein bisschen verwirrt
knocte

1

Stellen Sie sicher, dass der Benutzer, der den mysqld-Prozess ausführt, Lesezugriff auf die Schlüssel und Zertifikatsdateien hat. Wenn Sie MySQL mit dem Konto "mysql" starten, würden Sie:

/etc/mysql$ chown mysql:mysql *.pem
/etc/mysql$ ls -l *.pem
-rwxrwx--- 1 mysql mysql 1631 2013-09-16 14:27 ca-cert.pem
-rwxrwx--- 1 mysql mysql 1281 2013-09-16 14:27 server-cert.pem
-rwxrwx--- 1 mysql mysql 1679 2013-09-16 14:27 server-key.pem

Andernfalls wird in Ihrem Fehlerprotokoll möglicherweise Folgendes angezeigt:

SSL error: Unable to get certificate from '/etc/mysql/server-cert.pem'
130916 13:32:25 [Warning] Failed to setup SSL
130916 13:32:25 [Warning] SSL error: Unable to get certificate

Groß. Aber wie könnte das gemacht werden? Nehmen Sie sich Zeit und erklären Sie weiter, geben Sie weitere Informationen :)
Lucio

Dies zusammen mit dem Hinzufügen von RSA zur Datei server-key.pem hat den Trick getan.
Tommy Andersen

1

Auf Ubuntu 16.04 lief ich mysql_ssl_rsa_setup, konnte die Dateien in Showvariablen wie in der Frage sehen, aber have_sslund have_opensslblieb dabei DISABLED.

Die Lösung war zu chown mysql.mysql /var/lib/mysql/*.pem. Alternativ gehe ich davon aus, dass, wenn Sie mysql_ssl_rsa_setup als mysql-Benutzer ausführen, die Dateien mit den richtigen Berechtigungen erstellt werden.


Die Frage ist vier Jahre und zwei Monate alt ... Es ist unwahrscheinlich, dass das OP auf Ihre Antwort antwortet.
WinEunuuchs2Unix

1
Ich habe dies einfach als Service für zukünftige Leser eingestellt, da dies eines der besten Google-Suchergebnisse für dieses Problem ist und nichts, was ich gelesen habe, zur Lösung meines Problems beitrug. Der Wert dieser Antwort, der sich auf den Zustand der Welt in Ubuntu 12.04 und sogar 14.04 bezieht, verliert an Relevanz.
Craig Wright

@ WinEunuuchs2Unix Vielleicht nicht das OP, aber hier bin ich, fast zwei Jahre später auf der Suche nach genau dieser Antwort. Also, danke Craig!
Oldskool

0

Die private Schlüsseldatei sollte wie folgt aussehen (PKCS # 1-Format):

-----BEGIN RSA PRIVATE KEY-----
. . .
-----END RSA PRIVATE KEY-----

Wenn Ihr privater Schlüssel stattdessen beginnt mit:

-----BEGIN PRIVATE KEY-----

(PKCS # 8 Format), dann sollten Sie es wie folgt konvertieren :

openssl rsa -in server-key.pem -out server-key.pem

Fügen Sie das "fehlende" " RSA" Tag nicht manuell von Hand hinzu, da das Format unterschiedlich ist.


-1

Die SSL-Startoptionen sollten sich oben in Ihrer Datei my.cnf befinden, da sie sonst möglicherweise ignoriert werden. Ich hatte Probleme, mysql 5.6 auf RHEL 6.4 auszuführen, wo die SSL-Variablen ignoriert wurden. Ich hatte sie am Ende der Datei my.cnf. Ich habe sie oben in die Datei verschoben (direkt unter [mysqld]), dann habe ich den Server neu gestartet und alles war in Ordnung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.