할고래DO 에 HTTPS 를 적용하기 위해 Let's Encrypt 가 제공하는 인증서를 사용하였다. Let's Encrypt 가 제공하는 클라이언트 certbot
으로 아주 빠르게 HTTPS 적용을 할 수 있으며 무엇보다도 무료이다.
Nginx 와 함께 사용하는 법은 다음과 같다.
$ apt-get update
$ sudo apt-get install certbot
$ apt-get install python3-certbot-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
...
}
이제 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