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
에서는 패스워드를 암호화해서 서버에 전달해야하는데 이때 사용할 암호화 키를 클라이언트에서 미리 설정하지 않아서 발생하는 오류입니다.
이를 해결하는 방법은 두가지가 있습니다.
- 클라이언트에 서버 공개키를 설정해 패스워드를 암호화해서 전달하도록 한다.
- 서버에 연결할 때 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