OneWebDesk

SSL 인증서 발급 방법: Let's Encrypt 무료부터 유료까지

무료(Let's Encrypt·certbot)와 유료 인증서의 차이, 발급 절차(CSR·검증)와 자동 갱신 설정.

SSL(정확히는 TLS) 인증서는 이제 선택이 아니라 기본입니다. HTTPS가 없으면 크롬이 "주의 요함" 경고를 띄우고, 구글 검색 순위에서도 불리하며, HTTP/2·HTTP/3 같은 최신 프로토콜도 쓸 수 없습니다. 다행히 대부분의 사이트는 무료로, 10분 안에인증서를 발급받을 수 있습니다. Let's Encrypt와 certbot 조합이면 명령어 한 줄로 발급부터 웹서버 설정, 자동 갱신까지 끝납니다.

이 글은 DV/OV/EV 인증서의 차이, Let's Encrypt 발급 실전 명령어, 발급이 실패하는 흔한 원인 (CAA 레코드, 검증 방식 선택)까지 처음부터 끝까지 다룹니다. 발급 후에는 SSL 인증서 점검로 체인·만료일이 제대로 잡혔는지 꼭 확인하세요.

DV vs OV vs EV — 대부분은 DV면 충분하다

인증서는 CA(인증기관)가 "무엇을 검증했는가"에 따라 세 등급으로 나뉩니다. 기술적인 암호화 강도는 세 등급 모두 완전히 동일합니다. 차이는 발급 절차와 인증서 안에 기재되는 조직 정보뿐입니다.

  • DV(Domain Validation)— 도메인 소유권만 확인. 자동 발급, 몇 분이면 완료. Let's Encrypt가 발급하는 것이 바로 DV입니다. 블로그·쇼핑몰·API 서버·사내 서비스 등 거의 모든 용도에 충분합니다.
  • OV(Organization Validation) — 사업자등록 등 법인 실재성까지 확인. 인증서 상세정보에 회사명이 기재됩니다. 수동 심사라 1~3일 걸리고 유료입니다.
  • EV(Extended Validation) — 가장 엄격한 법인 심사. 과거에는 브라우저 주소창에 회사명이 초록색으로 표시됐지만, 현재 크롬·파이어폭스는 이 표시를 없앴습니다. 시각적 이점이 사라져 채택이 크게 줄었습니다.

유료(OV/EV)가 의미 있는 경우는 따로 있습니다: 금융·보험처럼 규제/감사 요건에 "조직 검증 인증서"가 명시된 경우, 계약상 CA의 배상 보증(warranty)이 필요한 경우, 자동 갱신을 돌릴 수 없는 폐쇄망 장비에 1년짜리 인증서를 수동 설치해야 하는 경우 정도입니다. 그 외라면 무료 DV로 시작하는 것이 정답입니다.

발급 절차의 원리 — 키 페어, CSR, 도메인 검증

certbot이 자동으로 처리해 주지만, 내부에서 무슨 일이 일어나는지 알아두면 문제가 생겼을 때 바로 원인을 짚을 수 있습니다. 발급은 항상 세 단계입니다.

  1. 키 페어 생성 — 서버에 개인키(private key)와 공개키 쌍을 만듭니다. 개인키는 절대 서버 밖으로 나가면 안 됩니다.
  2. CSR(인증서 서명 요청) 제출 — 공개키 + 도메인 이름(CN/SAN) + 조직 정보를 담은 요청서를 CA에 보냅니다. 유료 인증서를 신청할 때 만든 CSR에 도메인 오타나 누락이 없는지는 CSR 디코더에 붙여넣어 제출 전에 미리 확인하세요. SAN에 www 붙은 도메인을 빠뜨리는 실수가 정말 흔합니다.
  3. 도메인 검증(Domain Validation)— CA가 "이 도메인이 정말 당신 것인지"를 확인합니다. 방식은 아래 표의 두 가지가 표준입니다.
검증 방식동작 원리언제 쓰나
HTTP-01CA가 http://도메인/.well-known/acme-challenge/토큰을 접속해 서버가 올려 둔 토큰 파일을 확인. 80 포트가 외부에 열려 있어야 함.일반 단일 도메인·www 포함 발급. 가장 간단하고 certbot 기본값.
DNS-01_acme-challenge.도메인에 지정된 값의 TXT 레코드를 올려 DNS로 소유권 증명. 웹서버가 없어도 되고 80 포트 개방 불필요.와일드카드(*.example.com)는 DNS-01만 가능. 내부망 서버, 80 포트를 못 여는 환경에도 사용.

한 가지 함정이 더 있습니다. 도메인에 CAA 레코드가 설정되어 있으면 거기에 명시된 CA만 인증서를 발급할 수 있습니다. 예를 들어 CAA 0 issue "digicert.com"만 있는 도메인은 Let's Encrypt 발급이 CAA record prevents issuance 오류로 거부됩니다. 발급이 이유 없이 실패한다면 CAA 레코드 확인로 CAA 레코드를 먼저 확인하고, 필요하면 issue "letsencrypt.org"를 추가하세요. CAA 레코드가 아예 없으면 모든 CA가 발급 가능하므로 문제되지 않습니다.

실전: nginx 서버를 0에서 HTTPS까지 (Let's Encrypt + certbot)

Ubuntu + nginx에서 example.com을 HTTPS로 만드는 전체 과정입니다. 전제 조건은 두 가지: 도메인의 A 레코드가 이 서버 IP를 가리키고 있고, 방화벽에서 80·443 포트가 열려 있어야 합니다.

  1. certbot 설치
    sudo apt update && sudo apt install certbot python3-certbot-nginx
  2. 발급 + nginx 자동 설정
    sudo certbot --nginx -d example.com -d www.example.com
    이메일 입력과 약관 동의 후, certbot이 HTTP-01 검증을 통과시키고 nginx 설정 파일에 ssl_certificate·ssl_certificate_key경로를 자동 삽입합니다. HTTP → HTTPS 리다이렉트도 물어보면 "2: Redirect"를 선택하세요.
  3. 발급 확인 — 인증서는 /etc/letsencrypt/live/example.com/에 저장됩니다(fullchain.pem = 인증서+중간체인, privkey.pem = 개인키). 브라우저로 접속해 자물쇠가 뜨는지 보고, SSL 인증서 점검로 체인이 "리프 → 중간 → 루트"로 완성됐는지, 만료일이 약 90일 뒤인지 확인합니다.
  4. 자동 갱신 검증 — Let's Encrypt 인증서는 유효기간이 90일이고 certbot은 설치 시 systemd 타이머(또는 cron)를 등록해 만료 30일 전에 자동 갱신합니다. 실제로 갱신이 돌아갈지 반드시 리허설하세요:
    sudo certbot renew --dry-run
    "Congratulations, all simulated renewals succeeded"가 나오면 끝입니다. 이후 손댈 일이 없습니다.

와일드카드가 필요하면 DNS-01로 발급합니다: sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com. 다만 수동 방식은 갱신 때마다 TXT 레코드를 다시 올려야 하므로, 실서비스에서는 DNS 업체용 certbot 플러그인(route53, cloudflare 등)으로 자동화하는 것이 필수입니다.

발급 후 점검 체크리스트

  • SSL 인증서 점검중간 인증서 체인 완성 여부 확인 — 리프만 설치하면 모바일·API 클라이언트에서만 실패하는 골치 아픈 오류가 납니다. nginx에는 항상 fullchain.pem을 지정하세요.
  • www와 루트 도메인 둘 다 SAN에 포함됐는지 확인 — 한쪽만 발급하면 다른 쪽 접속 시 ERR_CERT_COMMON_NAME_INVALID가 뜹니다.
  • HTTP → HTTPS 301 리다이렉트가 걸려 있는지, 페이지 안에 http:// 리소스(혼합 콘텐츠)가 없는지 확인.
  • certbot renew --dry-run 성공 + systemctl list-timers에서 certbot.timer가 살아 있는지 확인. 만료 사고의 90%는 갱신 자동화 누락입니다.

자주 묻는 질문

무료 Let's Encrypt 인증서는 유료보다 보안이 약한가요?
아니요. 암호화 강도는 무료 DV와 유료 OV/EV가 완전히 동일합니다. 차이는 CA가 조직 실재성을 검증해 인증서에 회사명을 기재하는지 여부와 배상 보증뿐입니다. 구글, 위키피디아급 대형 사이트도 DV 인증서를 사용합니다.
Let's Encrypt 인증서는 왜 90일밖에 안 되나요?
짧은 유효기간은 키 유출 시 피해 기간을 줄이고 자동화를 강제하기 위한 의도적 설계입니다. certbot이 만료 30일 전에 자동 갱신하므로 실제 운영에서는 만료를 신경 쓸 일이 없습니다. certbot renew --dry-run으로 갱신이 정상 동작하는지만 확인해 두세요.
와일드카드 인증서(*.example.com)는 어떻게 발급하나요?
와일드카드는 DNS-01 검증만 가능합니다. _acme-challenge 서브도메인에 TXT 레코드를 올려 소유권을 증명해야 하며, certbot의 DNS 플러그인(cloudflare, route53 등)을 쓰면 갱신까지 자동화됩니다. 참고로 와일드카드는 한 단계만 커버해서 a.b.example.com에는 적용되지 않습니다.
certbot 발급이 CAA 오류로 실패합니다. 어떻게 하나요?
도메인에 CAA 레코드가 있고 letsencrypt.org가 허용 목록에 없는 경우입니다. CAA 조회 도구로 현재 레코드를 확인한 뒤, DNS에 CAA 0 issue "letsencrypt.org" 레코드를 추가하면 됩니다. CAA 레코드가 아예 없다면 모든 CA가 발급 가능하므로 다른 원인(80 포트 차단, DNS 미전파)을 확인하세요.
인증서를 설치했는데 일부 기기에서만 오류가 납니다.
중간 인증서(체인) 누락이 대표적 원인입니다. 데스크톱 브라우저는 캐시된 중간 인증서로 통과하지만 모바일이나 API 클라이언트는 실패합니다. 서버에 리프 인증서만 올리지 말고 fullchain(리프+중간)을 설치한 뒤 SSL 검사 도구로 체인 완성 여부를 확인하세요.

이 가이드와 함께 쓰면 좋은 도구

관련 가이드