Makefile과 mkcert로 TLS 인증서 생성하기

웹 개발이나 테스트 환경에서 HTTPS는 필수적입니다. 특히 최신 브라우저 보안 정책 때문에 쿠키나 API 호출 등 많은 기능이 HTTPS를 요구합니다. 하지만 공인 인증서를 발급받는 과정은 비용과 도메인 소유 인증 절차 때문에 번거롭습니다. 이런 경우에는 mkcert를 사용해 간편하게 TLS 인증서를 생성하는 것이 효과적입니다.

Kubernetes 환경에서는 cert-manager를 통해 인증서를 자동으로 관리할 수 있습니다. 그러나 애플리케이션을 삭제하고 재배포할 때 기존 인증서를 재사용하지 않고 새로운 인증서를 발급받게 되어, 인증서 관리가 복잡해질 수 있습니다. 이로 인해 애플리케이션 배포 과정에서 불필요한 인증서 갱신이 발생하고, 관련 설정을 다시 배포해야 하는 문제가 생길 수 있습니다.

이번 글에서는 Makefile을 활용하여 mkcert를 설치하고, TLS 인증서를 쉽게 생성하는 방법을 알아보겠습니다. Makefile에 대한 전체 구성을 바로 보려면 하단 “7. Makefile 전체 구성"으로 이동하면 됩니다. 이 Makefile을 실행하려면 사용자가 **sudo 권한(sudoer)**을 가지고 있어야 합니다.

1. Makefile 환경 설정

다음과 같이 인증서 생성을 위해 Makefile 환경을 설정합니다.

.PHONY: deps install root-ca cert help

