현재 진행하고 있는 부스트캠프 그룹 프로젝트에서 API 서버의 루트 도메인으로 app을 사용하고 있습니다. 그런데 app 루트 도메인은 모든 연결에 HTTPS를 요구한다고 합니다. HTTPS를 사용하게 되면 보안이 강화되기 때문에 API 서버에 HTTPS를 적용해봤습니다!
(이미지 출처)
우선 Let's Encrypt에서도 권장하고 있는 certbot을 사용해서 X.509 인증서를 발급받았습니다. 서버 환경은 Ubuntu 20.04 입니다. 또한 DV 인증서만 발급해주기 때문에 도메인을 하나 소유하고 있어야 합니다.
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx
웹 서버로 Nginx를 사용하고 있다면 nginx 옵션을 적용해서 인증서를 발급받으면 됩니다.
sudo certbot certonly --standalone
웹 서버를 사용하지 않는다면, 인증서를 발급받기 위해서는 standalone 옵션을 사용해야 합니다. 또한 standalone 옵션은 80번 포트로 가상의 웹 서버를 띄워서 인증서를 발급 받습니다. 따라서 80번 포트를 사용하고 있는 서버가 있다면 종료해야 합니다.
// curl -k https://localhost:8000/
const https = require('node:https');
const fs = require('node:fs');
const options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem'),
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
위와 같이 Node.js 환경에서 https 모듈을 활용해서 어플리케이션 서버에서도 직접 HTTPS를 적용할 수 있습니다.
Nginx, Standalone 방식 외에도 다양한 방식들을 지원하니 궁금하신 분들은 Certbot 홈페이지를 참고하시면 좋을 것 같습니다.
이제 약관들이 나오면 이에 동의하시고, 본인이 현재 소유 중인 도메인 이름을 입력하면 됩니다. 정상적으로 발급이 되었다면 /etc/letsencrypt/live/[도메인 이름] 경로에 cert.pem, chain.pem, fullchain.pem, privkey.pem 파일이 생성된 것을 확인할 수 있습니다.