MySQL Replication 트러블슈팅 – 인증 오류 (caching_sha2_password)

Trouble ShootingMySQLmasterslaveReplication
avatar
2025.04.21
·
4 min read

💥 문제 상황

서로 다른 EC2 서버에 구성한 MySQL Master-Slave Replication 환경에서,
Slave가 Master에 연결하지 못하며 다음과 같은 오류가 발생했습니다.

Last_IO_Errno: 2061
Last_IO_Error: Error connecting to source 'admin_ohy@10.0.2.6:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

Slave_IO_Running: Connecting 상태에서 멈추고, replication이 정상적으로 이루어지지 않음


🔍 원인 분석

  • MySQL 8.0부터 기본 인증 플러그인은 caching_sha2_password

  • 해당 플러그인은 SSL을 사용하지 않으면 인증 자체를 거부

  • Slave가 Master에 암호화되지 않은 평문 연결을 시도했기 때문에 오류 발생


해결 방법

방법 1: mysql_native_password로 인증 방식 변경

my.cnf 수정

[mysqld]
# MySQL 사용자의 인증 플러그인을 mysql_native_password로 지정합니다.
authentication_policy=mysql_native_password 

방법 2: SSL 인증서 기반 연결 설정

  • caching_sha2_password를 유지하면서 SSL 인증서를 사용해 연결

  • Master에 인증서 생성하고 Slave 복제 my.cnf 설정

  • Slave 실행 시 인증서 경로 마운트

인증서 생성

mkdir -p /etc/mysql/certs && cd /etc/mysql/certs

# 1. CA 생성
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem -subj "/CN=MySQL_CA"

# 2. Server 인증서
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=MySQL_Server"
openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

# 3. Client 인증서
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem -out client-req.pem -subj "/CN=MySQL_Client"
openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem

# 4. 권한 설정
chmod 644 server-key.pem server-cert.pem ca.pem

Slave 서버로 인증서 복사

  • SSL 연결을 위해 Master에서 생성한 인증서를 Slave 쪽에도 복사해줍니다.

  • Slave에도 동일한 디렉터리 구조(/etc/mysql/certs/)가 있어야합니다.

scp /etc/mysql/certs/* root@{슬레이브 서버 IP}:/etc/mysql/certs/

Master my.cnf 수정

[mysqld]
# SSL 인증을 위한 CA, 서버 인증서, 서버 키 경로 설정
ssl-ca=/etc/mysql/certs/ca.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem

# 보안 연결(SSL)만 허용
require_secure_transport=ON

이제 docker run 시 인증서 경로를 마운트해주면 됩니다.


트러블슈팅 결과

  • 기본 인증 플러그인 caching_sha2_password 사용으로 인해 SSL 미사용 시 인증 오류 발생

  • Master에 인증서 생성 → Slave로 복사 → SSL 기반 연결 설정

  • Slave_IO_Running: Yes, SSL 적용 완료 상태로 복제 정상 작동 확인








- 컬렉션 아티클