본문 바로가기

mkcert를 이용한 로컬에서 HTTPS 서버 만들기

mkcert를 이용한 로컬에서 HTTPS 서버 만들기
로컬 환경(localhost)에서 인증서를 생성하고, 인증서를 이용해 HTTPS 서버 만들기

 

HTTPS 사설 인증서 발급 및 서버 구현

 

현업에서는 HTTPS 프로토콜을 사용하는 것이 일반적이고, 특히 HTTPS 프로토콜은 인증의 중요한 부분을 차지하기 때문에, 이번 포스팅에서는 직접 HTTPS 서버를 만들어 보겠다.

 

설치

mkcert라는 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다.

 

Ubuntu

우분투의 경우 다음 명령어를 이용해 설치한다.

$ sudo apt install libnss3-tools
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

 

macOS

macOS 사용자의 경우, Homebrew를 통해 mkcert를 설치할 수 있다.

$ brew install mkcert

# firefox를 사용할 경우 필요에 따라 설치해주세요.
$ brew install nss

 

인증서 생성

먼저 다음 명령어를 통해 로컬을 인증된 발급기관으로 추가해야 한다.

$ mkcert -install

 

다음은 로컬 환경에 대한 인증서를 만들어야 한다. localhost로 대표되는 로컬 환경에 대한 인증서를 만들려면 다음 명령어를 입력한다.

$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

 

이제 옵션으로 추가한 localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서가 완성되었다.

  • cert.pem, key.pem이라는 파일이 생성된 것을 확인할 수 있다.
  • 저장 경로를 반드시 확인하자.
  • 인증서는 공개키, 그리고 인증기관의 서명을 포함하고 있으므로 공개되어도 상관이 없지만, key.pem의 경우 개인 키이므로 git에 커밋하지 않고, 암호처럼 다루어야 한다.

 

 key와 cert이란

key와 cert는 모두 암호화와 보안에 관련된 용어이다.

  • Key는 보통 암호화 및 복호화를 위한 비밀번호나 암호화 키를 말한다.
    • 이는 대칭키 암호화 방식 또는 공개키 암호화 방식에서 사용된다.
    • 대칭키 암호화에서는 하나의 비밀키가 암호화 및 복호화에 사용되며, 공개키 암호화에서는 공개키와 비밀키 쌍이 사용된다.
  • 반면 Cert는 인증서를 나타내며, 공개키 인프라(PKI)에서 사용된다.
    • 인증서는 일반적으로 SSL/TLS 연결에서 사용된다.
    • SSL/TLS 연결은 인터넷에서 정보를 안전하게 전송하기 위해 사용되며, 이러한 연결에서는 대개 서버가 자신의 공개키를 제공하고 클라이언트는 이를 사용하여 연결을 안전하게 유지한다.
    • 이 공개키는 인증서에서 사용된다.

 

HTTPS 서버 작성

 

Node.js 환경에서 HTTPS 서버를 작성하기 위해서는 https 내장 모듈을 이용할 수 있다. express.js를 이용해 https 서버를 만들 수도 있다. 먼저는 방금 생성한 인증서 파일들을 HTTPS 서버에 적용해 주는 작업이 필요하다.

 

Node.js https 모듈 이용

const https = require('https');
const fs = require('fs');

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    function (req, res) {
      res.write('Congrats! You made https server now :)');
      res.end();
    }
  )
  .listen(3001);

이제 서버를 실행한 후 https://localhost:3001로 접속하면 브라우저의 url 창 왼쪽에 자물쇠가 잠겨있는 HTTPS 프로토콜을 이용한다는 것을 알 수 있다!

 

express.js 이용

만약 express.js를 사용하는 경우, 다음과 같이 https.createServer의 두 번째 파라미터에 들어갈 callback 함수를 Express 미들웨어로 교체하면 된다!

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    app.use('/', (req, res) => {
      res.send('Congrats! You made https server now :)');
    })
  )
  .listen(3001);

 

728x90
⬆︎