php mysqli_connect:クライアントに不明な認証方法[caching_sha2_password]


100

mysqli_connectMySQLデータベースへのログインにphpを使用しています(すべてローカルホスト上)

<?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サーバーの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_passwordMySQLサーバiniファイルで、それがすべてでUSER1またはuser2のを使ってログインすることはできません。

エラー:mysqli_connect():サーバーがクライアント[caching_sha2_password]に不明な認証方法を要求しました...

mysql_native_passwordMySQLサーバiniファイルで、それはUSER1が、user2のと、同じエラーでログインすることが可能です。


caching_sha2_passwordmySqlサーバーを使用してログインするにはどうすればよいですか?


PDOはこれをサポートしていますか?に関する他のレポートを見てきましたmysqli
tadman 2018

@黃皓哲によって投稿された回答は、承認された回答としてマークする必要があります。
FIL

回答:


55

PHP 7.4以降、これは問題ではなくなりました。caching_sha2認証方法のサポートがmysqlndに追加されました。


現在、PHPmysqli拡張機能は新しいcaching_sha2認証機能をサポートしていません。彼らがアップデートをリリースするまで待つ必要があります。

MySQL開発者からの関連記事を確認してください:https//mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/

彼らはPDOについて言及していませんでした、多分あなたはPDOと接続することを試みるべきです。



@Machavityこの答えがまだ有効かどうか知っていますか?つまり、新しいPHPバージョンではまだ時代遅れではありませんか?
gen 2010年

基づいて@genこのバグ、ルックス、それは7.4.2のとして働いているように
Machavity

3
php7.4にアップグレードすると、問題は解決しました。そしてmysql_native_password、いくつかの回答で示唆されているように認証方法を変更するよりも、それが最善のアプローチだと思います。
ultrasamad

docker(コンテナではapache + php、他のコンテナではmysql)を使用していますが、これで問題が解決しました。ありがとう!
ジョアンGalmésリエラ

235

私はこれを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
いい答えです。ここでの
落とし穴

3
新しいパスワードハッシュを古いものに変換する方法を探していました(質問のuser2形式からuser1形式など)。あなたの答えはまさにその仕事でした
会計士

10
そして、php-7.2.9 / 11をMySQL-8.012とうまく連携させるための4日間の闘いは終わりました。PHPチームの誰かが、tarballのINSTALLでこれに注意することを確信できますか?それは来年か2年で何千人もの時間を節約するでしょう。
MountainMan

4
@MountainManは私の命を救った
チェイス

8
これは回避策の解決策として受け入れられるべきです
YohanesAI19年

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

後に引用符( ')を削除し、後に引用符(')ALTER USERを保持しますmysql_native_password BY

それは私のためにも働いています。


2
唯一の解決策は、WAMPサーバーを使用して、ローカルホストサーバー上の私のために働いたことが:)
Jodyshop

これは私のMacの自作LAMPセットアップでそれを修正したようです。しかし、debianではこの問題は発生しませんでした。
マグナス

22

Windowsを使用caching_sha2_passwordしていて、まったく使用できない場合は、次の操作を実行できます。

  1. MySQLインストーラーを再実行します
  2. MySQLサーバーの横にある[再構成]を選択します(一番上の項目)
  3. 「認証方法」が表示されるまで「次へ」をクリックします
  4. 「認証に強力なパスワード暗号化を使用する(推奨)」を「レガシー認証方法を使用する(MySQL 5.Xの互換性を維持する)」に変更します。
  5. 「次へ」をクリックします
  6. アカウントとロールにrootアカウントのパスワードを入力し、[確認]をクリックします
  7. 「次へ」をクリックします
  8. 「構成の適用」が表示されるまで「次へ」をクリックし続けます
  9. 「実行」をクリックします

インストーラーは、必要なすべての構成変更を行います。


この回答に1年賛成した後、私のデータベースがハッキングされました...
コードツリー

11

それは私のために働いています(PHP 5.6 + PDO / MySQL Server 8.0 / Windows 7 64ビット)

ファイルを編集します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';

それは機能します、ありがとう...私たちはその2つのことを設定する必要があります:
mysqlconfとalteruser

9

多くの人と同じように、私も同じ問題を抱えています。ユーザーはmysql_native_passwordを使用するように設定されており、コマンドラインから接続できますが、mysqli()を接続する唯一の方法は追加することです。

default-authentication-plugin = mysql_native_password

ubuntu 19.10のセットアップで、/ etc / mysql / mysql.conf.d /mysqld.cnfの[mysqld]セクションに移動します。


2
また、この変更の前にユーザーが作成された場合、それは機能しないことに注意してください。したがって、最初に構成でdefault-authenticationを設定してから、作業するためにユーザーを作成する必要があります。
オレグポポフ

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

最後に実行:brewservicesがmysqlを再起動します


これが必要...ありがとう!
nykc

1

私はUbuntu18.04でこれを試しましたが、これが私のために機能した唯一のソリューションです。

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

-4

cache_sha2_password暗号化なしでmysqlサーバーを構成することは有用ではないと思います。ネットワークを介して安全な情報を公開、送信、または取得する方法を見つける必要があります。以下のコードにあるように、私は変数$ db_nameを使用せず、標準の構成パスワードを持つ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.