SSL 인증서 적용하기
사이트에 HTTPS를 켜기 위한 SSL/TLS 인증서 적용 방법입니다. 도메인 소유 검증 방식, 무료 자동 발급 인증서, 와일드카드 인증서, 갱신과 만료 모니터링, CAA 레코드까지 순서대로 정리했습니다.
작성 최종 수정
사이트 주소를 https:// 로 열리게 하려면 그 도메인 이름으로 발급받은 SSL/TLS 인증서를 웹 서버나 호스팅 플랫폼에 올려야 합니다. 인증서는 "이 이름의 사이트가 맞다"는 것을 인증기관이 서명해 준 파일이고, 브라우저는 이 서명을 확인한 뒤 연결을 암호화합니다. 요즘은 호스팅 플랫폼이 자동으로 발급하고 갱신해 주는 경우가 많아, 실제로 우리가 하는 일은 도메인이 그 플랫폼을 가리키게 하고 소유 검증만 통과시키는 것으로 끝나는 편입니다.
레토는 유료 SSL 인증서 판매를 준비 중이며 아직 판매하지 않습니다. 아래 내용은 무료 자동 인증서와 외부 인증기관에서 받은 인증서를 도메인에 적용하는 방법입니다.
인증서가 하는 일
인증서에는 이 인증서가 유효한 도메인 이름 목록(SAN), 유효 기간, 공개키, 발급한 인증기관의 서명이 들어 있습니다. 브라우저는 접속한 이름이 목록에 있는지, 기간이 지나지 않았는지, 서명을 따라 올라간 끝에 신뢰하는 루트 인증기관이 나오는지 세 가지를 봅니다. 셋 중 하나라도 어긋나면 경고 화면이 뜹니다.
서버에는 보통 세 가지를 넣습니다. 인증서 본문, 인증기관이 준 중간 인증서(체인), 그리고 발급 요청 때 만든 개인키입니다. 중간 인증서를 빠뜨리면 데스크톱 브라우저에서는 잘 열리는데 모바일이나 API 클라이언트에서만 실패하는 증상이 자주 나옵니다.
도메인 소유 검증 방식
인증기관은 인증서를 내주기 전에 신청자가 그 도메인을 실제로 통제하는지 확인합니다. 도메인 검증(DV) 인증서의 검증 방법은 크게 두 가지입니다.
| 방식 | 무엇을 하나 | 특징 |
|---|---|---|
| HTTP 파일 검증 | 사이트의 /.well-known/acme-challenge/ 경로에 지정된 파일을 올려 둡니다 | 웹 서버가 이미 80 포트로 열려 있어야 하고, 와일드카드에는 쓸 수 없습니다 |
| DNS 검증 | _acme-challenge 같은 호스트에 인증기관이 준 TXT 값을 넣습니다 | 서버가 아직 안 떠 있어도 되고, 와일드카드에도 씁니다 |
| DNS CNAME 위임 | _acme-challenge 를 검증 전용 도메인으로 CNAME 위임합니다 | 본 도메인의 DNS 권한을 넓게 열지 않고 자동 갱신을 붙일 때 씁니다 |
DNS 검증을 쓸 때는 TTL을 낮게 잡아 두는 편이 좋습니다. 값이 캐시에 오래 남으면 인증기관이 옛 값을 보고 검증에 실패합니다. DNS 전파가 끝난 뒤에 검증을 시작하세요. 레코드 입력 방법은 DNS 레코드 종류와 입력 방법에 있습니다.
무료 자동 인증서
대부분의 사이트는 인증서를 따로 구매하지 않아도 됩니다.
호스팅 플랫폼의 자동 발급을 먼저 확인합니다
Vercel, Netlify, GitHub Pages, Cloudflare, AWS 같은 플랫폼은 도메인을 연결하면 인증서를 자동으로 발급하고 갱신합니다. 도메인이 그 플랫폼을 가리키게만 하면 되고, 별도 파일 설치가 없습니다. 연결 방법은 외부 서비스에 도메인 연결하기에 정리했습니다.
직접 운영하는 서버라면 ACME 클라이언트를 씁니다
Let's Encrypt를 비롯한 ACME 지원 인증기관은 명령 한 줄로 발급과 갱신을 처리할 수 있습니다. certbot, acme.sh, lego 같은 클라이언트가 널리 쓰이고, 웹 서버(nginx, Apache, Caddy)에 붙는 플러그인도 있습니다.
# HTTP 파일 검증 (nginx 플러그인) certbot --nginx -d example.com -d www.example.com # DNS TXT 검증 (수동) certbot certonly --manual --preferred-challenges dns -d example.com발급 뒤 서버에 적용하고 http 를 https 로 넘깁니다
인증서와 체인, 개인키 경로를 웹 서버 설정에 넣고 다시 읽어들입니다. 그다음 80 포트로 들어온 요청을 301로 https에 넘기고, HSTS 헤더를 켜서 브라우저가 다음부터 https로 바로 오게 합니다. HSTS는 되돌리기 어려우므로 https가 안정적으로 동작하는 것을 확인한 뒤에 켜세요.
자동 갱신이 실제로 도는지 확인합니다
발급만 자동이고 갱신 작업이 등록되지 않은 경우가 흔합니다. 예행 연습으로 갱신이 성공하는지 미리 봅니다.
certbot renew --dry-run systemctl list-timers | grep certbot
와일드카드 인증서
*.example.com 형태의 와일드카드 인증서는 한 단계 아래의 모든 서브도메인을 한 장으로 덮습니다. 두 가지를 기억하면 됩니다.
- 와일드카드는 DNS 검증만 허용됩니다. HTTP 파일 검증으로는 받을 수 없습니다.
- 한 단계만 덮습니다.
*.example.com은api.example.com에는 유효하지만a.b.example.com이나 apex인example.com자체에는 유효하지 않습니다. apex도 쓰려면 인증서 이름 목록에 apex를 함께 넣습니다.
갱신할 때마다 TXT 값이 바뀌므로, DNS API로 자동화하지 않으면 두세 달마다 수동 작업이 생깁니다. 서브도메인 수가 고정적이라면 이름을 여러 개 넣은 일반 인증서가 운영 부담이 적습니다.
갱신과 만료 모니터링
ACME 인증서는 유효 기간이 짧고(90일 안팎) 자동 갱신을 전제로 합니다. 만료 사고는 대부분 인증서 자체가 아니라 자동화가 조용히 멈춰서 생깁니다.
- 갱신 작업(cron, systemd timer)이 실제로 도는지 주기적으로 확인합니다
- 갱신 뒤 웹 서버를 다시 읽어들이는 후처리 스크립트가 붙어 있는지 봅니다
- 만료 30일 전과 7일 전에 알림이 오도록 외부 모니터링을 걸어 둡니다
- 로드밸런서, CDN, 메일 서버 등 인증서를 쓰는 곳을 모두 목록으로 관리합니다
- 담당자 퇴사에 대비해 알림 수신처를 개인 메일이 아닌 공용 주소로 둡니다
만료일은 명령으로도 바로 확인할 수 있습니다.
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer
인증서가 살아 있어도 도메인이 만료되면 사이트와 메일이 함께 멈춥니다. 도메인 쪽 만료 관리는 만료 사고 예방을 함께 보세요.
CAA 레코드로 발급 기관을 제한합니다
CAA(Certification Authority Authorization) 레코드는 "이 도메인 이름으로 인증서를 발급할 수 있는 인증기관"을 DNS에 적어 두는 레코드입니다. 인증기관은 발급 전에 이 값을 확인해야 하므로, 목록에 없는 기관을 통한 사칭 발급을 막을 수 있습니다.
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issuewild "letsencrypt.org"
example.com. CAA 0 iodef "mailto:security@example.com"
issue 는 일반 인증서, issuewild 는 와일드카드 발급을 허용할 기관이고, iodef 는 위반 시도를 알려 줄 연락처입니다. 여러 기관을 쓴다면 각각을 별도 CAA 레코드로 나열합니다. 인증기관을 바꾸거나 새 CDN을 붙일 때 CAA를 잊으면 발급이 거부되므로, 발급 실패가 나면 CAA부터 확인하세요. 레토 DNS는 CAA 레코드를 지원하지 않으므로, CAA로 발급 기관을 제한해야 하는 도메인은 그 존을 CAA를 지원하는 외부 DNS 호스팅에 두고 그쪽 콘솔에서 넣습니다. 태그별 의미와 점검 순서는 CAA 레코드로 인증서 발급 제한하기에 있습니다.
- ACME 인증서 유효 기간
- 90일 안팎, 자동 갱신 전제
- 와일드카드 검증
- DNS TXT 방식만 가능
- 검증용 레코드 이름
- _acme-challenge
- 권장 알림 시점
- 만료 30일 전, 7일 전
서버 구성이나 인증서 적용 위치를 정하기 어렵다면 문의로 사용 중인 환경을 알려 주세요.
자주 묻는 질문
유료 SSL 인증서 판매는 준비 중이며 아직 판매하지 않습니다. 지금은 호스팅 플랫폼이 자동으로 발급해 주는 인증서나 Let's Encrypt 같은 무료 인증기관을 쓰시면 됩니다. 대부분의 회사 사이트에는 이 방식으로 충분합니다.
다르지 않습니다. 같은 TLS 규격과 같은 키 길이를 쓰므로 연결의 암호화 수준은 동일합니다. 차이는 검증 범위(도메인 검증인지 조직 검증인지), 보증 조건, 발급 기관의 지원 정책에 있습니다. 브라우저 주소창에 보이는 자물쇠 표시도 같습니다.
서브도메인이 계속 늘어나거나 미리 이름을 알 수 없을 때 유용합니다. 다만 와일드카드는 DNS TXT 검증만 허용되므로 DNS API로 자동화하지 않으면 갱신 때마다 수동 작업이 생깁니다. 서브도메인이 몇 개로 고정되어 있다면 이름을 여러 개 넣은 일반 인증서가 운영이 더 쉽습니다.
중간 인증서(체인)를 함께 설치하지 않았거나, 인증서에 접속한 이름이 들어 있지 않거나, 페이지 안에서 http 리소스를 불러오는 경우가 대부분입니다. openssl s_client로 체인이 완전한지 먼저 확인하고, 그다음 인증서의 SAN 목록에 실제 접속 이름이 있는지 보세요.
필수는 아니지만 넣어 두면 지정한 인증기관 외에는 그 도메인 이름으로 인증서를 발급할 수 없습니다. 사칭 발급을 막는 저비용 안전장치입니다. 다만 목록에 없는 기관으로 인증서를 새로 받으려 하면 발급이 거부되므로, 발급 기관을 바꿀 때는 CAA도 함께 수정해야 합니다.
관련 가이드
- 외부 서비스에 도메인 연결하기Vercel, Netlify, GitHub Pages, Cloudflare, AWS 같은 외부 서비스에 회사 도메인을 연결하는 방법입니다. A와 CNAME 중 무엇을 쓸지, apex와 www를 어떻게 나눌지, 값을 어디서 복사해 어떻게 확인하는지 정리했습니다.
- DNS 레코드 설정 (A, AAAA, CNAME, MX, TXT, SRV)A, AAAA, CNAME, MX, TXT, SRV 레코드가 각각 무엇을 하고 어떤 값을 넣어야 하는지 예시로 정리했습니다. 루트 도메인에 CNAME을 걸 수 없는 이유와 TTL 기준도 함께 다룹니다.
- 네임서버 변경하기레토 대시보드에서 네임서버를 바꾸는 방법과, 바꾸기 전에 새 네임서버에 레코드를 먼저 옮겨 두어야 하는 이유. 반영 시간, 검증 방법, 흔한 실패 원인까지 정리했습니다.