php mysqli_connect : 클라이언트에 알려지지 않은 인증 방법 [caching_sha2_password]


95

mysqli_connectMySQL 데이터베이스에 로그인하기 위해 PHP 를 사용 하고 있습니다 (모두 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');    
}
?>

이것은 mysql.user 테이블입니다. mysql.user 테이블

MySQL Server ini 파일 :

[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

caching_sha2_password는 MySQL 서버의 INI 파일에, 모든에서 사용자 1 또는 사용자 2로 로그인 할 수 없습니다;

error : mysqli_connect () : 서버가 [caching_sha2_password] 클라이언트가 알 수없는 인증 방법을 요청했습니다 ...

mysql_native_password는 MySQL 서버의 INI 파일에, 그것은하지만, 사용자 2, 같은 오류와, 사용자 1로 로그인 가능;


caching_sha2_passwordmySql 서버에서 어떻게 로그인 할 수 있습니까?


PDO가이를 지원합니까? 에 대한 다른 보고서를 보았습니다 mysqli.
tadman

@ 黃皓哲가 게시 한 답변은 수락 된 답변으로 표시되어야합니다.
FIL

답변:


53

PHP 7.4부터는 더 이상 문제가되지 않습니다. caching_sha2mysqlnd 에 인증 방법에 대한 지원 이 추가되었습니다.


현재 PHP mysqli 확장은 새로운 caching_sha2 인증 기능을 지원하지 않습니다. 업데이트를 릴리스 할 때까지 기다려야합니다.

MySQL 개발자의 관련 게시물 확인 : https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

그들은 PDO를 언급하지 않았으므로 PDO와 연결을 시도해야 할 수도 있습니다.



@Machavity이 답변이 여전히 유효한지 알고 있습니까? 즉. 최신 PHP 버전에서는 아직 구식이 아닙니다.
세대

@gen 이 버그에 따르면 7.4.2
Machavity

3
php7.4로 업그레이드하면 문제가 해결되었습니다. 그리고 mysql_native_password일부 답변에서 제안한대로 인증 방법을 변경하는 것보다 이것이 최선의 방법이라고 생각합니다 .
ultrasamad

나는 docker (컨테이너의 apache + php와 다른 컨테이너의 mysql)를 사용하고 이것은 내 문제를 해결했습니다. 감사!
Joan Galmés Riera

227

SQL 명령으로 이것을 해결합니다.

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

https://dev.mysql.com/doc/refman/8.0/en/alter-user.html에서 참조됩니다.

새 사용자를 만드는 경우

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

https://dev.mysql.com/doc/refman/8.0/en/create-user.html에서 참조됩니다.

이것은 나를 위해 작동합니다


3
좋은 대답입니다. 여기 잡았다는 서버 설정에 따라 새 사용자를 추가 할이 때마다 수행해야 할 수도 있습니다
Machavity

3
새 암호 해시를 이전 암호 (예 : user2 형식에서 user1 형식으로)로 변환하는 방법을 찾고 있었는데 감사합니다. 귀하의 답변은 정확히 작업을 수행했습니다
Accountant م

10
그래서 php-7.2.9 / 11이 MySQL-8.012와 잘 어울리도록하기위한 4 일간의 투쟁이 끝났습니다. PHP 팀의 누군가가 tarball의 INSTALL에서 이것을 주목하도록 설득 할 수 있습니까? 내년 또는 2 년 동안 수천 시간을 절약 할 수 있습니다.
MountainMan

4
@MountainMan는 나의 생명을 구했다
체이스

8
이 해결 솔루션에 대한 허용 대답해야한다
Yohanes AI

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

뒤에 따옴표 ( ')를 제거 ALTER USER하고 뒤에 따옴표 (')를 유지하십시오.mysql_native_password BY

그것은 나에게도 효과가 있습니다.


2
그것은 WAMP 서버를 사용하는 localhost 서버에서 저를 위해 일한 유일한 솔루션이었습니다. :)
Jodyshop

이것은 내 Mac의 홈브류 LAMP 설정에서 수정하는 것처럼 보였습니다. 그래도 데비안에서는이 문제가 발생하지 않았습니다.
Magnus

