이미 만들어져 있는 nginx, express 환경을 HTTPS로 만들어야 해서 시도한 과정을 소개한다.

Nginx HTTPS로 만들기

HTTPS는 도메인 주소가 있어야지 사용할 수 있다. 다행히도 무료로 도메인 주소를 주는 사이트가 있어서(https://www.freenom.com/) 여기에서 도메인을 얻은 다음 진행했다.

또한 HTTPS 인증서를 쉽게 발급받을 수 있게 도와주는 사이트가 있어서 사용했다. https://certbot.eff.org/에 들어가서 Nginx, Ubuntu16을 선택했다. 여기에 나와있는 과정을 완료하면 Nginx에 HTTPS가 적용될것이다.

7번의 Nginx 옵션 부분에서는 자동 설정 (sudo certbot --nginx)을 사용했다.

express HTTPS로 만들기

기존에 express와 httpServer로 이루어진 부분을 바꿔줘야 했다. https를 적용시키려면 인증서가 필요했는데 Nginx와 express가 같은 서버에서 돌아가고 있어서 Nginx 할 때 발급받은 인증서를 사용했다.

먼저 Nginx에 사용한 인증서가 어디에 저장되어있는지 살펴보기 위해서 Nginx의 설정파일을 찾았다.

/etc/nginx/sites-available/default 파일에서 찾을 수 있었다. 밑에 쭉 내려가다 보면 인증서 위치를 확인할 수 있었다

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
**ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/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

이제 위치를 알았으나 해야 할 일이 있다.

파일 권한 바꾸기

권한 문제로 node에서 저 폴더에 접근하지 못하기 때문에 권한 설정을 해줘야 한다. 권한 설정은 https://stackoverflow.com/a/54903098 답변의 맨 마지막인 4번째 답변을 참고했다. 참고로 저렇게 해도 권한 설정이 안 되어서 다른곳(https://github.com/certbot/certbot/issues/5257#issue-276014624)을 찾아봤고 결국 우리가 실행시켜야 할 명령어는 이거다

sudo addgroup nodecert
sudo adduser nodeuser nodecert
sudo adduser root nodecert

sudo chgrp -R nodecert /etc/letsencrypt/live
sudo chgrp -R nodecert /etc/letsencrypt/archive

chmod -R 755 /etc/letsencrypt/live/
chmod -R 755 /etc/letsencrypt/archive/

위의 명령어는 당신이 지금 nodeuser 사용자로 로그인 했다는 가정하에 쓰여졌다. nodecert라는 그룹을 추가해서 폴더의 권한 설정을 바꿔준다.

express에 적용

HTTP 코드

// app은 express
server = http.createServer(app)