Let’s Encrypt 무료 인증서 발급받기

By | 2025년 3월 8일
Table of Contents

Let’s Encrypt 무료 인증서 발급받기

Let’s Encrypt 를 이용해 무료로 인증서(https) 를 발급받는 방법을 설명합니다.

아래 내용은 nginx 를 이용하는 방법입니다.

Wildcard 인증서 발급받기는 세가지를 주의해야 합니다.

  1. 도메인 정보가 반영된 것을 기다려야 합니다.
  2. 인증서 갱신은 단순히 크론탭 등록만으로 작동하지 않습니다.
  3. DNS 호출 API 를 제공하지 않는 업체에 도메인을 맡기고 있다면 자동갱신이 되지 않습니다. (매 90일 마다 수동갱신)

certbot 설치

sudo apt install -y certbot python3-certbot-nginx

Nginx 설정 (80포트)

sudo vi /etc/nginx/sites-available/example.com
--------------
server {
    listen 80;         # IPv4 연결을 수신
    listen [::]:80;    # IPv6 연결을 수신

    root /var/www/html;

    server_name example.com www.example.com;
}
# 테스트
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

## 재시작
sudo service nginx restart

인증서 발급받기 (https)

# sudo certbot --nginx -d example.com -d www.example.com
sudo certbot --nginx -d example.com

아래와 같은 메시지가 나오면 성공입니다.

Congratulations! You have successfully enabled https://example.com and https://www.example.com 

