La fonction MySQLI :: SSL_SET () doit être appelée avant d'appeler MySqli :: Real_Connect () , sinon les paramètres ne prendront pas effet. Le mauvais ordre de l'appel est l'un des oublis les plus courants.
Exemple d'erreur:
$conn = new mysqli();
$conn->real_connect('db.m66.net', 'user', 'pass', 'database');
$conn->ssl_set('/path/client-key.pem', '/path/client-cert.pem', '/path/ca.pem', NULL, NULL);
Exemple correct:
$conn = new mysqli();
$conn->ssl_set('/path/client-key.pem', '/path/client-cert.pem', '/path/ca.pem', NULL, NULL);
$conn->real_connect('db.m66.net', 'user', 'pass', 'database');
Lorsque vous utilisez la connexion Real_Connect () , si l'indicateur MySQLI_Client_SSL n'est pas transmis, la connexion peut ne pas activer SSL, même si SSL_SET () est appelée.
$conn->real_connect('db.m66.net', 'user', 'pass', 'database', null, null, MYSQLI_CLIENT_SSL);
Il est essentiel de voir si PHP a activé les extensions OpenSSL. Vous pouvez le confirmer en exécutant PHP -M | grep openSSL via phpinfo () ou ligne de commande. S'il n'est pas activé, PHP ne sera pas en mesure d'établir une connexion cryptée SSL.
Le serveur doit également activer SSL et fournir des certificats juridiques et des fichiers CA. Vous pouvez le confirmer via l'instruction SQL suivante:
SHOW VARIABLES LIKE '%ssl%';
Si le résultat montre que HAS_SSL est désactivé , SSL ne prendra pas effet quels que soient les paramètres du client.
Certaines versions plus anciennes des bibliothèques de connexions PHP ou libmysqlclient peuvent ne pas prendre en charge SSL ou nécessiter des options de compilation spécifiques pour prendre en charge. Il est recommandé d'utiliser le pilote MySqlnd car il prend en charge SSL nativement et est plus moderne.
Même si tout est configuré correctement, vous devez toujours vérifier que la connexion est activée. Vous pouvez afficher l'état de cryptage réel via l'énoncé suivant:
$result = $conn->query("SHOW STATUS LIKE 'Ssl_cipher'");
$row = $result->fetch_assoc();
if (!empty($row['Value'])) {
echo "SSL 启用,加密算法为: " . $row['Value'];
} else {
echo "SSL 未启用";
}
Si le retour est vide, SSL n'est pas réellement activé.
Dans certains environnements, si LocalHost est utilisé, la connexion peut retomber à la prise UNIX, contournant ainsi la couche de réseau SSL. Il est recommandé d'utiliser un nom d'hôte explicite ou une adresse IP, par exemple:
$conn->real_connect('db.m66.net', 'user', 'pass', 'database');