php mysqli_connect: Dem Client unbekannte Authentifizierungsmethode [caching_sha2_password]

94

Ich benutze PHP mysqli_connectfür die Anmeldung bei einer MySQL-Datenbank (alle auf localhost)

<?php
//DEFINE ('DB_USER', 'user2');
//DEFINE ('DB_PASSWORD', 'pass2');
DEFINE ('DB_USER', 'user1');
DEFINE ('DB_PASSWORD', 'pass1');
DEFINE ('DB_HOST', '127.0.0.1');
DEFINE ('DB_NAME', 'dbname');

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$dbc){
    die('error connecting to database');    
}
?>

Dies ist die mysql.user-Tabelle: mysql.user Tabelle

MySQL Server ini Datei:

[mysqld]
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=caching_sha2_password
#default_authentication_plugin=mysql_native_password

Mit caching_sha2_passwordin der MySQL Server-INI-Datei ist es überhaupt nicht möglich, sich mit Benutzer1 oder Benutzer2 anzumelden.

Fehler: mysqli_connect (): Der Server hat eine Authentifizierungsmethode angefordert, die dem Client [caching_sha2_password] in ... unbekannt ist.

Mit mysql_native_passwordin der MySQL Server-INI-Datei ist es möglich, sich mit Benutzer1 anzumelden, aber mit Benutzer2 der gleiche Fehler.


Wie kann ich mich mit caching_sha2_passworddem mySql Server anmelden?

Guti_Haz
quelle
Unterstützt PDO dies? Ich habe andere Berichte über gesehen mysqli.
Tadman
Die von @ 黃皓哲 gepostete Antwort sollte als akzeptierte Antwort markiert werden.
FIL

Antworten:

51

Ab PHP 7.4 ist dies kein Problem mehr. Die Unterstützung für die caching_sha2Authentifizierungsmethode wurde zu mysqlnd hinzugefügt.


Derzeit unterstützt die PHP-Erweiterung mysqli die neue Authentifizierungsfunktion caching_sha2 nicht. Sie müssen warten, bis sie ein Update veröffentlichen.

Überprüfen Sie den entsprechenden Beitrag von MySQL-Entwicklern: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Sie haben PDO nicht erwähnt, vielleicht sollten Sie versuchen, eine Verbindung mit PDO herzustellen.

abeyaz
quelle
3
PDO hat das gleiche Problem
Machavity
@Machavity wissen Sie, ob diese Antwort noch gültig ist? Dh. es ist noch nicht veraltet mit neueren PHP-Versionen?
gen
@gen Basierend auf diesem Fehler scheint es ab
7.4.2 zu
3
Ein Upgrade auf PHP7.4 hat das Problem behoben. Und ich denke, das ist der beste Ansatz, anstatt die Authentifizierungsmethode so zu ändern, mysql_native_passwordwie es in einigen Antworten vorgeschlagen wird.
Ultrasamad
Ich benutze Docker (Apache + PHP in einem Container und MySQL in einem anderen Container) und dies löste mein Problem. Vielen Dank!
Joan Galmés Riera
225

Ich löse dies per SQL-Befehl:

ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

auf die unter https://dev.mysql.com/doc/refman/8.0/en/alter-user.html verwiesen wird

wenn Sie einen neuen Benutzer erstellen

 CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

auf die unter https://dev.mysql.com/doc/refman/8.0/en/create-user.html verwiesen wird

das funktioniert bei mir

黃皓哲
quelle
3
Gute Antwort. Das Problem hier ist, dass Sie dies möglicherweise jedes Mal tun müssen, wenn Sie einen neuen Benutzer hinzufügen, abhängig von den
Servereinstellungen
3
Vielen Dank. Ich habe nach einer Möglichkeit gesucht, die neuen Passwort-Hashes in die älteren zu konvertieren (wie das Format Benutzer2 in das Format Benutzer1 in der Frage), und Ihre Antwort hat genau den Job gemacht
Buchhalter
10
Und so endete ein 4-tägiger Kampf, um das PHP-7.2.9 / 11 mit MySQL-8.012 zum Spielen zu bringen. Könnte jemand aus dem PHP-Team überzeugt sein, dies im INSTALL im Tarball zu vermerken? Es würde in den nächsten ein oder zwei Jahren Tausende von Personenstunden sparen.
MountainMan
4
@MountainMan hat mein Leben gerettet
Chase
8
Dies sollte als Antwort für eine Problemumgehungslösung akzeptiert werden
Yohanes AI
27
ALTER USER 'mysqlUsername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlUsernamePassword';

Entfernen Sie die Anführungszeichen (') nach ALTER USERund behalten Sie die Anführungszeichen (') nachmysql_native_password BY

Es funktioniert auch bei mir.

Eranda Jayamaha
quelle
2
Das war die einzige Lösung, die für mich auf einem Localhost-Server mit WAMP-Server
funktioniert hat
Dies schien das Homebrew-LAMP-Setup meines Mac zu beheben. Ich habe dieses Problem auf Debian jedoch nicht erlebt.
Magnus
22

