[태그:] Let’sencrypt

  • [Let’s Encrypt] 와일드카드 인증서 발급 & Cloudflare 자동화 방법

    [Let’s Encrypt] 와일드카드 인증서 발급 & Cloudflare 자동화 방법

    1. 개요

    Let’s Encrypt 와일드카드 인증서(*.domain.com)는 보안상 DNS-01 챌린지 방식만 지원합니다. 기존의 수동 방식(Manual)은 갱신 때마다 DNS TXT 레코드를 직접 수정해야 하는 번거로움이 있어, Cloudflare API를 이용한 완전 자동화 설정을 권장합니다.

    2. 주요 시행착오와 해결 방법

    • 명령어 오류: 블로그 등에서 명령어를 복사할 때 하이픈(-)이 긴 대시 (-)로, 따옴표(“)가 둥근 따옴표로 바뀌어 인식되지 않는 문제가 발생할 수 있습니다. 반드시 표준 ASCII 문자를 사용해야 합니다.
    • 수동 방식의 한계: _acme-challengs 레코드를 중복 등록하거나, DNS 전파 시간을 기다리지 않고 엔터를 누를 경우 NXDOMAIN 또는 Incorrect TXT record 에러가 발생합니다.
    • 알고리즘의 충돌: 기존 인증서가 ECDSA 방식일 때 새 명령어가 RSA를 시도하면 충돌이 발생합니다. –key-type ecdsa 옵션을 명시하여 해결할 수 있습니다.

    3. Cloudflare DNS 플러그인 자동화 단계

    3.1 패키지 업데이트 및 Certbot 설치

    Let’s encrypt는 certbot를 통해 인증서를 발급해야 합니다. 아직 관련 패키지가 설치되어 있지 않았다면, 패키지 설치를 진행합니다.

    // 패키지 업데이트
    apt-get install update
    // 패키지 설치
    apt-get install certbot -y
    
    3.2 플러그인 설치
    apt-get install python3-certbot-dns-cloudflare
    
    3.3 API 토큰 설정

    Cloudflare 대시보드에서 Zone:DNS:Edit 권한을 가진 토큰을 생성한 뒤 서버에 저장합니다.

    • 파일 경로: 예) ~/.secrets/certbot/cloudflare.ini
    • 파일 내용: 예:) dns_cloudflare_api_token = YOUR_API_TOKEN
    • 보안 설정: chmod 600 ~/.secrets/certbot/cloudflare.ini
    3.4 인증서 발급 및 자동 갱신 설정
    certbot certonly \
      --dns-cloudflare \
      --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
      --cert-name mydomain.com \
      --key-type ecdsa \
      -d "mydomain.com" -d "*.mydomain.com" \
      --preferred-challenges dns \
      --non-interactive \
      --agree-tos \
      -m  [email protected]
    
    3.5 기존 수동/Standalone 인증서 전환 팁

    기존에 manual이나 standalone 방식으로 발급받은 인증서가 있다면 certbot renew 시 에러가 발생합니다. 이때는 위 명령어를 –force-renewal 옵션과 함께 실행하여 인증서의 갱신 메커니즘 자체를 dns-cloudflare로 교체해 주어야 합니다.

    3.6 최종 확인

    설정이 완료된 후 아래 명령어를 실행하여 모든 도메인이 성공적으로 업데이트되는지 확인합니다.

    certbot renew --dry-run
    

    결과: “Congratulations, all simulated renewals succeeded:” 메시지가 나오면 정상적으로 인증서가 갱신되었습니다.

  • Let’s encrypt 인증서 발급할 때 유의사항

    Let’s encrypt는 Apache2나 Nginx를 운영할 때 SSL 인증서를 무료로 발급해 주는 툴이다. 구글, 모질라 재단 등에서 후원하고 있는 프로젝트이기도 하다.

    Let’s encrypt는 리눅스 터미널에서 명령어를 사용해야 하는데, 인증서 발급 시 유의사항이 있다.

    Cleaning up challenges
    Problem binding to port 80: Could not bind to IPv4 or IPv6.

    80포트가 이미 사용 중이라서 certbot 명령어를 사용해 인증서를 발급 받을 수 없다고 출력이 되었다.

    이 경우 아파치나 엔진엑스가 실행 중이라면 위와 같은 문구가 출력될 수가 있는 것이다. 따라서 아파치나 엔진엑스를 죽여주면 된다.

    예: service apache2 stop (엔진 엑스를 사용중이라면 service nginx start)

    서버 엔진이 죽었다면, 다시 certbot 명령을 사용해서 인증서를 발급받으면 된다. 만약 인증서를 발급받았다면, 다시 서버엔진을 실행해 주어야 한다.

    예: service apche2 start (엔진 엑스를 사용중이라면 service nginx start)