MySQL TLS/SSL 오류 완벽 해결 가이드 (TLS/SSL error: self-signed certificate in certificate chain)

목차
- 🚨 문제 상황
- ⚡ 빠른 해결책
- 🛠️ 영구적 해결책
- 🐳 Docker 환경 특별 대응
- 🔒 운영 환경을 위한 보안 설정
- 🚀 편의성을 위한 추가 팁
- 🎯 상황별 권장 사항
- ⚠️ 주의사항
- 🏁 마무리
개발자라면 한 번쯤 마주치게 되는 MySQL 연결 오류 중 하나가 바로 TLS/SSL 관련 오류입니다. 특히 Docker 환경이나 원격 MySQL 서버에 연결할 때 자주 발생하는 이 문제를 깔끔하게 해결해보겠습니다.
🚨 문제 상황
root@6eaecc11c297:/var/www/html# mysql -h172.18.0.1 -ublog -p
Enter password:
ERROR 2026 (HY000): TLS/SSL error: self-signed certificate in certificate chain
이런 오류 메시지를 보신 적 있으신가요? 분명 비밀번호도 맞게 입력했는데 연결이 거부되는 상황입니다.
왜 이런 오류가 발생할까요?
- MySQL 8.0의 기본 정책 변화
- MySQL 8.0부터는 기본적으로 SSL 연결을 강제합니다
- 보안 강화를 위한 조치이지만, 개발 환경에서는 불편함을 초래합니다
- 자체 서명 인증서(Self-signed Certificate)
- MySQL 서버가 자체 서명된 SSL 인증서를 사용
- 클라이언트가 이 인증서를 신뢰하지 않아 연결 거부
- Docker 네트워크 환경
- 컨테이너 간 통신에서 SSL 설정이 복잡해질 수 있음
⚡ 빠른 해결책
방법 1: 일회성 SSL 비활성화
가장 간단한 방법입니다. 연결할 때마다 SSL을 비활성화하는 옵션을 추가합니다.
# 방법 1: --ssl-mode=DISABLED 사용
mysql -h172.18.0.1 -ublog -p --ssl-mode=DISABLED
# 방법 2: --ssl=0 사용
mysql -h172.18.0.1 -ublog -p --ssl=0
# 방법 3: --skip-ssl 사용
mysql -h172.18.0.1 -ublog -p --skip-ssl
# 방법 4: --disable-ssl 사용
mysql -h172.18.0.1 -ublog -p --disable-ssl
방법 2: SSL 인증서 검증 우회
SSL은 사용하되 인증서 검증만 우회하는 방법입니다.
mysql -h172.18.0.1 -ublog -p --ssl-mode=REQUIRED --ssl-ca=""
🛠️ 영구적 해결책
MySQL 클라이언트 설정 파일 활용
# 홈 디렉토리에 MySQL 설정 파일 생성
nano ~/.my.cnf
설정 파일 내용:
[client]
# 기본 연결 정보
host=172.18.0.1
user=blog
password=your_password_here
# SSL 설정 Mysql 8
ssl-mode=DISABLED
# SSL 설정 Mysql 5 호환설정
# ssl=0
# 또는 SSL을 사용하되 검증을 우회하려면:
# ssl-mode=REQUIRED
# ssl-ca=
이제 간단하게 mysql
명령어만 입력해도 연결됩니다!
mysql # 설정파일의 정보로 자동 연결
🐳 Docker 환경 특별 대응
Docker Compose 설정
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: blog
MYSQL_USER: blog
MYSQL_PASSWORD: blogpass
command: --ssl=0 # SSL 완전 비활성화
ports:
- "3306:3306"
Docker 실행 시 SSL 비활성화
docker run -d
-e MYSQL_ROOT_PASSWORD=password
-p 3306:3306
mysql:8.0 --ssl=0
🔒 운영 환경을 위한 보안 설정
개발 환경에서는 SSL을 비활성화해도 무방하지만, 운영 환경에서는 보안이 중요합니다.
올바른 SSL 인증서 설정
MySQL 서버 설정 파일 (/etc/mysql/mysql.conf.d/mysqld.cnf):
[mysqld]
# 올바른 SSL 인증서 경로 설정
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
ssl-ca=/etc/mysql/ssl/ca-cert.pem
# SSL 연결 강제
require_secure_transport=ON
SSL 인증서 생성 (자체 서명)
# CA 키 생성
openssl genrsa 2048 > ca-key.pem
# CA 인증서 생성
openssl req -new -x509 -nodes -days 3600
-key ca-key.pem -out ca-cert.pem
# 서버 키 생성
openssl genrsa 2048 > server-key.pem
# 서버 인증서 요청 생성
openssl req -newkey rsa:2048 -days 3600
-nodes -keyout server-key.pem -out server-req.pem
# 서버 인증서 생성
openssl x509 -req -in server-req.pem -days 3600
-CA ca-cert.pem -CAkey ca-key.pem -set_serial 01
-out server-cert.pem
🚀 편의성을 위한 추가 팁
연결 스크립트 만들기
#!/bin/bash
# mysql_connect.sh
echo "MySQL 블로그 DB에 연결 중..."
mysql -h172.18.0.1 -ublog -p --ssl-mode=DISABLED --prompt="BlogDB>ckedi "
실행 권한 부여 후 사용:
chmod +x mysql_connect.sh
./mysql_connect.sh
환경별 설정 분리
[client]
ssl-mode=DISABLED
운영 환경 (.my.cnf.prod):
[client]
ssl-mode=VERIFY_IDENTITY
ssl-ca=/path/to/ca-cert.pem
사용할 때:
# 개발 환경
mysql --defaults-file=~/.my.cnf.dev
# 운영 환경
mysql --defaults-file=~/.my.cnf.prod
🎯 상황별 권장 사항
환경 | 권장 방법 | 이유 |
---|---|---|
로컬 개발 | SSL 비활성화 | 빠른 개발을 위한 편의성 |
팀 개발 | 설정 파일 공유 | 일관된 환경 구성 |
스테이징 | 자체 서명 인증서 | 운영 환경 시뮬레이션 |
운영 환경 | CA 발급 인증서 | 최고 수준의 보안 |
⚠️ 주의사항
- 보안 vs 편의성: 개발 편의를 위해 SSL을 비활성화할 수 있지만, 운영 환경에서는 반드시 SSL을 활성화하세요.
- 비밀번호 관리: 설정 파일에 비밀번호를 저장할 때는 파일 권한을 600으로 설정하세요.
chmod 600 ~/.my.cnf
- 버전별 차이: MySQL 5.7과 8.0에서 SSL 기본 정책이 다르니 버전을 확인하세요.
🏁 마무리
MySQL의 TLS/SSL 오류는 처음엔 당황스럽지만, 원인을 이해하고 나면 쉽게 해결할 수 있습니다. 개발 단계에서는 편의성을 위해 SSL을 비활성화하되, 운영 환경에서는 반드시 적절한 SSL 설정을 적용하시기 바랍니다.
이 글이 MySQL 연결 오류로 고생하시는 개발자분들에게 도움이 되었기를 바랍니다! 😊
안정적이고 저렴한 가상 서버(VPS) 안내
안정적인 서버 호스팅을 찾고 계신가요? 지금 Vultr 호스팅을 한번 이용 해 보세요. 지금 보고 계신 HaruLogs 사이트도 Vultr에서 VPS 호스팅 하고 있습니다. 한국, 일본, 미국등 다양한 국가에 클릭 몇번으로 안정적이고 저렴한 VPS를 운영 할 수 있습니다.
아래 배너를 통해 회원 가입을 하시면 100달러의 무료 크레딧을 받을 수 있습니다. 100달러의 무료 크레딧은 Vultr의 최소 사양 VPS를 20대 동시 운영가능한 크레딧입니다.
Vultr 서비스 요약
- VPS
- 인스턴스
- AMD 또는 Intel High Performance 인스턴스 최저 $6 - 1vCPU, 1GB Memory, 2TB Bandwidth, 25GB NVMe
- 엣지
- 인스턴스
- Block Storage
- Object Storage (AWS S3 호환)
- Firewall
- Network
- Load Balancers
- Kubernetes
- Databases