SSL 인증서 완전 가이드
SSL/TLS란
SSL(Secure Sockets Layer)과 그 후속인 TLS(Transport Layer Security)는 인터넷 통신을 보호하는 암호화 프로토콜입니다. HTTPS 사이트에 접속하면 TLS가 브라우저와 서버 간 연결을 암호화하여 도청과 변조를 방지합니다.
- 암호화 — 전송 중인 민감한 데이터 보호
- 인증 — 서버의 신원 확인
- 무결성 — 데이터가 변조되지 않았음을 보장
- SEO — Google은 HTTPS를 랭킹 시그널로 사용
- 신뢰 — 브라우저가 HTTPS 사이트에 자물쇠 아이콘 표시
작동 원리
TLS 핸드셰이크는 다음 단계로 안전한 연결을 수립합니다:
- Client Hello — 브라우저가 지원하는 TLS 버전과 암호 스위트 전송
- Server Hello — 서버가 버전/암호를 선택하고 인증서 전송
- 인증서 검증 — 브라우저가 인증서 검증 (발급자, 만료일, 도메인 일치)
- 키 교환 — 양측이 공유 세션 키 도출
- 암호화 통신 — 이후 모든 트래픽이 암호화됨
인증서 체인
루트 CA
└─ 중간 CA
└─ 엔드 엔티티 인증서 (사용자 사이트)
브라우저는 내장된 루트 CA 목록을 신뢰합니다. 인증서 체인을 따라 신뢰할 수 있는 루트에 도달하여 인증서를 검증합니다.
인증서 유형
검증 수준별
DV — 도메인 검증
도메인 소유권만 검증. 몇 분 내 발급. Let's Encrypt로 무료 취득 가능. 대부분의 웹사이트에 적합합니다.
OV — 조직 검증
도메인 소유권과 조직 신원을 검증. 발급에 1~3 영업일 소요. 비즈니스 사이트에 적합합니다.
EV — 확장 검증
가장 엄격한 검증 — 법인 확인, 전화 확인. 발급에 1~2주 소요. 은행과 대규모 전자상거래에서 사용. 참고: 2019년 이후 주요 브라우저는 녹색 조직명 바를 더 이상 표시하지 않습니다.
커버 범위별
- 단일 도메인 — 하나의 도메인 커버 (예:
www.example.com) - 와일드카드 — 모든 서브도메인 커버 (예:
*.example.com) - 멀티 도메인 (SAN) — 하나의 인증서로 여러 다른 도메인 커버
인증서 확인 방법
브라우저
주소 표시줄의 자물쇠 아이콘 클릭 → 인증서 세부 정보 확인: 발급 대상, 발급자, 만료일.
명령줄
# 인증서 정보 확인
openssl s_client -connect example.com:443 -servername example.com
# 만료일 확인
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
온라인 도구
- SSL Labs — 포괄적인 SSL 설정 테스트
- 301check.com — 리다이렉트 체인의 각 홉에 대한 TLS 정보 표시
- crt.sh — 인증서 투명성 로그 검색
일반적인 오류
인증서 만료 — NET::ERR_CERT_DATE_INVALID
인증서를 갱신하세요. Certbot의 자동 갱신을 사용하면 방지할 수 있습니다.
도메인 불일치 — NET::ERR_CERT_COMMON_NAME_INVALID
인증서가 접속 중인 도메인을 커버하지 않습니다. 올바른 도메인의 인증서를 취득하거나 와일드카드 인증서를 사용하세요.
불완전한 체인 — NET::ERR_CERT_AUTHORITY_INVALID
중간 인증서가 서버 설정에 포함되어 있지 않습니다.
# Nginx — cert.pem이 아닌 fullchain.pem 사용
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
혼합 콘텐츠
HTTPS 페이지가 HTTP 리소스(이미지, 스크립트, 스타일시트)를 로드하고 있습니다. 모든 리소스 URL을 HTTPS로 업데이트하거나 프로토콜 상대 URL(//example.com/image.jpg)을 사용하세요.
Let's Encrypt
Let's Encrypt는 비영리 단체 ISRG가 운영하는 무료, 자동, 개방형 인증 기관입니다. HTTPS를 모든 사람이 이용할 수 있게 만들었습니다.
Certbot (권장)
# Ubuntu/Debian에 설치
sudo apt install certbot python3-certbot-nginx
# 인증서 발급 및 Nginx 자동 설정
sudo certbot --nginx -d example.com -d www.example.com
# 자동 갱신 테스트
sudo certbot renew --dry-run
# 자동 갱신 cron 설정
0 0,12 * * * certbot renew --quiet
acme.sh (경량 대안)
curl https://get.acme.sh | sh
acme.sh --issue -d example.com -d www.example.com --nginx
모범 사례
# Nginx — 강력한 TLS 설정
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# HSTS 활성화
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSP 스테이플링
ssl_stapling on;
ssl_stapling_verify on;
- 인증서 만료 알림 설정 (30일 전)
- CAA DNS 레코드를 사용하여 도메인에 인증서를 발급할 수 있는 CA 제한
- 인증서 투명성 로그를 모니터링하여 무단 발급 감지
- SSL Labs로 설정 테스트