Signatur
Beschreibung
mysqli_ssl_set() legt die SSL/TLS-Zertifikate und -Schlüssel fest, die für den Aufbau einer verschlüsselten Verbindung zum MySQL-Server benötigt werden. Die Funktion muss vor dem eigentlichen Verbindungsaufbau mit mysqli_real_connect() aufgerufen werden; mit mysqli_connect() allein ist SSL nicht konfigurierbar.
SSL-Verbindungen sind immer dann sinnvoll, wenn die Kommunikation zwischen PHP-Anwendung und Datenbankserver über ein unsicheres Netzwerk (z. B. Internet oder gemeinsam genutzte Infrastruktur) läuft. Damit werden Man-in-the-Middle-Angriffe und das Abhören von Zugangsdaten oder sensiblen Nutzdaten verhindert.
Parameter, die nicht benötigt werden, können als null oder leerer String übergeben werden. Die Funktion selbst überprüft die Zertifikate nicht auf Gültigkeit — das übernimmt der zugrunde liegende MySQL-Client bei der eigentlichen Verbindung. Um die Zertifikatsvalidierung sicherzustellen, sollte zusätzlich die Option MYSQLI_OPT_SSL_VERIFY_SERVER_CERT via mysqli_options() gesetzt werden.
In der objektorientierten Schreibweise steht die entsprechende Methode mysqli::ssl_set() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine von mysqli_init() zurückgegebene mysqli-Instanz, die noch nicht verbunden ist. |
|
| $key Pflicht | ?string | null | Pfad zur privaten Schlüsseldatei des Clients (PEM-Format). null oder leerer String, wenn kein Client-Zertifikat verwendet wird. |
| $certificate Pflicht | ?string | null | Pfad zur Client-Zertifikatsdatei (PEM-Format). null oder leerer String, wenn kein Client-Zertifikat verwendet wird. |
| $ca_certificate Pflicht | ?string | null | Pfad zur CA-Zertifikatsdatei (PEM-Format), mit der das Server-Zertifikat verifiziert wird. Empfohlen für eine sichere Verbindung. |
| $ca_path Pflicht | ?string | null | Verzeichnispfad, in dem vertrauenswürdige CA-Zertifikate im PEM-Format abgelegt sind. Wird verwendet, wenn kein einzelnes CA-Zertifikat angegeben wird. |
| $cipher_algos Pflicht | ?string | null | Liste erlaubter Verschlüsselungsalgorithmen (Cipher-Suite) als Doppelpunkt-getrennte Zeichenkette, z. B. 'AES256-SHA'. null verwendet die Standardauswahl des MySQL-Clients. |
Rückgabewert
true zurück. Die Funktion schlägt intern nicht fehl — Fehler beim Verbindungsaufbau werden erst von mysqli_real_connect() gemeldet.Beispiele
SSL-Verbindung mit CA-Zertifikat zur Servervalidierung
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init() fehlgeschlagen');
}
// SSL-Zertifikate konfigurieren (vor dem Verbindungsaufbau)
mysqli_ssl_set(
$mysqli,
'/etc/mysql/ssl/client-key.pem', // privater Schlüssel des Clients
'/etc/mysql/ssl/client-cert.pem', // Client-Zertifikat
'/etc/mysql/ssl/ca-cert.pem', // CA-Zertifikat zur Server-Validierung
null, // kein CA-Verzeichnis
null // Standard-Cipher-Suite
);
// Zertifikatsvalidierung erzwingen
mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
// Jetzt Verbindung aufbauen
if (!mysqli_real_connect($mysqli, 'db.example.com', 'user', 'secret', 'mydb', 3306, null, MYSQLI_CLIENT_SSL)) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
echo 'SSL-Verbindung erfolgreich hergestellt.';
$result = mysqli_query($mysqli, "SHOW STATUS LIKE 'Ssl_cipher'");
$row = mysqli_fetch_assoc($result);
echo 'Verwendete Cipher: ' . $row['Value'];
mysqli_close($mysqli);
Objektorientierte Verwendung mit mysqli::ssl_set()
<?php
$mysqli = mysqli_init();
// Nur CA-Zertifikat angeben (kein Client-Zertifikat)
$mysqli->ssl_set(
null, // kein Client-Schlüssel
null, // kein Client-Zertifikat
'/etc/ssl/certs/ca-bundle.crt', // System-CA-Bundle
null,
null
);
$mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
if (!$mysqli->real_connect('db.example.com', 'user', 'secret', 'mydb', 3306, null, MYSQLI_CLIENT_SSL)) {
die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}
echo 'Verbunden. Server-Info: ' . $mysqli->server_info;
$mysqli->close();
// Wichtig · Fallstricke
Sicherheitshinweis: mysqli_ssl_set() aktiviert allein noch keine Zertifikatsvalidierung. Ohne mysqli_options($mysqli, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true) und Angabe einer CA-Datei wird die Verbindung zwar verschlüsselt, jedoch ist kein Schutz vor Man-in-the-Middle-Angriffen gegeben, da das Server-Zertifikat nicht geprüft wird.
Reihenfolge beachten: Die Funktion muss zwingend vor mysqli_real_connect() aufgerufen werden. Bei Verwendung von mysqli_connect() kann SSL nicht vorab konfiguriert werden — in diesem Fall mysqli_init() + mysqli_real_connect() verwenden.
Flag erforderlich: Beim Aufruf von mysqli_real_connect() muss das Flag MYSQLI_CLIENT_SSL übergeben werden, damit die SSL-Konfiguration tatsächlich wirksam wird.
Ab PHP 8.1 gibt die Funktion immer true zurück (vorher war der Rückgabewert ebenfalls immer true, aber der Typ war nicht deklariert). Pfade zu Zertifikatsdateien sollten außerhalb des Web-Roots liegen und nicht über HTTP erreichbar sein.