개요
인증서 갱신을 위해 사용되는 certbot을 이용하여, SSL 인증서를 생성 및 재발급 한다.
용어
Let's Encrypt
발급 인증서 파일
let's encrypt 인증서 발급시, 생성되는 인증서 종류는 4가지이며, nginx 설정시 아래와 같은 파일이 필요하다.
File | 설명 |
/etc/letsencrypt/live/{domain}/cert.pem | public key |
/etc/letsencrypt/live/{domain}/chain.pem | Let's encrypt 인증서 |
/etc/letsencrypt/live/{domain}/fullchain.pem | cer.pem + chain.pem |
/etc/letsencrypt/live/{domain}/privatekey.pem | private key |
SSL 인증서 타입
먼저, 인증 종류가 있다. 사용규모에 따라 인증서를 확장하는 개념이다.
필자는 wildcard 인증서를 사용하여, 자동 재발급하는 방법을 소개하려 한다.
구분 | 내용 | 사용 형태 |
도메인 인증서 | 해당 도메인의 소유권을 증명하는 기본적 인증서 | 블로그 |
멀티 도메인 인증서 | 여러개 도메인을 한개의 인증서로 보호 | |
기업 인증서 | 기업용 엄격한 검증과정을 거친 인증서 | 상거래 플랫폼 |
확장된 검증 인증서 | 브라우저 주소 표시줄에 녹색으로 표시되는 가장 엄격한 인증서 | 공공기관, 금융기관 |
wildcard 인증서 | 하위 서브 도메인 호스트에 대하여 무제한 적용 가능한 SSL 인증서 타입 | *.example |
code signing 인증서 | 소프트웨어 코드에 대하여 서명. |
인증 방식
let's encrypt에서 인증서를 생성하는 방식들이다.
다른 기술 문서들에서 자주 보이는 방식은 webroot 또는 manual 방식이다.
webroot는 nginx에 이미 약속된 /well-know 에 파일을 인증후 인증서를 발급해주는 방식이다.
manual는 let's encrypt에서 제공하는 script을 웹서버를 설치하는 서버에서 실행하는 방식이다.
dns는 네임서버에 저장되는 TXT레코드를 이용하는 방식이다.
필자는 dns 인증방식을 이용하여 , 자동 재발급하는 방법을 소개하려 한다.
플러그인 | 설명 | Challenge types (port) |
apache | Apache로 인증서를 얻고 설치하는 것을 자동화 | http-01 (80) |
nginx | Nginx로 증서를 얻고 설치하는 것을 자동화 | http-01 (80) |
webroot | 이미 실행중인 서버 '/.well-know/' 디렉토리 인증 | http-01 (80) |
standalone | 별도의 webserver을 별도로 띄워 인증 | http-01 (80) |
dns | DNS레코드(TXT) 이용하여 인증 | dns-01 (53) |
manual | 유효성 검사를 자동화 하는 스크립트 지정 가능 | http-01 (80) dns-01 (53) |
Challenge Type
- http-01 : 와일드카드 도메인 인증이 불가능
- dns-01 : 와일드카드 도메인 인증이 가능한 유일한 방법
Dns 인증방식 plugin
Godaddy와 같이 도메인을 구매한 사이트가 있을 것이다.
도메인을 구매하면, 네임서버를 설정하고, 도메인 레코드(A레코드, CNAME 레코드) 등을 설정한다.
dns 인증방식 Plugin은 위와 같은행위를 API로 대체한것이다. TXT레코드 값을 수정하기위함이다.
TXT 레코드는 `_acme-challenge.{domain}` 형태의 키와 인증기관이 제공하는 고유 문자열(토큰)이 저장된다.
이를 certbot이 인증서 발급시, 확인하여 소유권을 확인하는 것이다.
즉, 발급 또는 재발급시 DNS API를 호출하여 토큰을 수정하고, 이를 확인하는 절차를 거치게 된다.
스팅 업체 | 플러그인 |
AWS | certbot-dns-route53 |
GPC | certbot-dns-google |
Digitalocean | certbot-dns-digitalocean |
Cloudflare | certbot-dns-cloudflare |
아래 목록 이외 목록은 여기에서 확인해주세요.
CloudFlare DNS 적용
DNS Free 요금제와 DNS Plugin이 제공되어, CloudFlare을 사용한다.
1. CloudFlare NameServer 변경
CloudFlare 네임서버에 TXT 레코드를 변경 하는데,
서버가 다른 네임서버를 사용 중이라면, 사용중인 네임서버에서도 TXT 레코드가 수정되어야한다.
따라서, 서버가 CloudFlare의 네임서버를 사용하도록 하는 것이 좋다.
클라우드플레어로 네임서버 변경 하기
기존 네임서버를 클라우드 플레어(Cloudflare) 네임서버로 변경하는 방법입니다. 클라우드 플레어 기능 중 네임서버 이용은 무료로 제공되고 있습니다. 클라우드플레어 네임서버를 이용할 경우 htt
wonderbout.tistory.com
2. CloudFlare API Token 발급
API 토큰 발급은 아래와 같이 설정하면 된다.
1. Zone Resource > Select... > "도메인" 선택
2. Client IP > 서버IP
3. TTL은 설정하지 않은채 둔다.
3. Credential 생성
certbot이 작동하면서 설정된 디렉토리에서 토큰을 가져다 쓸 수 있도록 한다.
cloudflare 토큰을 넣고, 그냥 파일을 하나 만든다.
이후, certbot 설정에 디렉토리 위치를 설정값으로 주면 된다.
$ mkdir -p ./cloudflare
$ echo 'dns_cloudflare_api_token = "{{cloudflare_token}}"' > ./cloudflare/credentials
4. SSL/TLS 설정
cloudflare 무료 플랜에는 프록시 서비스가 제공된다.
즉, 브라우저가 나의 서버를 알기위해, cloudflare가 제공하는 네임서버를 통할 것이다.
또, 브라우저의 TCP 요청을 cloudflare 서버를 통해 나의 서버로 도달하도록 한다는 것이다.
이때, cloudflare 서버와 나의 서버 간의 통신에 대해 설정하는 것이다.
dns 인증까지 사용하여, ssl을 설정하는 것인 만큼, 엄격 설정으로 해도 무방하다.
가변 | Browser <-> Cloudflare // 구간만 HTTPS 암호화 Cloudflare <-> 서버 // 구간은 고려하지 않음 |
전체 | Browser <-> Cloudflare // 구간만 HTTPS 암호화 Cloudflare <-> 서버 // 구간도 HTTPS 암호화 |