2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker環境でMySQLに接続しようとしたら「Public Key Retrieval is not allowed」と出力された

Posted at

はじめに

Docker環境でMavenコンテナからMySQLコンテナに対して、JDBCを使用して接続しようとした際、以下のエラーに直面したので備忘として残したいと思います。

Failed to initialize pool: Public Key Retrieval is not allowed

結論

allowPublicKeyRetrieval=trueというオプションを追加することで解決できました。

実行環境

私が試した環境は以下の通りです:

  • Docker: コンテナ環境で実行
  • MySQL: 8.x系
  • JDBCドライバ: 最新バージョンを使用
  • 設定ファイル: docker-compose.yml内で接続URLを記述
    services:
      app:
        image: your-app-image
        environment:
          DB_URL: jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
          DB_USER: root
          DB_PASSWORD: password
    

エラーの原因

エラーの原因を調べてみたところ、この問題はMySQL 8.x系の認証方式が影響していることが分かりました。
MySQL 8.xでは、デフォルトでcaching_sha2_passwordという認証方式が採用されています。この認証方式では接続時にサーバーの公開鍵を取得する必要がありますが、JDBCの接続設定で公開鍵取得が許可されていないと接続が失敗してしまいます。

このエラーに対応するためには、JDBC接続URLに「公開鍵の取得を許可する設定」を追加する必要があるようでした。

解決方法

試行錯誤の末、allowPublicKeyRetrieval=trueというオプションをJDBC接続URLに追加することで解決しました。

修正前の接続URL(docker-compose.yml)

environment:
  DB_URL: jdbc:mysql://<mysql-host>:<port>/<database>?useSSL=false

修正後の接続URL(docker-compose.yml)

environment:
  DB_URL: jdbc:mysql://<mysql-host>:<port>/<database>?useSSL=false&allowPublicKeyRetrieval=true

まとめ

Public Key Retrieval is not allowed」というエラーが出たときは、そこまで複雑な構成にしていないDocker環境でなぜ…と戸惑いましたが、allowPublicKeyRetrieval=trueをJDBC接続URLに追加するだけで簡単に解決できました。
同じエラーに直面した方の助けになれば幸いです!

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?