Let's Encrypt 로 간편하게 HTTPS 적용하기

shkilo·2021년 2월 21일
0

할고래DO 에 HTTPS 를 적용하기 위해 Let's Encrypt 가 제공하는 인증서를 사용하였다. Let's Encrypt 가 제공하는 클라이언트 certbot 으로 아주 빠르게 HTTPS 적용을 할 수 있으며 무엇보다도 무료이다.

Nginx 와 함께 사용하는 법은 다음과 같다.

certbot 설치

$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python3-certbot-nginx

인증서 획득 및 nginx 자동 설정

$ sudo certbot --nginx -d halgoraedo.kro.kr  

halgoraedo.kro.kr 도메인에 대해 인증서를 발급하고 ssl/tls 관련 nginx 설정을 해주는 커맨드이다. 성공적으로 실행되었다면 -
기존 /etc/nginx/conf.d/halgoraedo.kro.kr.conf 에서

...

server {
        server_name halgoraedo.kro.kr;
        location / {
                proxy_pass http://frontend;
        }
	listen 80;
        ...
}

다음과 같이 변경됨을 확인할 수 있다.

...
server {
        server_name halgoraedo.kro.kr;
        location / {
                proxy_pass http://frontend;
        }
	listen 80;
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/halgoraedo.kro.kr/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/halgoraedo.kro.kr/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
        ...
}
  • ssl_certificate: 인증서
  • ssl_certificate_key: 서버쪽 비공개키
  • options-ssl-nginx.conf: ssl 최적화 및 기타 설정
  • ssl_dhparam: 참고

이제 nginx를 재시작하고 AWS ec2의 443 포트를 열어주면 https 적용이 완료된다.

인증서 자동 갱신

Let's Encrypt 에서 제공하는 인증서는 유효기간이 90일이기 때문에 매번 갱신을 해줘야 한다. crontab 을 이용해 자동화한다.

sudo crontab -e 로 crontab 파일을 열고 다음 내용을 추가한다. sudo 를 붙이면 root 유저의 crontab 파일을 편집한다. (service 커맨드 권한을 위해)

0 12 * * 1 /usr/bin/certbot renew --quiet --post-hook "service nginx reload"

매주 일요일 12시에 renew 후에 nginx를 reload 해라는 뜻

적용 이후 겪은 문제점

기존에는 API 요청을 ec2 기본 도메인(http://ec2-어쩌구)으로 했다. https가 적용된 후에는 css import 혹은 CORS 요청 등을 http로 하려고 하면 브라우저가 거부하기 때문에 문제가 된다!

리버스 프록시를 적용하여 해결하였다. 프록시 - API 서버간 통신에도 https를 적용하면 좋겟지만 그것은 다음 기회에..

참고

https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#example
http://nginx.org/en/docs/http/configuring_https_servers.html#optimization
https://certbot.eff.org/docs/using.html?highlight=renew#renewing-certificates
https://askubuntu.com/questions/173924/how-to-run-a-cron-job-using-the-sudo-command

0개의 댓글