SSL 인증서 완전 가이드

목차

SSL/TLS란

SSL(Secure Sockets Layer)과 그 후속인 TLS(Transport Layer Security)는 인터넷 통신을 보호하는 암호화 프로토콜입니다. HTTPS 사이트에 접속하면 TLS가 브라우저와 서버 간 연결을 암호화하여 도청과 변조를 방지합니다.

작동 원리

TLS 핸드셰이크는 다음 단계로 안전한 연결을 수립합니다:

  1. Client Hello — 브라우저가 지원하는 TLS 버전과 암호 스위트 전송
  2. Server Hello — 서버가 버전/암호를 선택하고 인증서 전송
  3. 인증서 검증 — 브라우저가 인증서 검증 (발급자, 만료일, 도메인 일치)
  4. 키 교환 — 양측이 공유 세션 키 도출
  5. 암호화 통신 — 이후 모든 트래픽이 암호화됨

인증서 체인

루트 CA
  └─ 중간 CA
      └─ 엔드 엔티티 인증서 (사용자 사이트)

브라우저는 내장된 루트 CA 목록을 신뢰합니다. 인증서 체인을 따라 신뢰할 수 있는 루트에 도달하여 인증서를 검증합니다.

인증서 유형

검증 수준별

DV — 도메인 검증

도메인 소유권만 검증. 몇 분 내 발급. Let's Encrypt로 무료 취득 가능. 대부분의 웹사이트에 적합합니다.

OV — 조직 검증

도메인 소유권과 조직 신원을 검증. 발급에 1~3 영업일 소요. 비즈니스 사이트에 적합합니다.

EV — 확장 검증

가장 엄격한 검증 — 법인 확인, 전화 확인. 발급에 1~2주 소요. 은행과 대규모 전자상거래에서 사용. 참고: 2019년 이후 주요 브라우저는 녹색 조직명 바를 더 이상 표시하지 않습니다.

커버 범위별

인증서 확인 방법

브라우저

주소 표시줄의 자물쇠 아이콘 클릭 → 인증서 세부 정보 확인: 발급 대상, 발급자, 만료일.

명령줄

# 인증서 정보 확인
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

온라인 도구

일반적인 오류

인증서 만료 — 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;