MySQL 8: Public Key Retrieval is not allowed 오류 해결 방법

MySQL 8에서 Public Key Retrieval is not allowed 에러가 발생한는 원인과 해결 방법을 설명합니다.


MySQL 8에서 DB connection을 맺을 때 Public Key Retrieval is not allowed 오류가 발생할 때가 있습니다. MySQL 8부터 기본적으로 사용하는 password plugin이 mysql_native_password에서 caching_sha2_password로 교체되어 발생하는 문제입니다. 이전 버전에서 사용하던 mysql_native_password plugin과 다르게 caching_sha2_password에서는 패스워드를 암호화해서 서버에 전달해야하는데 이때 사용할 암호화 키를 클라이언트에서 미리 설정하지 않아서 발생하는 오류입니다.

이를 해결하는 방법은 두가지가 있습니다.

  1. 클라이언트에 서버 공개키를 설정해 패스워드를 암호화해서 전달하도록 한다.
  2. 서버에 연결할 때 TLS 연결을 한다. 이 경우 연결 자체가 암호화되기 때문에 패스워드 또한 암호화되어 전달된다.

방법 1. TLS 연결을 하지 않았을 때 서버의 공개키로 암호화하기

클라이언트에 서버의 공개키를 설정하는 방법은 두가지가 있습니다. 클라이언트에 수동으로 서버 공개키를 설정하는 방법과 클라이언트에서 서버에 연결할 때 서버 공개키를 가져오는 방법이 있습니다.

미리 받아온 공개키를 클라이언트에 설정하는 방법

클라이언트에서 연결할 때 미리 받아온 공개키를 설정할 수 있습니다. mysql cli의 경우 --server-public-key-path 옵션으로 서버 공개키 파일 경로를 설정할 수 있습니다.

서버에 설정된 암호화키는 다음 SQL로 확인할 수 있습니다.

SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'

위에서 확인한 공개키를 파일에 저장하고 클라이언트에서 연결할 때 해당 파일을 지정해주면 됩니다.

mysql -h <host> -u <user> \
  --server-public-key-path=/path/to/server_public_key.pem

서버에 연결 후 공개키를 가져오는 방법

클라이언트에 서버의 공개키를 직접 설정하지 않고 서버에 연결할 때 서버 공개키를 가져오도록 설정할 수 있습니다. 다면 공개키를 전달받을 때 중간자 공격이 발생할 수 있으므로 신뢰할 수 있는 네트워크에서만 사용해야합니다. mysql cli의 경우 --ssl-mode=DISABLED --get-server-public-key=true를 추가하거나 JDBC의 경우 connection url에 allowPublicKeyRetrieval=true 옵션을 주어 공개키를 가져오도록 설정할 수 있습니다.

기본적으로 allowPublicKeyRetrieval는 비활성화 되어있는데, 공개키를 전달하는 경로는 암호화되어있지 않아서 중간자공격에 취약하기 때문입니다.

방법 2: TLS로 연결하기

서버에 인증서 설정이 필요합니다. 서버 설정을 변경해야할 수 있으며 설정 방법은 1을 참고해주세요.

클라이언트에서 연결할 때 CA 인증서의 위치를 설정해야합니다. AWS RDS에서는 CA 인증서를 제공해서 사용하면 됩니다(2).

mysql --host=<host> -u <user> -p \
  --ssl-ca=/path/to/ca.pem

참고 자료

Footnotes

  1. MySQL :: MySQL 8.4 Reference Manual :: 8.3.1 Configuring MySQL to Use Encrypted Connections

  2. Securely connect to Lightsail MySQL databases with SSL/TLS - Amazon Lightsail