22

Windows를 사용 caching_sha2_password중이고 전혀 사용할 수없는 경우 다음을 수행 할 수 있습니다.

  1. MySQL 설치 프로그램을 다시 실행하십시오.
  2. MySQL Server (상위 항목) 옆에있는 "재구성"을 선택합니다.
  3. "인증 방법"이 나올 때까지 "다음"을 클릭하십시오.
  4. "인증에 강력한 암호 암호화 사용 (권장)"을 "레거시 인증 방법 사용 (MySQL 5.X 호환성 유지)"로 변경
  5. "다음"을 클릭하십시오.
  6. 계정 및 역할에 루트 계정 암호를 입력하고 "확인"을 클릭하십시오.
  7. "다음"을 클릭하십시오.
  8. "구성 적용"이 나올 때까지 "다음"을 계속 클릭하십시오.
  9. "실행"을 클릭하십시오

설치 프로그램은 필요한 모든 구성을 변경합니다.


이 답변을 1 년 동안 upvoting 한 후 내 db가 해킹당했습니다 ...
Code Tree

11

나를 위해 일하고 있습니다 (PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64bits)

파일 편집 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini:

default_authentication_plugin=mysql_native_password

Windows 및 MySQL 셸에서 MySQL 서비스 재설정 ...

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

작동합니다. 감사합니다 ... 우리는 두 가지를 설정해야합니다 : mysql conf와 사용자 변경
danisupr4

9

많은 사람들처럼 저도 같은 문제를 겪었습니다. 사용자가 mysql_native_password를 사용하도록 설정되어 있고 명령 줄에서 연결할 수 있지만 mysqli ()를 연결하는 유일한 방법은 다음을 추가하는 것입니다.

default-authentication-plugin = mysql_native_password

우분투 19.10의 내 설정에서 [mysqld] 섹션, /etc/mysql/mysql.conf.d/mysqld.cnf


2
또한 사용자가이 변경 전에 생성되면 작동하지 않습니다. 따라서 먼저 구성에서 기본 인증을 설정하고 작업하려면 사용자를 만들어야합니다!
Oleg Popov

4

ALTER USER 'root' @ 'localhost' identified with mysql_native_password BY 'root123';명령 줄에서 다음 명령 을 실행하고 마지막으로 로컬 서비스에서 MySQL을 다시 시작했습니다.


'root' @ 'localhost'대신 여기에 공백을 읽어서는 안됩니다ALTER USER 'root'@'localhost' identified with mysql_native_password BY 'root123';
d1jhoni1b

4

이제 PHP7.4로 업그레이드 할 수 있으며 MySQL은 caching_sha2_password기본적 으로 함께 제공 되므로 기본 MySQL 설치는 mysqli_connect구성 필요없이 작동 합니다.


2
좀 빠지는. 7.4.0 및 7.4.1에서는 버그가 있습니다. 7.4.2에서 수정 됨
Machavity

3

Mac을 사용하는 경우 문제를 해결하는 방법은 다음과 같습니다. 이것은 수많은 시행 착오를 거친 후입니다. 이것이 다른 사람들에게 도움이되기를 바랍니다 ..

디버깅 :

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

$ which mysql
/usr/local/bin/mysql

해결 : nano /usr/local/etc/my.cnf

추가 : 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
------

마지막으로 실행 : brew services restart mysql


이게 필요해 ... 고마워!
nykc

1

나는 우분투 18.04에서 이것을 시도했고 나를 위해 일한 유일한 솔루션입니다.

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

-4

caching_sha2_password 암호화없이 mysql 서버를 구성하는 것은 유용하지 않다고 생각합니다. 네트워크를 통해 보안 정보를 게시, 전송 또는 확보하는 방법을 찾아야합니다. 아래 코드에서 볼 수 있듯이 $ db_name 변수를 사용하지 않고 im은 표준 구성 암호로 mysql 서버의 사용자를 사용합니다. Standar 사용자 암호를 만들고 모든 권한을 구성하십시오. 작동하지만 내가 어떻게 말 했는가.

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

?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.