최근 수정 시각 : 2024-10-30 15:32:32

Let's Encrypt


1. 개요2. 사용방법3. 주의사항
3.1. 인증서 발급 방식3.2. 간단한 방법3.3. Tomcat에서 인증받는 방법3.4. 이전 방법
4. 관련 문서


파일:letsencrypt-logo-horizontal.svg
공식 홈페이지

1. 개요

Let's Encrypt는 사용자에게 무료 TLS 인증서를 발급해주는 비영리기관이다. 몇 가지 TLS 인증서 종류 중에서 완전 자동화가 가능한 DV (Domain Validated, 도메인 확인) 인증서를 무료로 발급한다. 모질라 재단, 페이스북, 구글 등 많은 업체가 스폰서로 등록되어 있다. 발급에는 ACME라는 프로토콜을 사용하는데, 2019년 3월 11일자로 IETF표준(RFC 8555)으로 등재되었다. 블로그

루트 도메인 (네이키드 도메인), 특정 서브 도메인뿐만 아니라, 하나의 인증서로 모든 서브 도메인에 사용 가능한 *.example.com 형태의 와일드카드 서브 도메인 인증서도 무료로 발급하므로 그 활용이 폭넓다.

발급된 인증서는 유효기간이 90일이며 만료 30일 전부터 갱신할 수 있다. 갱신 가능 횟수는 무제한이다.

이런 서비스가 필요한 이유는 인증서 가격이 3만원에 이르고 와일드카드의 경우 15만원에 이르러 1년동안 제공되지만 결제는 예산관리하여간 엔지니어에겐 귀찮고 번거로운 일이다. 최소한의 이런 불편한 부분을 자동화해준다.

2. 사용방법

여유가 된다면 https://letsencrypt.org/getting-started/(영문) 읽어본 뒤에 적용하면 된다. 상당한 커스텀 세팅을 위해서는 문서의 클라이언트 옵션을 보는 편이 좋다. 대부분의 런타임 플렛폼과 CLI LIB 타입이 나와있으므로 새로 구현 해야 하는 경우는 거의 없다.

클라이언트는 Python 기반이다.

3. 주의사항

  • 80번 포트를 확인하자
    인증서를 발급할 때, 반드시 80번 포트가 열려야 한다. 만약 열지 않고 진행한다면 발급해주지 않으며 방화벽이나 포트 포워딩을 통해서 열려 있나 확인해보자.[1] 단, DNS 방식의 경우에 한해서는 80번 포트를 열지 않아도 된다.
  • 요청 제한
    인증서 발급 서비스의 남용을 막기 위해 요청 수 제한이 걸려있다. 인증서 발급을 취소해도 제한은 초기화되지 않는다.
    • 도메인당 인증서 발급 50개[2] / 일주일
    • 300개의 신규 발급 요청 / 3시간
    • 인증서당 도메인 최대 100개
    • 중복되는 인증서의 경우(발급 대상이 같은 경우) 5개 / 일주일
    • 도메인 검증 실패 횟수의 경우 계정당, 도메인별 5회 / 1시간

    특히 도메인 검증 실패 횟수의 경우 도메인별 한시간에 5회라는 빡빡한 횟수 제한이 걸려 있는 만큼 처음 설정하는 경우 인증 제한이 널널한 Staging Environment에서 먼저 시도해 본 뒤 성공하면 실제 발급 환경에서 시도해 보는 것이 좋다.
    Staging Environment의 요청 수 제한은 다음과 같다.
    • 도메인당 3만개 / 일주일
    • 1500개의 신규 발급 요청 / 3시간
    • 중복되는 인증서의 경우(발급 대상이 같은 경우) 3만개 / 일주일
    • 도메인 검증 실패 횟수의 경우 계정당, 도메인별 60회 / 1시간[3]

3.1. 인증서 발급 방식

