1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python x MySQL】 Authentication plugin 'caching_sha2_password' is not supportedエラーの解決方法

Posted at

概要

  • PythonからMySQLに接続しようとしたら、'caching_sha2_password' is not supportedエラーが表示されました。
  • 本記事ではこちらの解決方法を記します。

エラー内容

mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
  • caching_sha2_passwordいう認証プラグインがサポートされていないことを示しているよう。

caching_sha2_passwordとは

  • mysql_native_password:MySQL 8.0以前のバージョンで、デフォルトの認証プラグイン。パスワードはハッシュ化されず、平文のままデータベースに保存される。
  • caching_sha2_password:MySQL 8.0以降で導入された新しいデフォルトの認証プラグイン。パスワードはSHA-256ハッシュ関数とソルトを使用してパスワードをハッシュ化され、データベースに保存される。

mysql.connector (mysql-connector-python) とは

  • PythonとMySQLサーバとの接続を提供するための公式のMySQLコネクタです。
  • 通常、mysql.connectorモジュールはmysql-connector-pythonパッケージに含まれています。

原因の模索

MySQL 8.0以降、認証方式のデフォルトがそのcaching_sha2_passwordに変更されているが、mysql.connectorがそれにまだ対応していないため。

  • なるほど、なので認証方式を従来のmysql_native_passwordに戻してあげようということ。(上記記事では、Pythonプログラムから接続するユーザーのみの最小限で設定変更する、という方針だったのでそれで実施)
mysql -u root -p
alter user 'root'@'%' identified with mysql_native_password by 'yourpassword';
  • 以下で設定が反映されているか確認できます。
mysql> select user, plugin from mysql.user where user='root';
+------+-----------------------+
| user | plugin                |
+------+-----------------------+
| root | mysql_native_password |
| root | mysql_native_password |
+------+-----------------------+
  • これで直るはず、と思ったら、、また同じエラーが出ました。あれ。上記記事にauth_pluginパラメーターで明示的に設定したら解決したとあったのですが、自分はやってみても変わらず...
conn = mysql.connector.connect(
    host="yourhost",
    port=3306,
    user="yourname",
    password="yourpassword",
    database="yourdb",
    auth_plugin="mysql_native_password"
)
  • MySQLサーバーの設定ファイルmy.cnf(もしくはmy.ini)でデフォルトの認証プラグインの設定ができるので編集してみる。
  • ここを変更すると古い認証プラグインであるmysql_native_passwordが使用できるはずです(デフォルトではコメントアウトされていました) 。
my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
  • しかし、まだ同じエラー。なぬw

解決方法

Yeah., pip install mysql-connector-python worked!!!

  • 自分がpip installしていたのはmysql.connectorでした。
  • ということで、上記サイトの通り、以下のコマンドを実施。
pip install --upgrade mysql-connector-python

MySQL 8.0 では、caching_sha2_password が mysql_native_password ではなくデフォルトの認証プラグインです。

caching_sha2_password および sha256_password 認証プラグインは、mysql_native_password プラグインよりもセキュアなパスワード暗号化を提供し、caching_sha2_password は sha256_password よりも優れたパフォーマンスを提供します。

  • ちなみに、上述したmysqldのデフォルト認証プラグイン設定のところは後でリセットしておきましたが問題なかったです。こちらも上記公式ドキュメントに記載がありますが、「8.0 より前のクライアントが 8.0 サーバーに接続できるよう」にするための設定です。ただし、一時的なものとして使用するものであり、セキュリティ的には新しい方が良いみたいです。

MySQL インストールで 8.0 より前のクライアントを提供する必要があり、MySQL 8.0 以上へのアップグレード後に互換性の問題が発生した場合、これらの問題に対処して 8.0 より前の互換性をリストアする最も簡単な方法は、以前のデフォルトの認証プラグイン (mysql_native_password) に戻すようにサーバーを再構成することです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?