PHP MySQL (PDO) SSL Verbindung mit Let's Encrypt

Picus

Lt. Commander
Registriert
März 2011
Beiträge
1.079
Hi,

ich möchte für eine MySQL Datenbank gerne SSL benutzen und habe bereits ein Zertifikat von Let's Encrypt für die eigentliche Webseite.

Wenn ich jedoch wie in der Dokumentation beschrieben die Zertifikate einsetzte, bekomme ich eine Fehlermeldung:
Code:
new PDO(
  "mysql:host=$servername;dbname=$dbname",
  $username,
  $password,
  array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_SSL_CA => "/etc/letsencrypt/live/www.example.com/chain.pem",
    PDO::MYSQL_ATTR_SSL_CERT => "/etc/letsencrypt/live/www.example.com/cert.pem",
    PDO::MYSQL_ATTR_SSL_KEY => "/etc/letsencrypt/live/www.example.com/privkey.pem")
);
Connection failed: SQLSTATE[HY000] [2006] MySQL server has gone away
Weiß jemand woran das liegt oder ob ich den Ursprung des Fehlers in einer Log Datei nachlesen kann?

Ohne die letzten 3 Zeilen bezüglich SSL funktioniert die Verbindung zur Datenbank natürlich ohne Probleme.
 
Ich hab nichts an der Config geändert, dort finde ich nur:
Code:
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

Also im Grunde das Gleiche wie ich mit meinem Code bewirken will.
 
zumindest fuer mich ist der live-ordner nicht lesbar fuer alle ausser root:
Code:
$ ll -d1 /etc/letsencrypt/live/
drwx------ 4 root root 4096 Jul  4 03:36 /etc/letsencrypt/live/
schaetze mal, dein webserver-user darf die dateien nicht lesen?
 
Die Raute-Zeichen in der Mysql-config müssen natürlich raus, sonst sind die optionen ja auskommentiert.
 
Code:
$ ls -ld /etc/letsencrypt/live/
drwx------ 4 root root 4096 Oct 17 16:34 /etc/letsencrypt/live/

Schätze mal das wird daran liegen. MySQL läuft ja unter dem User "mysql".

Der Webserver läuft wiederum unter dem User "www-data" und da funktioniert es ja trotzdem.

Wie dem auch sei, ich werde dann morgen versuchen die Rechte umzustellen.
 
der webserver oeffnet aber auch ein paar privilegierte ports <1024; bedeutet, dass er mit erhoehten rechten startet und diese dann nach der konfiguration abgibt.
 
Hab nochmal die Rechte nachgeprüft.
Code:
/* Der Zertifikatordner ist lesbar */
drwxr-xr-x 2 root root 4096 Oct 17 16:32 /etc/letsencrypt/live/www.example.com/

/* ...enthält jedoch nur Links */
lrwxrwxrwx 1 root root 43 Oct 17 16:32 /etc/letsencrypt/live/www.example.com/cert.pem -> ../../archive/www.example.com/cert1.pem
lrwxrwxrwx 1 root root 44 Oct 17 16:32 /etc/letsencrypt/live/www.example.com/chain.pem -> ../../archive/www.example.com/chain1.pem
lrwxrwxrwx 1 root root 48 Oct 17 16:32 /etc/letsencrypt/live/www.example.com/fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
lrwxrwxrwx 1 root root 46 Oct 17 16:32 /etc/letsencrypt/live/www.example.com/privkey.pem -> ../../archive/www.example.com/privkey1.pem

/* Die eigentlichen Zertifikate sind jedoch lesbar */
-rw-r--r-- 1 root root 1809 Oct 17 16:32 /etc/letsencrypt/archive/www.example.com/cert1.pem
-rw-r--r-- 1 root root 1647 Oct 17 16:32 /etc/letsencrypt/archive/www.example.com/chain1.pem
-rw-r--r-- 1 root root 3456 Oct 17 16:32 /etc/letsencrypt/archive/www.example.com/fullchain1.pem
-rw-r--r-- 1 root root 1704 Oct 17 16:32 /etc/letsencrypt/archive/www.example.com/privkey1.pem
Demnach sollten die default Permissions doch weitreichend genug sein...
 
Zuletzt bearbeitet:
Dein MySQL Server hat kein aktives SSL. Siehe die dein Auszug aus der Config. SSL ist auskommentiert. Beide Seiten (Client deine Anwendung, MySQL Server) müssen SSL unterstützen und somit konfiguriert werden.

Du kannst auch z. B. eine Statusabfrage in Form von

