php mysqli_connect: metoda uwierzytelniania nieznana klientowi [caching_sha2_password]


102

Używam PHP mysqli_connectdo logowania się do bazy danych MySQL (wszystko na hoście lokalnym)

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

to jest tabela mysql.user: mysql.user table

Plik ini serwera MySQL:

[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

ze caching_sha2_passwordw pliku ini MySQL Server, to nie jest w ogóle możliwe, aby zalogować się lub user1 user2;

błąd: mysqli_connect (): serwer zażądał metody uwierzytelniania nieznanej klientowi [caching_sha2_password] w ...

ze mysql_native_passwordw pliku ini MySQL Server, możliwe do logowania z user1, user2, ale z samego błędu;


jak mogę zalogować się przy użyciu caching_sha2_passwordserwera mySql?


Czy PDO to obsługuje? Widziałem inne raporty na temat mysqli.
tadman

Odpowiedź wysłana przez @ 黃皓哲 powinna zostać oznaczona jako zaakceptowana.
FIL

Odpowiedzi:


56

Od wersji PHP 7.4 nie stanowi to już problemu. Wsparcie dla caching_sha2metody uwierzytelniania został dodany do mysqlnd.


Obecnie rozszerzenie PHP mysqli nie obsługuje nowej funkcji uwierzytelniania caching_sha2. Musisz poczekać, aż wydadzą aktualizację.

Sprawdź powiązany post od programistów MySQL: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

Nie wspomnieli o PDO, może powinieneś spróbować połączyć się z PDO.



@Machavity Czy wiesz, czy ta odpowiedź jest nadal aktualna? To znaczy. nie jest jeszcze przestarzały w nowszych wersjach PHP?
gen

@gen Na podstawie tego błędu wygląda na to , że działa od 7.4.2
Machavity

3
Aktualizacja do php7.4 rozwiązała problem. Myślę, że jest to najlepsze podejście, zamiast zmieniać metodę uwierzytelniania na mysql_native_passwordsugerowaną przez niektóre odpowiedzi.
ultrasamad

Używam dockera (apache + php w kontenerze i mysql w innym kontenerze) i to rozwiązało mój problem. Dzięki!
Joan Galmés Riera

236

Rozwiązuję to poleceniem SQL:

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

do którego odwołuje się https://dev.mysql.com/doc/refman/8.0/en/alter-user.html

jeśli tworzysz nowego użytkownika

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

do którego odwołuje się https://dev.mysql.com/doc/refman/8.0/en/create-user.html

to działa dla mnie


3
Dobra odpowiedź. Problem polega na tym, że być może będziesz musiał to robić za każdym razem, gdy dodasz nowego użytkownika, w zależności od ustawień serwera
Machavity

3
Bardzo dziękuję Szukałem sposobu na przekonwertowanie nowych skrótów haseł na starsze (np. Format użytkownika2 na format użytkownika1 w pytaniu) i Twoja odpowiedź spełniła zadanie
Księgowy م

10
I tak zakończyło się 4-dniowe zmagania, aby php-7.2.9 / 11 działał dobrze z MySQL-8.012. Czy ktoś z zespołu PHP mógłby się przekonać, aby zanotował to w INSTALACJI w paczce? Zaoszczędziłoby to tysiące osobogodzin w ciągu następnego roku lub dwóch.
MountainMan

4
@MountainMan Saved my life
Chase

8
ta odpowiedź powinna zostać zaakceptowana dla rozwiązania obejścia
Yohanes AI

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

Usuń cudzysłowy (') po ALTER USERi zachowaj cudzysłów (') pomysql_native_password BY

U mnie też działa.


2
To było jedyne rozwiązanie działające dla mnie na serwerze localhost przy użyciu serwera WAMP :)
Jodyshop

Wydawało się, że to rozwiązało problem w konfiguracji LAMP na komputerze Mac. Jednak nie napotkałem tego problemu na Debianie.
Magnus

23

