[Server] DNS 등록 및 HTTPS 적용
Updated:
DNS $($Domain Name System)을 등록하고 Https를 프로젝트에 적용해 보도록 하겠습니다.
프로젝트 환경
- Ubuntu 18.04
- Nginx 1.1.4
DNS를 등록하기 위해서는 먼저 도메인을 발급받아야 합니다.
저는 가비아에서 .site
를 구매하였습니다. $($.shop이 500원으로 가장 저렴한 편입니다)
그 다음 가비아 DNS관리 → DNS 설정에 들어가서 레코드를 추가해 주었습니다.
www 호스트에 ip 주소값을 값/위치로 주어서 DNS 서버에 도메인과 ip를 연결시켜 주었습니다.
www를 붙이지 않고도 http://promisor.site
만으로 서비스에 접근할 수 있도록 호스트 값에 @를 주어 호스트를 공란으로 설정하였습니다.
터미널에서 sudo systemctl start nginx
로 nginx를 시작한 후 promisor.site로 접속하였더니 잘 접속되는 것을 확인할 수 있었습니다.
CA에 인증서 요청 및 발급
Let's Encrypt
CA를 등록하였습니다.
Let’s Encrypt 인증서를 자동으로 발급/갱신해 주는 봇인 Certbot
을 설치해 주었습니다.
Certbot 설치 전 사전 세팅을 위한 명령어를 입력해 주었습니다.
- apt-get 업데이트 :
sudo apt-get update
- 선행 소프트웨어 설치 :
sudo apt-get install software-properties-common
- 저장소 추가 :
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
사전 세팅을 마치고 Certbot을 설치해 주었습니다.
- certbot 설치 :
sudo apt-get install certbot
Certbot에서는 두 가지 인증 방식을 제공합니다.
-
Standalone
Let’s Encrypt 서버로부터 오는 도메인 인증 요청을 직접 받아서 처리하는 방식. 인증 받을 동안 nginx 서버를 중단해야 한다.
- 인증 요청 :
sudo certbot certonly —standalone -d http://promisor.site
- 도메인 명은 www를 제외하고 입력.
- systemctl nginx stop으로 서버 중단 시킨 후 인증 요청 수행
- Webroot
인증을 위한 Challege seed를 외부에서 접근 가능한 미리 약속된 경로$($/.well-known)에 위치시킨 뒤, Let’s Encrypt 서버가 해당 경로로 접속해 인증에 필요한 정보를 읽어가는 방식.
서버 중단 시킬 필요 없다.
Standalone 인증 방식을 선택하였으며 Cogratulation!이 나오면서 정상적으로 SSL 인증서가 발급 되었습니다.
❗Standalone 인증 방식 진행중에 No valid A recoreds found for ...
에러가 발생하였습니다.
이는 앞에서 진행한 DNS 설정에서 타입 A 레코드가 아직 적용되지 않았기 때문에 발생하는 에러였습니다.
DNS 설정에서 TTL(Time To Live)
는 사용자의 DNS 레코드 값을 서버가 캐시 하는 시간을 의미합니다.
앞서 TTL을 3600초로 설정하였기 때문에 최초 쿼리를 해서 응답 값을 가져오는데 1시간을 기다려야 합니다.
1시간을 기다린 후 다시 인증 방식을 진행하였더니 정상적으로 SSL 인증서를 발급 받을수 있었습니다.
TTL의 숫자가 낮을수록 전파 속도를 높일 수 있지만 네임 서버에 대한 쿼리 수를 증가시키기 때문에 서버 과부화를 초래할 수 있습니다.
반대로 TTL이 높을수록 DNS 서버가 받는 쿼리 부담은 줄지만 갱신 주기가 느려지기 때문에 IP가 변경되어 DNS에서 수정을 할 경우 전파되는 시간이 길어지는 문제가 있습니다. $($보통 3600을 권장)
도메인을 최초 쿼리해서 가져온 응답값은 DNS서버나 사용자 PC의 캐쉬에 3600초를 시작으로 매초 마다 시간이 감소 되다 0이 되면 메모리에서 사라집니다. 그 다음 DNS서버에 IP 쿼리를 수행하는 작업이 반복됩니다.
Server에 인증서 등록
- /etc/nginx/sites-available 경로로 이동
- sudo vi default
- 발급받은 인증서 정보 등록
- http 기본 포트 : 80
http://promisor.site
→ 80번 포트로 접속
- https 기본 포트 : 443
https://promisor.site
→ 443 포트로 접속
- http 기본 포트 : 80
80번 포트로 요청이 들어오면 https 443 포트로 redirect$($301) 되도록 서버블록을 설정하였습니다.
ssl_certificate
- chain.pem : Let’s Encrypt의 중간 인증서
ssl_certificate_key
- 인증서의 private key
systemctl start nginx
를 통해 nginx 서버를 다시 실행한 다음 도메인에 접속하면 https가 적용된것을 확인할 수 있습니다.
참고 자료 📚
Leave a comment