$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p
Enter password:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
このエラーになる条件。
caching_sha2_password
プラグインを使っているアカウント
かつ- まだサーバー側にSHA2キャッシュが作られていないアカウント
かつ - サーバーの公開鍵を指定していない非SSLのTCP接続
この条件に合致しているとログインが転けて↑のエラーを食らう。
解決策1. caching_sha2_password
プラグインをやめて mysql_native_password
プラグインを指定する
mysql> ALTER USER yoku0825 IDENTIFIED WITH mysql_native_password BY 'new_password`;
解決策2. 一度ログインに成功すればサーバー側にSHA2キャッシュが作成されるので、一度「エラーになる条件を満たさない」接続をしてやる
$ mysql80 -h localhost -S /usr/mysql/8.0.13/data/mysql.sock -u yoku0825 -p ## ソケット接続
$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=PREFERRED -p ## SSL接続
$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p --server-public-key-path=/usr/mysql/8.0.13/data/public_key.pem ## サーバー公開鍵を指定した非SSL接続
解決策3. サーバーの公開鍵を指定する
↑と一緒で、
mysql
コマンドラインクライアントだとこう。
$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p --server-public-key-path=/usr/mysql/8.0.13/data/public_key.pem ## サーバー公開鍵を指定した非SSL接続
のいずれかをやればOK。
要は、
caching_sha2_password
だと初回の認証成功時にパスワードキャッシュをサーバーサイドに作るらしいんだけど、そこでMITM攻撃を食らうとマズいからこんな仕様になっているらしい。
その理屈(どうして1回目だけがmysql_native_passwordとかと比べてダメなのか)はよくわからないんだけど誰か読んで教えてくだしあ(ソースを読まないとこれ以上の理解は出てこないような気もする)
なお、
- mysqldの再起動
FLUSH PRIVILEGES
- キャッシュはアカウント単位なので、
CREATE USER
直後
もこれ(SHA2キャッシュがない状態)にあたるので、おとなしくSSL接続使うようにした方が良いと思われるのでした。
なお、このネタはご覧のスポンサー(?)の提供でお送りしました
MySQL 8.0でユーザ作成後、一度もmysqlコマンドラインクライアントでログインしていない場合に、Connector/JのuseSSL=falseでの接続が失敗するという事象に当たった。事前に一度でもログインしておけば大丈夫。うーむ…— SH2 (@sh2nd) 2018年8月10日
sha2キャッシュが計算されてないからかなとか思いましたが、mysql_native_passwordでもそうなります?— yoku0825 (@yoku0825) 2018年8月10日
なるほどmysql_native_passwordなら一発で接続できました~— SH2 (@sh2nd) 2018年8月10日
ドンピシャな気がしてきました!https://t.co/6NNrHpXmNdhttps://t.co/rWGbgEqzdq— yoku0825 (@yoku0825) 2018年8月10日
MySQL Client/server protocol でサーバーから公開鍵を取得することができます。
返信削除このオプションで公開鍵取得を有効にできるようです。
https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_get-server-public-key
SSLやUnix domain socket じゃない (非secureな) 接続でRSA暗号化するのは sha256_password も同じだと思うので、
同じ現象は MySQL 5.7 で sha256_password を使ったときも起こると思います。
おお、そんな便利なものがあるんですね!
返信削除sha256_password はその通りでした!
これ、エラーコードが2000番台なあたりからわかるようにクライアントサイドエラーで、サーバーが「キャッシュがないからフル認証寄越せ」パケットを送って、それを受け取ったクライアントが「いや、SSLじゃないからアボート」ってやってるっぽいんですよね…(いいのかなその実装で)