web-dev-qa-db-ja.com

「不明な認証方法」でMySQLリモート接続が失敗する

ローカルマシンからMySQLサーバーにオンラインでリモート接続しようとしていますが、次のエラーが表示されます。

Warning: PDO::__construct(): The server requested authentication 
method unknown to the client [mysql_old_password] in 
C:\xampp\htdocs\ticket\terminal\sync.php

SQLSTATE[HY000] [2054] The server requested authentication method 
umknown to the client

ローカルMySQLサーバーのバージョンは5.5.27、libmysql-mysqlnd 5.0.10リモートMySQLサーバーのバージョンは5.5.23で、mysqlndバージョンは公開されていません。

互換性のないパスワードハッシュの問題だと思いますが、解決方法はわかりません。以下は私の接続コードの一部です

$dsn = 'mysql:Host=184.173.209.193;dbname=my_db_name';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 

try {
    $online_dbh = new PDO($dsn, 'myusername', 'mypassword', $options);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Congratulations!";
} catch (PDOException $e) {
    echo $e->getMessage();
} 
13
Chibuzo

私は挑戦を克服しました。私のリモートMySQLデータベースホストはまだ16バイトの古いMySQLパスワードハッシュを使用しているのに、ローカルホストデータベースサーバーは41バイトのパスワードハッシュを使用していることがわかりました。次のクエリを使用して、パスワードの長さを見つけました。

SELECT PASSWORD('mypass') 

次のクエリを実行して、localhostデータベースサーバーのパスワードハッシュを16バイトに変更しました

SET GLOBAL old_passwords = 1;

その後、my.iniファイル、およびold_password=1サーバーが再起動したときに、新しいパスワードシステムに戻らないようにします。しかし、それは私の問題を解決しませんでした。

PHPMySQLAPIを使用していたため、認証を処理するのはPHPであることがわかったため、PHP 5.2.8そして、リモート接続を正常に確立することができました。

これが誰かの助けになることを願っています。

4
Chibuzo

PHP 5.3+を使用していると仮定すると、 後方非互換性の変更

新しいmysqlndライブラリでは、MySQL 4.1の新しい41バイトのパスワード形式を使用する必要があります。古い16バイトのパスワードを引き続き使用すると、mysql_connect()および同様の関数が「mysqlndは古い認証を使用してMySQL 4.1+に接続できません」というエラーを発生させます。

その場合、パスワードの更新については https://stackoverflow.com/a/1340538/187954 をご覧ください。

13

これは、この問題の誰かを助けるかもしれません。これが私の状況での修正方法です。 MySQL PHP API(PDO_MYSQL) Webサイトから

PHP 7.1.16より前のバージョン、またはPHP 7.2より7.2.4より前のバージョン)を実行する場合、MySQL 8 Serverのデフォルトのパスワードプラグインをmysql_native_passwordに設定するか、または表示されますcache_sha2_passwordが使用されていない場合でも、サーバーがクライアント[caching_sha2_password]に認識されていない認証方法を要求したようなエラー。

これは、MySQL 8がデフォルトで、古いPHP(mysqlnd)リリースで認識されないプラグインであるcache_sha2_passwordになります。代わりに、my.cnfでdefault_authentication_plugin = mysql_native_passwordを設定して変更します。将来的にサポートされますPHPリリース。その間、 mysql_xdevapi 拡張がサポートします。

4
Rob

この同じ問題にぶつかり、その問題が実際にPHPに関係していることがわかりました。

解決策は私にとって簡単でした。PDOではなくmysqliに切り替えてください。 Zend_Dbを使用する場合、これは1行を変更するのと同じくらい簡単です。

$db = Zend_Db::factory('pdo_mysql',array('Host' => MYSQL_Host, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));

になる

$db = Zend_Db::factory('mysqli',array('Host' => MYSQL_Host, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));

しかし、アプリケーションがZend_Db抽象化(またはその他の)レイヤーを使用していない場合、問題が発生する可能性があります。

2
Wouter

共有ホスティングサービス(bluehost.com)でこの問題が発生しました。 Bluehostが提供するWebインターフェイスを介して、中断しているMySqlユーザーのパスワードをリセットしました。古いパスワードを再利用し、インターフェースで再入力して保存しましたが、すべてが再び問題ありませんでした。

1
metatron

laravel 5.6およびデフォルトのmysqlデータベース(setはservices :)でbitbucketパイプラインを実行すると、この問題が発生しました。

解決策は、古いバージョンのmysqlを使用することでした

definitions:
  services:
    mysql:
     image: mysql:5.6

PS:PHP 7.1

0

mysql_native_passwordで識別されるユーザー「username」@「localhost」を「password」で変更します。それを修正します。

0
Adrián Prieto