Code:
SHOW STATUS LIKE 'Ssl_cipher';

machen. Ich wette mit dir, dass das Ergebnis leer ist.
 
In der Config steht jetzt:
Code:
ssl-ca=/etc/letsencrypt/live/www.example.com/chain.pem
ssl-cert=/etc/letsencrypt/live/www.example.com/cert.pem
ssl-key=/etc/letsencrypt/live/www.example.com/privkey.pem

Ich habe MySQL neugestartet und das Ergebnis von "SHOW STATUS LIKE 'Ssl_cipher'" ist immer noch leer. Fehlt es jetzt noch an irgend welchen Einstellungen?
 
Probier mal

Code:
show variables like '%ssl%';

Da müsste sowas wie have_openssl und have_ssl auftauchen. Ebenso dein Pfad zum Key, Cert etc. Könnte sein, dass ssl_cipher nur gefüllt ist, wenn eine SSL Verbindung besteht.
 
Code:
SHOW VARIABLES LIKE '%ssl%';
+---------------------+-------------------------------------------------------+
| Variable_name       | Value                                                 |
+---------------------+-------------------------------------------------------+
| have_openssl        | YES                                                   |
| have_ssl            | DISABLED                                              |
| ssl_ca              | /etc/letsencrypt/live/www.example.com/chain.pem       |
| ssl_capath          |                                                       |
| ssl_cert            | /etc/letsencrypt/live/www.example.com/cert.pem        |
| ssl_cipher          |                                                       |
| ssl_crl             |                                                       |
| ssl_crlpath         |                                                       |
| ssl_key             | /etc/letsencrypt/live/www.example.com/privkey.pem     |
| version_ssl_library | OpenSSL 1.0.1t  3 May 2016                            |
+---------------------+-------------------------------------------------------+

have_ssl DISABLED scheint dann wohl das Problem zu sein.

Edit: Endlich mal eine Fehlermeldung gefunden:
Code:
[Warning] Failed to setup SSL
[Warning] SSL error: SSL_CTX_set_default_verify_paths failed
[Warning] SSL error: error:0200100D:system library:fopen:Permission denied
[Warning] SSL error: error:2006D002:BIO routines:BIO_new_file:system lib
[Warning] SSL error: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib

Anscheinend scheint MySQL doch keine Berechtigung zu haben um auf die Zertifikate zuzugreifen, aber wieso?
 
Zuletzt bearbeitet:
Picus schrieb:
Hab nochmal die Rechte nachgeprüft.
[...]
Demnach sollten die default Permissions doch weitreichend genug sein...
ne, wenn ein eltern-ordner keinen zugriff zulaesst, kannst du seine kinder nicht sehen. vergleiche:

Code:
sudo -u www-data cat /etc/letsencrypt/archive/www.example.com/fullchain1.pem
mit
Code:
sudo cat /etc/letsencrypt/archive/www.example.com/fullchain1.pem
 
Mit 744 und 755 auf live gehts auch nicht.

Das Problem scheint SELinux zu sein:
Apparently SELinux is blocking the reads for the certificates. There are two ways to work around this issue. You can run “restorecon -v /path/to/certs/“, or you can work around by disabling selinux by running “setenforce 0” or by editing the /etc/selinux/config file and setting ‘SELINUX=DISABLED’.

Werde ich gleich mal probieren.

An dieser Stelle aber schon Mal Danke an alle die bisher geholfen haben!
 
ich wuerde die certs einfach testweise fuer ne minute mal in ein neutrales verzeichnis packen, besitzer auf www-data aendern und den faktor damit ausschliessen. "live" ist naemlich wie du oben siehst lediglich ein symlink auf "archive", und auch das domain-verzeichnis wird von relevanz sein.
 
Hab mit "sudo -u mysql cat /etc/letsencrypt/live/www.example.com/cert.pem" getestet ob der MySQL User Zugriff hat und siehe da, hat er nicht. Neben /live hat auch noch /archive 755 permissions gebraucht, weil dort die eigentlichen Zertifikate liegen. Du hattest also recht.

Wenn ich mich im Terminal in MySQL anmelde, funktioniert das ganze nun und "have_ssl" steht auf "YES".

Über PHP gibt's aber immer noch einen Fehler:
Connection failed: SQLSTATE[HY000] [2002]

Leider hab ich keine Ahnung was das sein könnte. Ich hab schon versucht den Host, Port und Socket wie aus dem Terminal zu verwenden und trotzdem kommt keine Verbindung zu Stande...
 
Zurück
Oben