Wenn Sie unter Windows arbeiten und die Verwendung caching_sha2_passwordüberhaupt nicht möglich ist , können Sie Folgendes tun:

  1. Führen Sie das MySQL-Installationsprogramm erneut aus
  2. Wählen Sie "Neu konfigurieren" neben MySQL Server (das oberste Element).
  3. Klicken Sie auf "Weiter", bis Sie zu "Authentifizierungsmethode" gelangen.
  4. Ändern Sie "Starke Kennwortverschlüsselung für Authentifizierung verwenden (EMPFOHLEN)" in "Legacy-Authentifizierungsmethode verwenden (MySQL 5.X-Kompatibilität beibehalten)".
  5. Weiter klicken"
  6. Geben Sie Ihr Root-Konto-Passwort in Konten und Rollen ein und klicken Sie auf "Überprüfen".
  7. Weiter klicken"
  8. Klicken Sie so lange auf "Weiter", bis Sie zu "Konfiguration anwenden" gelangen.
  9. Klicken Sie auf "Ausführen".

Das Installationsprogramm nimmt alle für Sie erforderlichen Konfigurationsänderungen vor.

CJ Dennis
quelle
Mann nach einem Jahr der Abstimmung dieser Antwort wurde meine Datenbank gehackt ...
Code Tree
11

Es funktioniert für mich (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64 Bit)

Bearbeiten Sie die Datei C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Setzen Sie den MySQL-Dienst unter Windows und in der MySQL-Shell zurück ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Chinnon Santos
quelle
es funktioniert, danke ... wir müssen diese 2 Dinge konfigurieren: mysql conf und alter user
danisupr4
9

Wie viele, viele Menschen hatte ich das gleiche Problem. Obwohl der Benutzer so eingestellt ist, dass er mysql_native_password verwendet und ich über die Befehlszeile eine Verbindung herstellen kann, kann ich mysqli () nur zum Hinzufügen hinzufügen

default-authentication-plugin = mysql_native_password

im Abschnitt [mysqld] von, in meinem Setup unter Ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf

dBags
quelle
2
Denken Sie auch daran, dass der Benutzer nicht funktioniert, wenn er vor dieser Änderung erstellt wurde. Sie sollten also ZUERST die Standardauthentifizierung in der Konfiguration festlegen und dann den Benutzer erstellen, um arbeiten zu können!
Oleg Popov
4

Ich habe den folgenden Befehl ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';in der Befehlszeile ausgeführt und schließlich MySQL in lokalen Diensten neu gestartet.

JRonald Moreno
quelle
'root' @ 'localhost'Stattdessen sollten hier keine Leerzeichen gelesen werdenALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b
4

Jetzt können Sie ein Upgrade auf PHP7.4 durchführen, und MySQL wird caching_sha2_passwordstandardmäßig verwendet, sodass die Standardinstallation von MySQL mysqli_connectohne Konfiguration funktioniert .

Pavel Niedoba
quelle
2
Nicht ganz. Es ist fehlerhaft in 7.4.0 und 7.4.1. Behoben in 7.4.2
Machavity
3

Wenn Sie einen Mac verwenden, können Sie dies wie folgt beheben. Dies ist nach Tonnen von Versuch und Irrtum. Hoffe das hilft anderen ..

Debugging:

$mysql --verbose --help | grep my.cnf

$ which mysql
/usr/local/bin/mysql

Auflösung: nano /usr/local/etc/my.cnf

Hinzufügen: default-authentication-plugin = mysql_native_password

-------
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
default-authentication-plugin=mysql_native_password
------

Schließlich ausführen: Brew Services starten MySQL neu

kp123
quelle
Brauchte das ... Danke!
Nykc
1

Ich habe dies in Ubuntu 18.04 versucht und ist die einzige Lösung, die für mich funktioniert hat:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
imjesr
quelle
-3

Ich denke, es ist nicht sinnvoll, den MySQL-Server ohne caching_sha2_password-Verschlüsselung zu konfigurieren. Wir müssen einen Weg finden, um sichere Informationen über das Netzwerk zu veröffentlichen, zu senden oder zu erhalten. Wie Sie im folgenden Code sehen, verwende ich keine Variable $ db_name, und ich verwende einen Benutzer auf einem MySQL-Server mit einem Standardkonfigurationskennwort. Erstellen Sie einfach ein Standardbenutzerkennwort und konfigurieren Sie alle Berechtigungen. es funktioniert, aber wie ich sagte ohne segurity.

<?php
$db_name="db";
$mysql_username="root";
$mysql_password="****";
$server_name="localhost";
$conn=mysqli_connect($server_name,$mysql_username,$mysql_password);

if ($conn) {
    echo "connetion success";
}
else{
    echo mysqli_error($conn);
}

?>
Steven Canales
quelle