[TIL] 24.12.17 TUE

GDORI·2024년 12월 17일
0

TIL

목록 보기
135/143
post-thumbnail

인증서 Node.js 서버에 설치하고 도커 배포

지난번에 친구의 부탁으로 간단한 API 서버를 만들어주었는데, 아이폰의 경우 https가 아니면 통신 자체가 안된다고 하여
인증서를 설치하였다.
Nginx 서버에 인증서 설치
위의 링크에 있는 TIL에서 Nginx에 인증서를 설치하는법을 다뤘었는데, 이번에는 Nginx를 이용하지 않고 Node.js 서버에
바로 적용 해 보았다.

Certbot 인증서 발급

무료 인증서인 Let's Encrypt를 발급받기 위하여 서트봇을 사용하는 것은 지난 게시물에서도 다뤘었다.
다만, Nginx 서버가 없는 상태이기 때문에 Standalone 모드를 사용하여 Certbot이 자체 서버를 통하여 80포트로
인증할 수 있도록 지정할 수 있다.

sudo apt update
sudo apt install certbot
sudo certbot certonly --standalone -d 당신의 도메인

인증서 발급이 완료되면, 밑의 위치에 저장되게 된다.

인증서 파일: /etc/letsencrypt/live/example.com/fullchain.pem
개인 키 파일: /etc/letsencrypt/live/example.com/privkey.pem

Node.js 서버 파일 수정

const app = express();

// SSL 인증서 파일 경로 설정
const sslOptions = {
  key: fs.readFileSync(config.auth.key), // 개인 키 파일
  cert: fs.readFileSync(config.auth.cert), // 인증서 파일
};

app.use(express.json());
app.use("/", router);
app.use(errorHandlingMiddleware);

// 서버 초기화
initServer().then(() => {
  https.createServer(sslOptions, app).listen(config.server.port, () => {
    console.log(`${config.server.port} 포트로 HTTPS 서버가 열렸어요!`);
  });
});

나의 경우 인증서 파일 위치를 .env로 관리하기 때문에 위에처럼 되어있지만 config.auth.*** 대신에 위에 명시된
경로를 입력해주면 된다.
안전을 위해 경로를 바꾸고 환경변수로 관리하면 좋을 것 같다.

도커 환경에서 실행방법

docker run -d \
  -p <당신의 Node.js 서버포트>:<당신의 Node.js 서버포트> \
  -v /etc/letsencrypt/live/<당신의 도메인>:/etc/letsencrypt/live/<당신의 도메인>:ro \
  -v /etc/letsencrypt/archive/<당신의 도메인>:/etc/letsencrypt/archive/<당신의 도메인>:ro \
  --name <지정할 컨테이너 이름> <도커이미지명>

만약 도커를 사용한다면 도커 컨테이너와 호스트의 인증서 디렉토리를 공유하기 위하여 위와 같이 마운트 시키면 된다.

인증서 발급할 때 순간 안돼서 당황했지만,

인증서 발급받을 때 aws 또는 gcp 등의 클라우드 환경을 쓰고 있거나 개인 방화벽을 사용하는 경우 80포트를 임시적으로
열어주어야 인증을 받고 인증서를 발급받을 수 있다.
친구한테 제공해주는 API 서버의 경우 80포트를 사용하지 않고 특정 포트를 사용하기 때문에 80포트는 다시 차단했다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글