認証プロトコルの現在の実装は、古い (4.1 より前) クライアントによって使用されるアルゴリズムと互換性がないパスワードハッシュアルゴリズムを使用しています。古いクライアントを使用して 4.1 以降のサーバーに接続しようとすると、次のメッセージが表示されて失敗することがあります。
shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
この問題に対処する場合、推奨される解決方法はすべてのクライアントプログラムをアップグレードして、4.1.1 以降のクライアントライブラリが使用されるようにすることです。これを行うことができない場合は、次のいずれかの方法を使用します。
4.1 より前のクライアントプログラムを使用してサーバーに接続する場合に、4.1 より前のスタイルのパスワードを持つアカウントを使用します。
-
4.1 より前のクライアントプログラムを使用する必要がある各ユーザーのパスワードを 4.1 より前のスタイルにリセットします。これは、
SET PASSWORD
ステートメントおよびOLD_PASSWORD()
関数を使用して行うことができます。MySQL 5.6.6 の時点では、アカウントの認証プラグインがmysql_old_password
であることも最初に確認する必要があります。mysql> UPDATE mysql.user SET plugin = 'mysql_old_password' mysql> WHERE User = 'some_user' AND Host = 'some_host'; mysql> FLUSH PRIVILEGES; mysql> SET PASSWORD FOR -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
上記の例では、「
newpwd
」 を使用するパスワードに置き換えます。MySQL は元のパスワードを教えることはできないため、新しいパスワードを指定する必要があります。 -
古いパスワードハッシュアルゴリズムをデフォルトで使用することをサーバーに通知します。
old_passwords
システム変数に 1 を設定して、mysqld を起動します。-
長い 4.1 形式のパスワードにアップデートされた各アカウントに、古い形式のパスワードを割り当てます。これらのアカウントは次のクエリーを使用して識別できます。
mysql> SELECT Host, User, Password FROM mysql.user -> WHERE LENGTH(Password) > 16;
そのクエリーによって表示された各アカウントレコードについて、
Host
値およびUser
値を使用し、前述したいずれかの方法を使用してパスワードを割り当てます。
「クライアントは認証プロトコルに対応できません」
というエラーは、複数のバージョンの MySQL がインストールされているが、クライアントプログラムが動的にリンクされ、古いライブラリにリンクされる場合にも発生することがあります。クライアントが互換性のある最新のライブラリバージョンを使用していることを確認してください。これを行う手順はシステムによって異なります。
PHP の mysql
拡張は、MySQL 4.1.1 以降の認証プロトコルをサポートしていません。これは使用している PHP バージョンに関係なく当てはまります。mysql
拡張を MySQL 4.1 以降とともに使用する場合は、古いクライアントとともに動作するように MySQL を構成するために、前述のいずれかの方法を使用する必要があることがあります。mysqli
拡張 (PHP 5 で追加された「MySQL Improved」を意味します) は MySQL 4.1 以降で採用されている改善されたパスワードハッシュと互換性があり、この MySQL クライアントライブラリを使用するために MySQL で特別な構成を行う必要はありません。mysqli
拡張については、http://php.net/mysqliを参照してください。
パスワードハッシュおよび認証の背景情報については、セクション6.1.2.4「MySQL でのパスワードハッシュ」を参照してください。