Let's Encrypt가 인증서를 발급하는 방식에는 3가지가 있으며, 주로 Let's Encrypt가 추천하는 인증서 발급 프로그램인 Certbot을 사용한다.
  • Standalone
    standalone 명령어를 사용하면 Certbot에 내장된 세팅을 사용해서 도메인만으로 인증서가 발급 되고, 갱신 절차도 자동으로 처리된다. *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.
  • Webroot
    webroot 명령어를 사용하면 자신의 웹 서버에서 작동중인 웹 사이트를 이용해서 인증서를 발급하고, 갱신 절차도 자동으로 처리된다. *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.
  • DNS
    도메인이 연결된 DNS에 TXT 레코드를 생성해서 인증서를 발급하는 방식으로, 인증서 발급 과정에 웹 서버가 필요 없고 *.example.com 형태의 와일드카드 서브 도메인 인증서를 발급할 수 있다.
    • 매번 인증서를 갱신할 때마다 DNS에 TXT 레코드를 새로 생성해야 하므로, 외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우에는 갱신 과정을 자동으로 처리할 수 있다. CloudFlare API를 통한 예시
    • API가 여의치 않은 경우(웹 패널 방식)에는 Chrome 확장 프로그램으로 만들어 쓰거나 직접 웹 폼을 전송하여 구현이 가능하다. #, # 단독 노드 플랫폼에서 작동을 원하는 경우 쓴다. auto 모드에서는 dns-01 스펙에 문제가 있으므로 쓰지 말아야 한다.

3.2. 간단한 방법

1. Certbot 홈페이지에 들어가서 자신의 서버 사양을 선택하면 설명 화면이 나온다.
2. 문서를 읽으면서 터미널에 명령어를 입력한다.
3. 몇몇 정보를 입력하면 알아서 설정해주고, 3개월마다 갱신도 자동으로 해준다.

또는 사전에 빌트인된 웹 호스팅을 사용하는 방법이 있다.

3.3. Tomcat에서 인증받는 방법

위의 과정들과는 다르게, Tomcat의 경우 수동적으로 맞출 수밖에 없다. Tomcat 파일을 tar.gz 배포형 기준으로 작성했으며, Tomcat 서버 폴더를 /etc/tomcat로 한 상태로 가정한다.
  1. tomcat 서버를 켠다. 이때, 외부에서 80번 포트로 자신의 Tomcat 서버가 접속되는지 확인한다.
  2. Certbot 홈페이지로 들어가서 자신의 서버 사양을 선택하면 설명 화면이 나온다.
  3. certbot certonly --webroot를 입력한다.
  4. 자신의 도메인과 Webroot폴더인 /etc/tomcat/webapps/ROOT를 입력해서 인증서를 받는다.[4]
  5. conf폴더에 있는 server.xml에서 주석 처리된 Http11NioProtocol를 찾아 주석을 제거한다.[5]
  6. <Certificate /> 내부에는 다음과 같이 고쳐야 한다. 단, type="RSA"는 그대로 둔다.
    {{{ certificateKeyFile="/etc/letsencrypt/live/[자신의 도메인]/privkey.pem"
    certificateFile="/etc/letsencrypt/live/[자신의 도메인]/cert.pem"
    certificateChainFile="/etc/letsencrypt/live/[자신의 도메인]/fullchain.pem" }}}
  7. Tomcat 서버를 재시작한다.
  8. Tomcat 서버의 manager 페이지의 시스템 진단서의 인증서들로 들어가면 인증서 정보가 나온다. 이때, 인증서 정보가 나온다면 적용이 된 상태다.

3.4. 이전 방법

ubuntu에서 테스트된 내용이다.
  1. git clone https://github.com/certbot/certbot을 입력하여 클라이언트를 받는다.
  2. 다운로드한 폴더에 들어간다.
  3. (apache나 nginx의 가상 호스트를 사용할 경우) 각각 ./certbot-auto --apache -d (도메인; -d 도메인 이름을 추가로 입력할 수 있다) ./certbot-auto --nginx -d (도메인)
    (standalone) ./certbot-auto certonly --standalone --email (이메일) -d (도메인)
  4. (standalone으로 발급받았을 시) apache나 nginx 등에 연결한다. 인증서의 기본 경로는 /etc/letsencrypt/live/(도메인 이름)이다.

4. 관련 문서


[1] 포트 포워딩으로 8080번 포트를 80번으로 연결할 수 있다. 이는 다른 포트도 마찬가지. [2] 인증서 도메인이 각기 달라야 한다. 같으면 아래 중복되는 인증서 제한 횟수 조건이 먼저 걸린다. [3] 즉 1분에 한번씩 인증에 실패해도 문제 없는 수준이다. [4] webapps/ROOT 폴더. [5] html, jsp, xml과 같은 파일들의 주석은 <!-- -->로 이루어져 있다.