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?


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.



@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


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.


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.


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';

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


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.


'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 .


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


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';

-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);
}

?>
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.