-------------------------------------------------------------------------------------
IMPORTANT NOTES:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem 
Your key file has been saved at:
/etc/letsencrypt/live/example.com//privkey.pem
Your cert will expire on 2017-12-12.
sudo vi /etc/nginx/sites-available/example.com
server {
    listen 80;         # IPv4 연결을 수신
    listen [::]:80;    # IPv6 연결을 수신

    root /var/www/html;

    server_name  example.com www.example.com;

    listen 443 ssl; # managed by Certbot

    # RSA certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    # http 통신을 https 로 리다이렉트
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

인증서 자동갱신

새로 발급받은 인증서는 90일의 유효기간만 가집니다.

인증서가 만료되지 않으려면 인증서를 갱신해주어야 합니다.

# 루트로 이동
sudo su -

crontab -e

일반적으로 첫번째 명령이 작동합니다.
하지만 오류가 발생시 --nginx 옵션을 추가해서 nginx 임을 명시해 줍니다.

30 4 * * 0 /usr/bin/certbot renew --renew-hook="systemctl reload nginx"
# 수동 갱신
# 30 4 * * 0 /usr/bin/certbot --nginx renew --renew-hook="systemctl reload nginx"

Wildcard 인증서 발급받기

Let’s Encrypt 에서는 *.example.com 과 같이 와일드카드 인증서도 발급해 줍니다.

인증서 상태 확인

sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: test1.example.com
    Domains: test1.example.com
    Expiry Date: 2025-06-02 01:38:23+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/test1.example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/test1.example.com/privkey.pem
  Certificate Name: example.com
    Domains: *.example.com example.com
    Expiry Date: 2022-10-27 05:30:32+00:00 (INVALID: EXPIRED)
    Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

기존 서브도메인 인증서 삭제 후 와일드 인증서 발급

# 기존 서브도메인 인증서 삭제
sudo certbot delete --cert-name test1.example.com

# Then, renew the wildcard certificate
sudo certbot certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory --domain "*.example.com" --domain "example.com"

와일드 인증서를 발급받기 위해서는 도메인의 소유자임을 인증해야 합니다.

DNS 서버에 _acme-challenge.example.com 같은 서브도메인을 생성하라는 문구가 나오면,
_acme-challenge 서브도메인을 TXT 타입으로 생성하고 아래 문자열을 입력해 줍니다.
도메인 정보 변경이 반영되기를 기다려(1~10 분, DNS 서버설정에서 결정됨) 엔터를 입력해 주면 됩니다.

https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.example.com

반드시 도메인정보가 생성된 것을 확인한 후 엔터를 입력하세요.

Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

3WLmAnTEXo8v7BXXXXXXXXXXXXXXXXXX

Before continuing, verify the record is deployed.

아래 사진은 AWS Route53 을 이용해 서브도메인을 생성하는 방법입니다.

Wildcard 인증서 자동갱신 (AWS Route53)

Wildcard 인증서 자동갱신은 위 크론탭에 등록한 명령으로 자동갱신이 이루어지지 않습니다.

매 갱신시마다 도메인 소유권 확인을 위한 단계를 거쳐야 합니다.

아래 설명은 AWS Route53 을 기준으로 설명합니다.

개요

  • AWS IAM 정책생성
  • AWS IAM 계정생성
  • 리눅스 인증서 갱신용 새 유저 생성
  • 리눅스 서비스 등록

AWS IAM 정책생성

JSON 을 선택하고 아래 내용을 입력해 줍니다.

{  
    "Version": "2012-10-17",  
    "Id": "certbot-dns-route53 sample policy",  
    "Statement": [  
        {  
            "Effect": "Allow",  
            "Action": [  
                "route53:ListHostedZones",  
                "route53:GetChange"  
            ],  
            "Resource": [  
                "*"  
            ]  
        },  
        {  
            "Effect" : "Allow",  
            "Action" : [  
                "route53:ChangeResourceRecordSets"  
            ],  
            "Resource" : [  
                "arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"  
            ]  
        }  
    ]  
}  

화면 맨 아래 다음 을 클릭합니다.
정책 이름을 입력하고 정책생성 버튼을 클릭합니다.

AWS IAM 계정생성

왼쪽 메뉴에서 사용자를 클릭하고 사용자 생성 버튼을 클릭합니다.
사용자 이름을 입력하고 다음을 클릭합니다.
정책 직접 설정을 선택하고 위에서 생성한 정책을 검색해서 선택하고 다음을 클릭합니다.
사용자 생성 버튼을 클릭합니다.

왼쪽 메뉴에서 사용자를 클릭하고 방금 생성한 사용자를 검색해서 조회합니다.
액세스 키 만들기 를 클릭합니다.
Command Line interface(CLI) 를 선택하고 다음을 클릭합니다.
엑세스 키비밀 엑세스키를 메모장에 복사 붙여넣기합니다.

리눅스 인증서 갱신용 새 유저 생성

sudo apt-get update
sudo apt-get install python3-pip
pip3 install certbot-dns-route53

renewhttps 유저를 생성하고 sudo 권한을 부여합니다.

sudo adduser renewhttps
sudo usermod -aG sudo renewhttps

sudo vi /etc/sudoers
# 맨 아래에 다음 라인을 추가합니다.
renewhttps      ALL=NOPASSWD: ALL

renewhttps 와 ALL 사이는 반드시 탭문자로 입력해야 합니다.

새로 생성한 계정으로 로그인합니다.

sudo su - renewhttps

pip3 install awscli

aws configure
AWS Access Key ID [None]: AKIA3V2XXXXXXXXXXXX
AWS Secret Access Key [None]: VD2v1vcPmGiYyRWXXXXXXXXXXX
Default region name [None]: ap-northeast-2
Default output format [None]: json
sudo certbot certonly --dns-route53 \
  -d example.com \
  -d *.example.com \
  --preferred-challenges dns-01

......
What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
......

지금은 갱신이 필요하지 않으므로 1 번을 입력하고 엔터를 입력합니다.

리눅스 서비스 등록

위 명령을 실행하는 것으로 인증서 갱신 서비스가 등록됩니다.

sudo systemctl status certbot.timer

하지만 서비스가 실행중이 아니면 아래 명령으로 서비스를 등록해 줍니다.

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

본래의 계정으로 돌아와 기존에 등록되어 있던 크론탭 명령을 제거해 줍니다.

exit
crontab -e

인증서 갱신 후 nginx 재시작이 필요합니다.
아래 명령으로 certbot 이 자동으로 nginx 를 재시작합니다.

sudo mkdir -p /etc/letsencrypt/renewal-hooks/post/

sudo vi /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh
#!/bin/bash
systemctl reload nginx

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh

Wildcard 인증서 자동갱신 (AWS Route53 이외)

DNS 호출 API 를 제공하지 않는 호스팅업체에 도메인을 관리하고 있다면 자동갱신은 불가능합니다.

아래에는 DNS 호출 API 를 제공하는 업체와 플러그인목록입니다.

도메인 관리업체 플러그인
AWS certbot-dns-route53
GPC certbot-dns-google
Digitalocean certbot-dns-digitalocean
Cloudflare certbot-dns-cloudflare

답글 남기기