Let’s Encrypt 무료 인증서 발급받기
Let’s Encrypt 를 이용해 무료로 인증서(https) 를 발급받는 방법을 설명합니다.
아래 내용은 nginx 를 이용하는 방법입니다.
Wildcard 인증서 발급받기는 세가지를 주의해야 합니다.
- 도메인 정보가 반영된 것을 기다려야 합니다.
- 인증서 갱신은 단순히 크론탭 등록만으로 작동하지 않습니다.
- 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 |