ARCH := $(shell uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
CAROOT := ./root-ca
  • .PHONY로 정의된 타겟들은 실제 파일과 관계없이 항상 실행되도록 설정했습니다.
  • ARCH 변수는 현재 시스템 아키텍처를 자동으로 감지하여 mkcert 다운로드 파일명을 결정하는 데 사용됩니다.
  • CAROOT는 루트 인증서가 저장될 디렉토리를 지정합니다.

2. 시스템 의존성 설치

mkcert를 사용하기 위해서는 일부 시스템 라이브러리가 필요합니다. Makefile에서 deps 타겟은 이 과정을 자동으로 처리합니다.

deps:  ## Install required system dependencies (e.g. libnss3-tools)
	sudo apt-get update -qq
	sudo apt-get install -y libnss3-tools

위 명령은 Ubuntu 환경을 기준으로 libnss3-tools를 설치합니다. 이는 mkcert가 로컬 브라우저 신뢰 저장소에 인증서를 등록하는 데 필요한 도구입니다.

3. mkcert 설치

install 타겟을 실행하면 mkcert 바이너리를 다운로드하고 /usr/local/bin에 설치합니다.

install: deps  ## Download mkcert binary and install to /usr/local/bin
	VERSION=v1.4.3 && \
	FILE=mkcert-$$VERSION-linux-$(ARCH) && \
	echo "Downloading $$FILE..." && \
	curl -L https://github.com/FiloSottile/mkcert/releases/download/$$VERSION/$$FILE -o mkcert && \
	chmod +x mkcert && \
	sudo mv mkcert /usr/local/bin/mkcert
  • 시스템 아키텍처(x86_64, aarch64 등)를 자동으로 감지하여 올바른 바이너리를 다운로드합니다.

4. 루트 인증서 생성 및 설치

mkcert를 사용하려면 먼저 루트 인증서를 생성해야 합니다. 이를 위해 root-ca 타겟을 사용합니다.

root-ca: ## Generate root CA for mkcert
	mkdir -p $(CAROOT) && \
	CAROOT=$(CAROOT) mkcert -install && \
	sudo cp $(CAROOT)/rootCA.pem /usr/local/share/ca-certificates/mkcert-rootCA.crt && \
	sudo update-ca-certificates
  • 생성된 루트 인증서는 시스템에 등록되어, 브라우저에서 로컬 인증서를 신뢰할 수 있게 됩니다.
  • 다른 서버나 로컬 환경에서는 이 루트 인증서를 복사하여 시스템 인증 저장소에 등록해야 합니다.

5. 로컬 TLS 인증서 생성

마지막으로 cert 타겟을 통해 실제 TLS 인증서를 생성할 수 있습니다.

cert: ## Generate local TLS certificates using mkcert
	mkdir -p ./tls; \
	CAROOT=$(CAROOT) mkcert \
	    -cert-file ./tls/tls.crt -key-file ./tls/tls.key \
		cnap.dev "*.cnap" local "*.local"
  • 실행 후 ./tls 디렉토리에 tls.crttls.key 파일이 생성됩니다.
  • 발급된 인증서는 cnap.dev, 모든 *.cnap 도메인, local, *.local 도메인에서 사용 가능합니다.

6. 사용 가능한 타겟 확인

Makefile에는 help 타겟이 포함되어 있어, 작성된 타겟과 설명을 확인할 수 있습니다.

help: ## Show available targets and descriptions
	@echo "Usage: make <target>"
	@echo ""
	@echo "Targets:"
	@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
		| sort \
		| awk -F ':.*?## ' '{printf "  %-20s %s\n", $$1, $$2}'
  • 터미널에서 make help를 실행하면 다음과 같이 안내가 출력됩니다.
Usage: make <target>

Targets:
  deps                 Install required system dependencies (e.g. libnss3-tools)
  install              Download mkcert binary and install to /usr/local/bin
  root-ca              Generate root CA for mkcert
  cert                 Generate local TLS certificates using mkcert
  help                 Show available targets and descriptions

7. Makefile 전체 구성

앞서 다룬 내용을 하나로 묶어 완성된 Makefile입니다.

.PHONY: deps install root-ca cert help

ARCH := $(shell uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
CAROOT := ./root-ca

deps:  ## Install required system dependencies (e.g. libnss3-tools)
	sudo apt-get update -qq
	sudo apt-get install -y libnss3-tools

install: deps  ## Download mkcert binary and install to /usr/local/bin
	VERSION=v1.4.3 && \
	FILE=mkcert-$$VERSION-linux-$(ARCH) && \
	echo "Downloading $$FILE..." && \
	curl -L https://github.com/FiloSottile/mkcert/releases/download/$$VERSION/$$FILE -o mkcert && \
	chmod +x mkcert && \
	sudo mv mkcert /usr/local/bin/mkcert

root-ca: ## Generate root CA for mkcert
	mkdir -p $(CAROOT) && \
	CAROOT=$(CAROOT) mkcert -install && \
	sudo cp $(CAROOT)/rootCA.pem /usr/local/share/ca-certificates/mkcert-rootCA.crt && \
	sudo update-ca-certificates

cert: ## Generate local TLS certificates using mkcert
	mkdir -p ./tls; \
	CAROOT=$(CAROOT) mkcert \
	-cert-file ./tls/tls.crt -key-file ./tls/tls.key \
	cnap.dev "*.cnap" local "*.local"

help: ## Show available targets and descriptions
	@echo "Usage: make <target>"
	@echo ""
	@echo "Targets:"
	@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
		| sort \
		| awk -F ':.*?## ' '{printf "  %-20s %s\n", $$1, $$2}'

8. 마무리

이번 글에서는 Makefile을 활용해 mkcert 설치부터 루트 인증서 생성, TLS 인증서 발급까지 자동화하는 방법을 살펴보았습니다.

  • 간단한 설치: make install 한 번으로 mkcert 설치 가능
  • 자동화된 루트 CA 생성: make root-ca로 시스템에 신뢰된 루트 인증서 등록
  • 편리한 로컬 인증서 생성: make cert로 개발용 TLS 인증서 발급

이 Makefile을 사용하면 매번 복잡한 mkcert 명령어를 입력할 필요 없이, TLS 인증서를 손쉽게 발급하여 개발이나 테스트 환경에 적용할 수 있습니다.