Jeśli korzystasz z systemu Windows i nie można go caching_sha2_passwordw ogóle używać , możesz wykonać następujące czynności:

  1. uruchom ponownie Instalatora MySQL
  2. wybierz „Reconfigure” obok MySQL Server (najwyższa pozycja)
  3. klikaj „Dalej”, aż dojdziesz do „Metody uwierzytelniania”
  4. zmień „Użyj szyfrowania silnym hasłem do uwierzytelniania (ZALECANE)” na „Użyj starszej metody uwierzytelniania (Zachowaj zgodność z MySQL 5.X)
  5. Kliknij Następny"
  6. wprowadź hasło do konta głównego w sekcji Konta i role i kliknij „Sprawdź”
  7. Kliknij Następny"
  8. klikaj „Dalej”, aż dojdziesz do „Zastosuj konfigurację”
  9. kliknij „Wykonaj”

Instalator dokona wszystkich niezbędnych zmian w konfiguracji.


człowiek po roku głosowania za tą odpowiedzią moja baza danych została zhakowana ...
Code Tree

12

U mnie działa (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64 bity)

Edytuj plik C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Zresetuj usługę MySQL w systemie Windows oraz w powłoce MySQL ...

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

to działa, dziękuję ... musimy skonfigurować dwie rzeczy: mysql conf i alter user
danisupr4

10

Jak wiele osób, miałem ten sam problem. Chociaż użytkownik jest ustawiony na używanie mysql_native_password i mogę połączyć się z wiersza poleceń, jedynym sposobem uzyskania połączenia mysqli () jest dodanie

default-authentication-plugin = mysql_native_password

do sekcji [mysqld] w mojej konfiguracji na ubuntu 19.10, /etc/mysql/mysql.conf.d/mysqld.cnf


2
Pamiętaj też, że jeśli użytkownik został utworzony przed tą zmianą, nie będzie działać. Tak więc, powinieneś NAJPIERW ustawić domyślne uwierzytelnianie w konfiguracji, a następnie utworzyć użytkownika, aby działać!
Oleg Popov

4

Uruchomiłem następujące polecenie ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';w wierszu poleceń i na koniec ponownie uruchomiłem MySQL w usługach lokalnych.


'root' @ 'localhost'zamiast tego nie należy czytać żadnych spacjiALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

Teraz możesz zaktualizować do PHP7.4, a MySQL będzie działać caching_sha2_passworddomyślnie, więc domyślna instalacja MySQL będzie działać mysqli_connectbez konieczności konfiguracji.


2
Nie do końca. Jest wadliwy w 7.4.0 i 7.4.1. Naprawiono w 7.4.2
Machavity

3

Jeśli używasz komputera Mac, oto jak to naprawić. Dzieje się tak po wielu próbach i błędach. Mam nadzieję, że to pomoże innym ...

Debugowanie:

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

$ which mysql
/usr/local/bin/mysql

Rozdzielczość: nano /usr/local/etc/my.cnf

Dodaj: 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
------

Wreszcie uruchom: usługi parzenia zrestartuj mysql


Potrzebowałem tego ... Dzięki!
nykc

1

Wypróbowałem to w Ubuntu 18.04 i jest to jedyne rozwiązanie, które działało dla mnie:

ALTER USER my_user@'%' IDENTIFIED WITH mysql_native_password BY 'password';

-4

Myślę, że konfigurowanie serwera mysql bez szyfrowania caching_sha2_password nie jest przydatne, musimy znaleźć sposób na publikowanie, wysyłanie lub uzyskiwanie bezpiecznych informacji przez sieć. Jak widać w poniższym kodzie, nie używam zmiennej $ db_name i używam użytkownika na serwerze mysql ze standardowym hasłem konfiguracyjnym. Po prostu utwórz standardowe hasło użytkownika i skonfiguruj wszystkie uprawnienia. to działa, ale jak powiedziałem bez poczucia bezpieczeństwa.

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

?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.