はじめに
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に追加するだけで簡単に解決できました。
同じエラーに直面した方の助けになれば幸いです!
参考